62 lines
1.6 KiB
Gleam
62 lines
1.6 KiB
Gleam
import gleam/dict
|
|
import gleam/dynamic/decode
|
|
import gleam/int
|
|
import gleam/json
|
|
import player
|
|
|
|
pub type HostState {
|
|
HostState(user_id: Int, game_id: String)
|
|
}
|
|
|
|
pub type HostClientMessages {
|
|
ResetAllBuzers
|
|
ResetPlayerBuzzer(user_id: Int)
|
|
UpdateScore(user_id: Int, diff: Int)
|
|
EndGame
|
|
}
|
|
|
|
pub fn host_client_messages_decoder() -> decode.Decoder(HostClientMessages) {
|
|
use variant <- decode.field("type", decode.string)
|
|
case variant {
|
|
"ResetAllBuzers" -> decode.success(ResetAllBuzers)
|
|
"ResetPlayerBuzzer" -> {
|
|
use user_id <- decode.field("user_id", decode.int)
|
|
decode.success(ResetPlayerBuzzer(user_id:))
|
|
}
|
|
"UpdateScore" -> {
|
|
use user_id <- decode.field("user_id", decode.int)
|
|
use diff <- decode.field("diff", decode.int)
|
|
decode.success(UpdateScore(user_id:, diff:))
|
|
}
|
|
"EndGame" -> decode.success(EndGame)
|
|
_ -> decode.failure(ResetAllBuzers, "HostClientMessages")
|
|
}
|
|
}
|
|
|
|
pub type HostServerMessages {
|
|
Ack
|
|
UpdatePlayerStates(players: dict.Dict(Int, player.Player))
|
|
ExitGame
|
|
}
|
|
|
|
pub fn encode_host_server_messages(
|
|
host_server_messages: HostServerMessages,
|
|
) -> json.Json {
|
|
case host_server_messages {
|
|
Ack -> json.object([#("type", json.string("Ack"))])
|
|
UpdatePlayerStates(..) ->
|
|
json.object([
|
|
#("type", json.string("UpdatePlayerStates")),
|
|
#(
|
|
"players",
|
|
json.dict(
|
|
host_server_messages.players,
|
|
int.to_string,
|
|
player.serialize,
|
|
),
|
|
),
|
|
])
|
|
ExitGame -> json.object([#("type", json.string("ExitGame"))])
|
|
}
|
|
}
|