package main import ( "fmt" "log" "net/http" "server/src/controllers" "server/src/models" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func ServeWS(room *controllers.Room, w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Failed to upgrade connection:", err) return } var auth models.AuthMessage if err := conn.ReadJSON(&auth); err != nil || auth.Type != "auth" { log.Println("Invalid auth message. Connection closed!") conn.Close() return } data, err := controllers.VerifyTelegramInitData(auth.InitData, "7697757472:AAESD9HfkWwbIZe-HXR7IazUShr69hZTLmE") if err != nil { log.Println("initData is empty. Connection closed!") conn.Close() return } userID := data.User.ID username := data.User.Username if username == "" { username = data.User.FirstName } log.Printf("Player %d connected!", userID) player := &models.Player{ ID: userID, Username: username, Conn: conn, X: 180, Y: 320, } room.Players[player.ID] = player player.Conn.WriteJSON(map[string]any{ "type": "init", "payload": map[string]string{ "id": fmt.Sprintf("%d", player.ID), }, }) go readLoop(room, player) } func readLoop(room *controllers.Room, player *models.Player) { defer func() { log.Printf("Player %d disconnected!", player.ID) delete(room.Players, player.ID) player.Conn.Close() }() for { var msg models.StateMessage err := player.Conn.ReadJSON(&msg) if err != nil { return } switch msg.Type { case models.InputMsgType: var input models.InputMessage = msg.Payload.(models.InputMessage) player.X = input.DX player.Y = input.DY room.Input <- input } } } func main() { room := controllers.NewRoom() go room.Run() http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { ServeWS(room, w, r) }) log.Println("Server started on :8080") log.Fatal(http.ListenAndServe(":8080", nil)) }