diff options
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/api/handlers.go | 16 | ||||
| -rw-r--r-- | backend/game/hub.go | 50 | ||||
| -rw-r--r-- | backend/main.go | 14 |
3 files changed, 56 insertions, 24 deletions
diff --git a/backend/api/handlers.go b/backend/api/handlers.go index cc16972..c96cd2a 100644 --- a/backend/api/handlers.go +++ b/backend/api/handlers.go @@ -18,12 +18,18 @@ import ( var _ StrictServerInterface = (*ApiHandler)(nil) type ApiHandler struct { - q *db.Queries + q *db.Queries + hubs GameHubsInterface } -func NewHandler(queries *db.Queries) *ApiHandler { +type GameHubsInterface interface { + StartGame(gameID int) error +} + +func NewHandler(queries *db.Queries, hubs GameHubsInterface) *ApiHandler { return &ApiHandler{ - q: queries, + q: queries, + hubs: hubs, } } @@ -145,6 +151,10 @@ func (h *ApiHandler) PutAdminGamesGameId(ctx context.Context, request PutAdminGa var changedState string if state != nil { changedState = string(*state) + // TODO: + if changedState != game.State && changedState == "prepare" { + h.hubs.StartGame(int(gameID)) + } } else { changedState = game.State } diff --git a/backend/game/hub.go b/backend/game/hub.go index 08833ed..e6981e8 100644 --- a/backend/game/hub.go +++ b/backend/game/hub.go @@ -2,6 +2,7 @@ package game import ( "context" + "errors" "log" "time" @@ -81,26 +82,14 @@ func (hub *gameHub) run() { } } if entriedPlayerCount == 2 { - for player := range hub.players { - player.s2cMessages <- &playerMessageS2CPrepare{ - Type: playerMessageTypeS2CPrepare, - Data: playerMessageS2CPreparePayload{ - Problem: api.Problem{ - ProblemId: 1, - Title: "the answer", - Description: "print 42", - }, - }, - } - } err := hub.q.UpdateGameState(hub.ctx, db.UpdateGameStateParams{ GameID: int32(hub.game.gameID), - State: string(gameStatePrepare), + State: string(gameStateWaitingStart), }) if err != nil { log.Fatalf("failed to set game state: %v", err) } - hub.game.state = gameStatePrepare + hub.game.state = gameStateWaitingStart } case *playerMessageC2SReady: log.Printf("ready: %v", message.message) @@ -214,6 +203,31 @@ func (hub *gameHub) run() { } } +func (hub *gameHub) startGame() error { + for player := range hub.players { + player.s2cMessages <- &playerMessageS2CPrepare{ + Type: playerMessageTypeS2CPrepare, + Data: playerMessageS2CPreparePayload{ + Problem: api.Problem{ + ProblemId: 1, + Title: "the answer", + Description: "print 42", + }, + }, + } + } + + err := hub.q.UpdateGameState(hub.ctx, db.UpdateGameStateParams{ + GameID: int32(hub.game.gameID), + State: string(gameStatePrepare), + }) + if err != nil { + return err + } + hub.game.state = gameStatePrepare + return nil +} + func (hub *gameHub) close() { for client := range hub.players { hub.closePlayerClient(client) @@ -302,3 +316,11 @@ func (hubs *GameHubs) Run() { func (hubs *GameHubs) SockHandler() *sockHandler { return newSockHandler(hubs) } + +func (hubs *GameHubs) StartGame(gameID int) error { + hub := hubs.getHub(gameID) + if hub == nil { + return errors.New("no such game") + } + return hub.startGame() +} diff --git a/backend/main.go b/backend/main.go index d3a180c..d636af7 100644 --- a/backend/main.go +++ b/backend/main.go @@ -57,13 +57,6 @@ func main() { e.Use(middleware.Logger()) e.Use(middleware.Recover()) - apiGroup := e.Group("/api") - apiGroup.Use(oapimiddleware.OapiRequestValidator(openApiSpec)) - apiHandler := api.NewHandler(queries) - api.RegisterHandlers(apiGroup, api.NewStrictHandler(apiHandler, []api.StrictMiddlewareFunc{ - api.NewJWTMiddleware(), - })) - gameHubs := game.NewGameHubs(queries) err = gameHubs.RestoreFromDB(ctx) if err != nil { @@ -79,6 +72,13 @@ func main() { return sockHandler.HandleSockGolfWatch(c) }) + apiGroup := e.Group("/api") + apiGroup.Use(oapimiddleware.OapiRequestValidator(openApiSpec)) + apiHandler := api.NewHandler(queries, gameHubs) + api.RegisterHandlers(apiGroup, api.NewStrictHandler(apiHandler, []api.StrictMiddlewareFunc{ + api.NewJWTMiddleware(), + })) + gameHubs.Run() if err := e.Start(":80"); err != http.ErrServerClosed { |
