diff options
Diffstat (limited to 'backend/game')
| -rw-r--r-- | backend/game/client.go | 5 | ||||
| -rw-r--r-- | backend/game/http.go | 9 | ||||
| -rw-r--r-- | backend/game/hub.go | 28 | ||||
| -rw-r--r-- | backend/game/message.go | 12 | ||||
| -rw-r--r-- | backend/game/ws.go | 3 |
5 files changed, 51 insertions, 6 deletions
diff --git a/backend/game/client.go b/backend/game/client.go index 7cd66a4..fa699ce 100644 --- a/backend/game/client.go +++ b/backend/game/client.go @@ -12,12 +12,13 @@ type playerClient struct { hub *gameHub conn *websocket.Conn s2cMessages chan playerMessageS2C + playerID int } // Receives messages from the client and sends them to the hub. func (c *playerClient) readPump() { defer func() { - log.Printf("closing client") + log.Printf("closing player client") c.hub.unregisterPlayer <- c c.conn.Close() }() @@ -87,7 +88,7 @@ func (c *watcherClient) writePump() { defer func() { ticker.Stop() c.conn.Close() - log.Printf("closing watcher") + log.Printf("closing watcher client") c.hub.unregisterWatcher <- c }() for { diff --git a/backend/game/http.go b/backend/game/http.go index beda46c..1ac77b0 100644 --- a/backend/game/http.go +++ b/backend/game/http.go @@ -5,6 +5,7 @@ import ( "strconv" "github.com/labstack/echo/v4" + // "github.com/nsfisis/iosdc-2024-albatross/backend/auth" ) type sockHandler struct { @@ -18,7 +19,11 @@ func newSockHandler(hubs *GameHubs) *sockHandler { } func (h *sockHandler) HandleSockGolfPlay(c echo.Context) error { - // TODO: auth + // user := c.Get("user").(*auth.JWTClaims) + // if user == nil { + // return echo.NewHTTPError(http.StatusUnauthorized) + // } + // TODO: check user permission gameId := c.Param("gameId") gameIdInt, err := strconv.Atoi(gameId) if err != nil { @@ -34,7 +39,7 @@ func (h *sockHandler) HandleSockGolfPlay(c echo.Context) error { if foundHub == nil { return echo.NewHTTPError(http.StatusNotFound, "Game not found") } - return servePlayerWs(foundHub, c.Response(), c.Request(), "a") + return servePlayerWs(foundHub, c.Response(), c.Request(), 1) } func (h *sockHandler) HandleSockGolfWatch(c echo.Context) error { diff --git a/backend/game/hub.go b/backend/game/hub.go index d4a9231..770d257 100644 --- a/backend/game/hub.go +++ b/backend/game/hub.go @@ -121,6 +121,14 @@ func (hub *gameHub) run() { }, } } + for watcher := range hub.watchers { + watcher.s2cMessages <- &watcherMessageS2CStart{ + Type: watcherMessageTypeS2CStart, + Data: watcherMessageS2CStartPayload{ + StartAt: int(startAt.Unix()), + }, + } + } err := hub.q.UpdateGameStartedAt(hub.ctx, db.UpdateGameStartedAtParams{ GameID: int32(hub.game.gameID), StartedAt: pgtype.Timestamp{ @@ -151,9 +159,27 @@ func (hub *gameHub) run() { Type: playerMessageTypeS2CExecResult, Data: playerMessageS2CExecResultPayload{ Score: &score, - Status: api.Success, + Status: api.GamePlayerMessageS2CExecResultPayloadStatusSuccess, }, } + for watcher := range hub.watchers { + watcher.s2cMessages <- &watcherMessageS2CCode{ + Type: watcherMessageTypeS2CCode, + Data: watcherMessageS2CCodePayload{ + PlayerId: message.client.playerID, + Code: code, + }, + } + watcher.s2cMessages <- &watcherMessageS2CExecResult{ + Type: watcherMessageTypeS2CExecResult, + Data: watcherMessageS2CExecResultPayload{ + PlayerId: message.client.playerID, + Score: &score, + Stdout: "", + Stderr: "", + }, + } + } default: log.Fatalf("unexpected message type: %T", message.message) } diff --git a/backend/game/message.go b/backend/game/message.go index 9116bde..bb57eb5 100644 --- a/backend/game/message.go +++ b/backend/game/message.go @@ -66,4 +66,16 @@ func asPlayerMessageC2S(raw map[string]json.RawMessage) (playerMessageC2S, error } } +const ( + watcherMessageTypeS2CStart = "watcher:s2c:start" + watcherMessageTypeS2CExecResult = "watcher:s2c:execreslut" + watcherMessageTypeS2CCode = "watcher:s2c:code" +) + type watcherMessageS2C = interface{} +type watcherMessageS2CStart = api.GameWatcherMessageS2CStart +type watcherMessageS2CStartPayload = api.GameWatcherMessageS2CStartPayload +type watcherMessageS2CCode = api.GameWatcherMessageS2CCode +type watcherMessageS2CCodePayload = api.GameWatcherMessageS2CCodePayload +type watcherMessageS2CExecResult = api.GameWatcherMessageS2CExecResult +type watcherMessageS2CExecResultPayload = api.GameWatcherMessageS2CExecResultPayload diff --git a/backend/game/ws.go b/backend/game/ws.go index 013db7a..9a3956b 100644 --- a/backend/game/ws.go +++ b/backend/game/ws.go @@ -23,7 +23,7 @@ var upgrader = websocket.Upgrader{ }, } -func servePlayerWs(hub *gameHub, w http.ResponseWriter, r *http.Request, team string) error { +func servePlayerWs(hub *gameHub, w http.ResponseWriter, r *http.Request, playerID int) error { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { return err @@ -32,6 +32,7 @@ func servePlayerWs(hub *gameHub, w http.ResponseWriter, r *http.Request, team st hub: hub, conn: conn, s2cMessages: make(chan playerMessageS2C), + playerID: playerID, } hub.registerPlayer <- player |
