diff options
| author | nsfisis <nsfisis@gmail.com> | 2024-07-29 02:59:07 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2024-07-29 02:59:07 +0900 |
| commit | d1c8aa42aec32c8b042ae32d249df9c3c969453d (patch) | |
| tree | 2f248715213d12d6649f32b5ddcbb0d9a0281ed8 /backend/game/message.go | |
| parent | 22ddf340f0b0c8d0cd04c34d9fa1481a1fbf422f (diff) | |
| parent | 161d82bee9f9e65680516a9cfd392e0cf297eadf (diff) | |
| download | phperkaigi-2025-albatross-d1c8aa42aec32c8b042ae32d249df9c3c969453d.tar.gz phperkaigi-2025-albatross-d1c8aa42aec32c8b042ae32d249df9c3c969453d.tar.zst phperkaigi-2025-albatross-d1c8aa42aec32c8b042ae32d249df9c3c969453d.zip | |
Merge branch 'game-playing'
Diffstat (limited to 'backend/game/message.go')
| -rw-r--r-- | backend/game/message.go | 143 |
1 files changed, 54 insertions, 89 deletions
diff --git a/backend/game/message.go b/backend/game/message.go index 7d1a166..9116bde 100644 --- a/backend/game/message.go +++ b/backend/game/message.go @@ -3,102 +3,67 @@ package game import ( "encoding/json" "fmt" -) - -type MessageWithClient struct { - Client *GameClient - Message *Message -} - -type Message struct { - Type string `json:"type"` - Data MessageData `json:"data"` -} - -type MessageData interface{} - -type MessageDataConnect struct { -} - -type MessageDataPrepare struct { - Problem string `json:"problem"` -} - -type MessageDataReady struct { -} -type MessageDataStart struct { - StartTime string `json:"startTime"` -} - -type MessageDataCode struct { - Code string `json:"code"` -} - -type MessageDataScore struct { - Score int `json:"score"` -} + "github.com/nsfisis/iosdc-2024-albatross/backend/api" +) -type MessageDataFinish struct { - YourScore *int `json:"yourScore"` - OpponentScore *int `json:"opponentScore"` -} +const ( + playerMessageTypeS2CPrepare = "player:s2c:prepare" + playerMessageTypeS2CStart = "player:s2c:start" + playerMessageTypeS2CExecResult = "player:s2c:execreslut" + playerMessageTypeC2SEntry = "player:c2s:entry" + playerMessageTypeC2SReady = "player:c2s:ready" + playerMessageTypeC2SCode = "player:c2s:code" +) -type MessageDataWatch struct { - Problem string `json:"problem"` - ScoreA *int `json:"scoreA"` - CodeA string `json:"codeA"` - ScoreB *int `json:"scoreB"` - CodeB string `json:"codeB"` +type playerMessageC2SWithClient struct { + client *playerClient + message playerMessageC2S } -func (m *Message) UnmarshalJSON(data []byte) error { - var raw map[string]json.RawMessage - if err := json.Unmarshal(data, &raw); err != nil { - return err - } - - if err := json.Unmarshal(raw["type"], &m.Type); err != nil { - return err +type playerMessage = api.GamePlayerMessage + +type playerMessageS2C = interface{} +type playerMessageS2CPrepare = api.GamePlayerMessageS2CPrepare +type playerMessageS2CPreparePayload = api.GamePlayerMessageS2CPreparePayload +type playerMessageS2CStart = api.GamePlayerMessageS2CStart +type playerMessageS2CStartPayload = api.GamePlayerMessageS2CStartPayload +type playerMessageS2CExecResult = api.GamePlayerMessageS2CExecResult +type playerMessageS2CExecResultPayload = api.GamePlayerMessageS2CExecResultPayload + +type playerMessageC2S = interface{} +type playerMessageC2SEntry = api.GamePlayerMessageC2SEntry +type playerMessageC2SReady = api.GamePlayerMessageC2SReady +type playerMessageC2SCode = api.GamePlayerMessageC2SCode +type playerMessageC2SCodePayload = api.GamePlayerMessageC2SCodePayload + +func asPlayerMessageC2S(raw map[string]json.RawMessage) (playerMessageC2S, error) { + var typ string + if err := json.Unmarshal(raw["type"], &typ); err != nil { + return nil, err } - var err error - switch m.Type { - case "connect": - var data MessageDataConnect - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "prepare": - var data MessageDataPrepare - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "ready": - var data MessageDataReady - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "start": - var data MessageDataStart - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "code": - var data MessageDataCode - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "score": - var data MessageDataScore - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "finish": - var data MessageDataFinish - err = json.Unmarshal(raw["data"], &data) - m.Data = data - case "watch": - var data MessageDataWatch - err = json.Unmarshal(raw["data"], &data) - m.Data = data + switch typ { + case playerMessageTypeC2SEntry: + return &playerMessageC2SEntry{ + Type: playerMessageTypeC2SEntry, + }, nil + case playerMessageTypeC2SReady: + return &playerMessageC2SReady{ + Type: playerMessageTypeC2SReady, + }, nil + case playerMessageTypeC2SCode: + var payload playerMessageC2SCodePayload + if err := json.Unmarshal(raw["data"], &payload); err != nil { + return nil, err + } + return &playerMessageC2SCode{ + Type: playerMessageTypeC2SCode, + Data: payload, + }, nil default: - err = fmt.Errorf("unknown message type: %s", m.Type) + return nil, fmt.Errorf("unknown message type: %s", typ) } - - return err } + +type watcherMessageS2C = interface{} |
