play-of-the-game/backend/src/app/clients/host_client.gleam
2025-06-13 19:02:30 -06:00

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"))])
}
}