aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rw-r--r--backend/api/handlers.go16
-rw-r--r--backend/game/hub.go50
-rw-r--r--backend/main.go14
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 {