7 Commits

Author SHA1 Message Date
Smile Rex
8ae941df3b fix
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m15s
2026-01-22 17:45:11 +03:00
Smile Rex
73cb832728 add logs
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m11s
2026-01-22 17:31:55 +03:00
Smile Rex
4e04de5581 new arch
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m11s
2026-01-22 16:34:47 +03:00
68ba9bb2e2 Merge pull request 'fix' (#5) from feauture into main
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m11s
Reviewed-on: #5
2026-01-22 10:01:36 +03:00
2fd959255d Merge pull request 'add log' (#4) from feauture into main
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m17s
Reviewed-on: #4
2026-01-22 09:32:09 +03:00
49d6fb9815 Merge pull request 'feauture' (#3) from feauture into main
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m9s
Reviewed-on: #3
2026-01-21 19:15:19 +03:00
dde276f22f Merge pull request 'new server' (#2) from feauture into main
All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m4s
Reviewed-on: #2
2026-01-21 18:49:43 +03:00
7 changed files with 50 additions and 32 deletions

29
main.go
View File

@@ -4,6 +4,8 @@ import (
"fmt" "fmt"
"log" "log"
"net/http" "net/http"
"server/src/controllers"
"server/src/models"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
) )
@@ -12,20 +14,23 @@ var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true }, CheckOrigin: func(r *http.Request) bool { return true },
} }
func ServeWS(room *Room, w http.ResponseWriter, r *http.Request) { func ServeWS(room *controllers.Room, w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil) conn, err := upgrader.Upgrade(w, r, nil)
if err != nil { if err != nil {
log.Println("Failed to upgrade connection:", err)
return return
} }
var auth AuthMessage var auth models.AuthMessage
if err := conn.ReadJSON(&auth); err != nil || auth.Type != "auth" { if err := conn.ReadJSON(&auth); err != nil || auth.Type != "auth" {
log.Println("Invalid auth message. Connection closed!")
conn.Close() conn.Close()
return return
} }
data, err := VerifyTelegramInitData(auth.InitData, "7697757472:AAESD9HfkWwbIZe-HXR7IazUShr69hZTLmE") data, err := controllers.VerifyTelegramInitData(auth.InitData, "7697757472:AAESD9HfkWwbIZe-HXR7IazUShr69hZTLmE")
if err != nil { if err != nil {
log.Println("initData is empty. Connection closed!")
conn.Close() conn.Close()
return return
} }
@@ -39,7 +44,7 @@ func ServeWS(room *Room, w http.ResponseWriter, r *http.Request) {
log.Printf("Player %d connected!", userID) log.Printf("Player %d connected!", userID)
player := &Player{ player := &models.Player{
ID: userID, ID: userID,
Username: username, Username: username,
Conn: conn, Conn: conn,
@@ -59,26 +64,32 @@ func ServeWS(room *Room, w http.ResponseWriter, r *http.Request) {
go readLoop(room, player) go readLoop(room, player)
} }
func readLoop(room *Room, player *Player) { func readLoop(room *controllers.Room, player *models.Player) {
defer func() { defer func() {
log.Printf("Player %d disconnected!", player.ID)
delete(room.Players, player.ID) delete(room.Players, player.ID)
player.Conn.Close() player.Conn.Close()
}() }()
for { for {
var msg InputMessage var msg models.StateMessage
err := player.Conn.ReadJSON(&msg) err := player.Conn.ReadJSON(&msg)
if err != nil { if err != nil {
return return
} }
msg.PlayerID = player.ID switch msg.Type {
room.Input <- msg case models.InputMsgType:
var input models.InputMessage = msg.Payload.(models.InputMessage)
player.X = input.DX
player.Y = input.DY
room.Input <- input
}
} }
} }
func main() { func main() {
room := NewRoom() room := controllers.NewRoom()
go room.Run() go room.Run()

View File

@@ -1,12 +0,0 @@
package main
type InputMessage struct {
PlayerID int64
DX float64 `json:"dx"`
DY float64 `json:"dy"`
}
type StateMessage struct {
Type string `json:"type"`
Payload any `json:"payload"`
}

View File

@@ -1,25 +1,25 @@
package main package controllers
import ( import (
"server/src/models"
"sync" "sync"
"time" "time"
) )
type Room struct { type Room struct {
Players map[int64]*Player Players map[int64]*models.Player
Input chan InputMessage Input chan models.InputMessage
mu sync.Mutex mu sync.Mutex
} }
func NewRoom() *Room { func NewRoom() *Room {
return &Room{ return &Room{
Players: make(map[int64]*Player), Players: make(map[int64]*models.Player),
Input: make(chan InputMessage, 128), Input: make(chan models.InputMessage, 128),
} }
} }
func (r *Room) update() { func (r *Room) update() {
// 1⃣ обрабатываем input
for { for {
select { select {
case input := <-r.Input: case input := <-r.Input:
@@ -59,8 +59,8 @@ func (r *Room) broadcast() {
r.mu.Unlock() r.mu.Unlock()
msg := StateMessage{ msg := models.StateMessage{
Type: "state", Type: "input",
Payload: map[string]any{ Payload: map[string]any{
"players": state, "players": state,
}, },

View File

@@ -1,4 +1,4 @@
package main package controllers
import ( import (
"time" "time"

View File

@@ -1,4 +1,4 @@
package main package models
type AuthMessage struct { type AuthMessage struct {
Type string `json:"type"` Type string `json:"type"`

View File

@@ -1,4 +1,4 @@
package main package models
import ( import (
"github.com/gorilla/websocket" "github.com/gorilla/websocket"

19
src/models/protocol.go Normal file
View File

@@ -0,0 +1,19 @@
package models
type MsgType string
const (
InputMsgType MsgType = "input"
ChatMsgType MsgType = "chat"
)
type InputMessage struct {
PlayerID int64
DX float64 `json:"dx"`
DY float64 `json:"dy"`
}
type StateMessage struct {
Type MsgType `json:"type"`
Payload any `json:"payload"`
}