handle ending games

This commit is contained in:
2025-06-13 19:02:30 -06:00
parent d129911b8e
commit d08c0c0f5c
9 changed files with 89 additions and 42 deletions
@@ -12,6 +12,7 @@ pub type HostClientMessages {
ResetAllBuzers
ResetPlayerBuzzer(user_id: Int)
UpdateScore(user_id: Int, diff: Int)
EndGame
}
pub fn host_client_messages_decoder() -> decode.Decoder(HostClientMessages) {
@@ -27,6 +28,7 @@ pub fn host_client_messages_decoder() -> decode.Decoder(HostClientMessages) {
use diff <- decode.field("diff", decode.int)
decode.success(UpdateScore(user_id:, diff:))
}
"EndGame" -> decode.success(EndGame)
_ -> decode.failure(ResetAllBuzers, "HostClientMessages")
}
}
@@ -34,6 +36,7 @@ pub fn host_client_messages_decoder() -> decode.Decoder(HostClientMessages) {
pub type HostServerMessages {
Ack
UpdatePlayerStates(players: dict.Dict(Int, player.Player))
ExitGame
}
pub fn encode_host_server_messages(
@@ -53,5 +56,6 @@ pub fn encode_host_server_messages(
),
),
])
ExitGame -> json.object([#("type", json.string("ExitGame"))])
}
}
@@ -18,6 +18,7 @@ pub type PlayerServerMessages {
Ack
UpdatePointTotal(score: Int)
ResetBuzzer
ExitGame
}
pub fn encode_player_server_messages(
@@ -31,5 +32,6 @@ pub fn encode_player_server_messages(
#("score", json.int(player_server_messages.score)),
])
ResetBuzzer -> json.object([#("type", json.string("ResetBuzzer"))])
ExitGame -> json.object([#("type", json.string("ExitGame"))])
}
}
-2
View File
@@ -173,14 +173,12 @@ fn handle_ws_message(
conn,
message: mist.WebsocketMessage(String),
) {
io.println("Got WS message")
case message {
mist.Text(msg) -> {
echo msg
let #(state, resp) = web.handle_client_msg(state, msg)
echo resp
let assert Ok(_) = mist.send_text_frame(conn, resp)
actor.continue(state)
+6
View File
@@ -174,6 +174,12 @@ fn handle_host(
#(socket_state, host_client.Ack)
}
host_client.EndGame -> {
let assert Ok(_) =
session_manager.end_game(socket_state.ctx.sessions, host_state.game_id)
#(socket_state, host_client.Ack)
}
}
let resp = json.to_string(host_client.encode_host_server_messages(resp))
+15 -1
View File
@@ -289,7 +289,21 @@ fn end_game_internal(
state: State,
game_id: String,
) -> Result(actor.Next(Request, State), SessionError) {
use _ <- result.try(get_game(state, game_id))
use game <- result.try(get_game(state, game_id))
broadcast_msg_to_players(state, game, player_client.ExitGame)
send_message_to_host(state, game.host_user_id, host_client.ExitGame)
game.players
|> dict.each(fn(key, _) {
let _ = player_manager.remove_player(state.internal.player_manager, key)
})
let _ =
player_manager.remove_player(
state.internal.player_manager,
game.host_user_id,
)
let games = dict.delete(state.internal.games, game_id)