diff options
| author | nsfisis <nsfisis@gmail.com> | 2024-08-01 01:19:00 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2024-08-01 01:19:00 +0900 |
| commit | f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9 (patch) | |
| tree | be7fe2a9b1a66553f7cda5a462afef801b6cf438 | |
| parent | 5fc739292bdd65da2d33f1e9a4c2b1b33576fdf6 (diff) | |
| download | phperkaigi-2025-albatross-f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9.tar.gz phperkaigi-2025-albatross-f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9.tar.zst phperkaigi-2025-albatross-f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9.zip | |
feat: change procedure of game starting
| -rw-r--r-- | backend/api/handlers.go | 16 | ||||
| -rw-r--r-- | backend/game/hub.go | 50 | ||||
| -rw-r--r-- | backend/main.go | 14 | ||||
| -rw-r--r-- | frontend/app/routes/admin.games_.$gameId.tsx | 39 | ||||
| -rw-r--r-- | frontend/app/routes/logout.tsx | 1 |
5 files changed, 79 insertions, 41 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 { diff --git a/frontend/app/routes/admin.games_.$gameId.tsx b/frontend/app/routes/admin.games_.$gameId.tsx index 244092e..ff8f136 100644 --- a/frontend/app/routes/admin.games_.$gameId.tsx +++ b/frontend/app/routes/admin.games_.$gameId.tsx @@ -57,7 +57,7 @@ export async function action({ request, params }: ActionFunctionArgs) { action === "open" ? "waiting_entries" : action === "start" - ? "waiting_start" + ? "prepare" : null; if (!nextState) { throw new Error("Invalid action"); @@ -79,6 +79,7 @@ export async function action({ request, params }: ActionFunctionArgs) { if (error) { throw new Error(error.message); } + return null; } export default function AdminGameEdit() { @@ -103,22 +104,26 @@ export default function AdminGameEdit() { </ul> <div> <Form method="post"> - <button - type="submit" - name="action" - value="open" - disabled={game.state !== "closed"} - > - Open - </button> - <button - type="submit" - name="action" - value="start" - disabled={game.state !== "waiting_start"} - > - Start - </button> + <div> + <button + type="submit" + name="action" + value="open" + disabled={game.state !== "closed"} + > + Open + </button> + </div> + <div> + <button + type="submit" + name="action" + value="start" + disabled={game.state !== "waiting_start"} + > + Start + </button> + </div> </Form> </div> </div> diff --git a/frontend/app/routes/logout.tsx b/frontend/app/routes/logout.tsx index f48081d..030bde0 100644 --- a/frontend/app/routes/logout.tsx +++ b/frontend/app/routes/logout.tsx @@ -3,4 +3,5 @@ import { authenticator } from "../.server/auth"; export async function action({ request }: ActionFunctionArgs) { await authenticator.logout(request, { redirectTo: "/" }); + return null; } |
