From b7d33889fd503cec8ee1065332ce142c6c4a6fb7 Mon Sep 17 00:00:00 2001 From: Smile Rex Date: Thu, 22 Jan 2026 10:01:15 +0300 Subject: [PATCH] fix --- go.mod | 5 ++++- go.sum | 2 ++ main.go | 27 ++++++++++++++------------- player.go | 2 +- protocol.go | 2 +- room.go | 6 +++--- telegram.go | 43 +++++++++---------------------------------- 7 files changed, 34 insertions(+), 53 deletions(-) diff --git a/go.mod b/go.mod index 4e0ef13..cc6ef3c 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module server go 1.25.0 -require github.com/gorilla/websocket v1.5.3 +require ( + github.com/gorilla/websocket v1.5.3 + github.com/telegram-mini-apps/init-data-golang v1.5.0 +) diff --git a/go.sum b/go.sum index 25a9fc4..eef3d44 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/telegram-mini-apps/init-data-golang v1.5.0 h1:rtpsmQ/nihkicPvnrdRXmHHtTnPvG1FmxMRZJwMKPz0= +github.com/telegram-mini-apps/init-data-golang v1.5.0/go.mod h1:GG4HnRx9ocjD4MjjzOw7gf9Ptm0NvFbDr5xqnfFOYuY= diff --git a/main.go b/main.go index 2f7766d..f302ef7 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "net/http" @@ -23,24 +24,21 @@ func ServeWS(room *Room, w http.ResponseWriter, r *http.Request) { return } - data, ok := VerifyTelegramInitData(auth.InitData, "7697757472:AAESD9HfkWwbIZe-HXR7IazUShr69hZTLmE") - if !ok { + data, err := VerifyTelegramInitData(auth.InitData, "7697757472:AAESD9HfkWwbIZe-HXR7IazUShr69hZTLmE") + if err != nil { conn.Close() return } - log.Println("Client connected! \ninitData: ", data) - - userID := data["user.id"] - username := data["user.username"] + userID := data.User.ID + username := data.User.Username if username == "" { - username = data["user.first_name"] - } - if username == "" { - username = "user_" + userID + username = data.User.FirstName } + log.Printf("Player %d connected!", userID) + player := &Player{ ID: userID, Username: username, @@ -54,7 +52,7 @@ func ServeWS(room *Room, w http.ResponseWriter, r *http.Request) { player.Conn.WriteJSON(map[string]any{ "type": "init", "payload": map[string]string{ - "id": player.ID, + "id": fmt.Sprintf("%d", player.ID), }, }) @@ -62,12 +60,15 @@ func ServeWS(room *Room, w http.ResponseWriter, r *http.Request) { } func readLoop(room *Room, player *Player) { + defer func() { + delete(room.Players, player.ID) + player.Conn.Close() + }() + for { var msg InputMessage err := player.Conn.ReadJSON(&msg) if err != nil { - delete(room.Players, player.ID) - player.Conn.Close() return } diff --git a/player.go b/player.go index fad4aba..cba4030 100644 --- a/player.go +++ b/player.go @@ -5,7 +5,7 @@ import ( ) type Player struct { - ID string + ID int64 Username string Conn *websocket.Conn diff --git a/protocol.go b/protocol.go index a7ed0ee..cf3754e 100644 --- a/protocol.go +++ b/protocol.go @@ -1,7 +1,7 @@ package main type InputMessage struct { - PlayerID string + PlayerID int64 DX float64 `json:"dx"` DY float64 `json:"dy"` } diff --git a/room.go b/room.go index fb22351..750aa78 100644 --- a/room.go +++ b/room.go @@ -6,14 +6,14 @@ import ( ) type Room struct { - Players map[string]*Player + Players map[int64]*Player Input chan InputMessage mu sync.Mutex } func NewRoom() *Room { return &Room{ - Players: make(map[string]*Player), + Players: make(map[int64]*Player), Input: make(chan InputMessage, 128), } } @@ -48,7 +48,7 @@ DONE: func (r *Room) broadcast() { r.mu.Lock() - state := make(map[string]map[string]any, len(r.Players)) + state := make(map[int64]map[string]any, len(r.Players)) for id, p := range r.Players { state[id] = map[string]any{ "x": p.X, diff --git a/telegram.go b/telegram.go index 7b08809..70519b6 100644 --- a/telegram.go +++ b/telegram.go @@ -1,41 +1,16 @@ package main import ( - "crypto/hmac" - "crypto/sha256" - "encoding/hex" - "net/url" - "sort" - "strings" + "time" + + initdata "github.com/telegram-mini-apps/init-data-golang" ) -func VerifyTelegramInitData(initData, botToken string) (map[string]string, bool) { - values, _ := url.ParseQuery(initData) - - hash := values.Get("hash") - values.Del("hash") - - var data []string - for k, v := range values { - data = append(data, k+"="+v[0]) +func VerifyTelegramInitData(initData, botToken string) (initdata.InitData, error) { + expIn := 24 * time.Hour + err := initdata.Validate(initData, botToken, expIn) + if err != nil { + return initdata.InitData{}, err } - sort.Strings(data) - - checkString := strings.Join(data, "\n") - - secret := sha256.Sum256([]byte(botToken)) - h := hmac.New(sha256.New, secret[:]) - h.Write([]byte(checkString)) - - expected := hex.EncodeToString(h.Sum(nil)) - - return valuesToMap(values), expected == hash -} - -func valuesToMap(v url.Values) map[string]string { - m := make(map[string]string) - for k, val := range v { - m[k] = val[0] - } - return m + return initdata.Parse(initData) }