Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ae941df3b | ||
|
|
73cb832728 | ||
|
|
4e04de5581 | ||
| 68ba9bb2e2 | |||
| 2fd959255d | |||
| 49d6fb9815 | |||
| dde276f22f |
29
main.go
29
main.go
@@ -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()
|
||||||
|
|
||||||
|
|||||||
12
protocol.go
12
protocol.go
@@ -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"`
|
|
||||||
}
|
|
||||||
@@ -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,
|
||||||
},
|
},
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package main
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package main
|
package models
|
||||||
|
|
||||||
type AuthMessage struct {
|
type AuthMessage struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
@@ -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
19
src/models/protocol.go
Normal 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"`
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user