All checks were successful
Create and publish a Docker image 🚀 / build-and-push-image (push) Successful in 1m11s
103 lines
2.0 KiB
Go
103 lines
2.0 KiB
Go
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))
|
|
}
|