aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2024-08-01 01:19:00 +0900
committernsfisis <nsfisis@gmail.com>2024-08-01 01:19:00 +0900
commitf5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9 (patch)
treebe7fe2a9b1a66553f7cda5a462afef801b6cf438
parent5fc739292bdd65da2d33f1e9a4c2b1b33576fdf6 (diff)
downloadiosdc-japan-2024-albatross-f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9.tar.gz
iosdc-japan-2024-albatross-f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9.tar.zst
iosdc-japan-2024-albatross-f5b6c2f14d3521e9763ba7a356b8e87ebc6d7cd9.zip
feat: change procedure of game starting
-rw-r--r--backend/api/handlers.go16
-rw-r--r--backend/game/hub.go50
-rw-r--r--backend/main.go14
-rw-r--r--frontend/app/routes/admin.games_.$gameId.tsx39
-rw-r--r--frontend/app/routes/logout.tsx1
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;
}