working with new login page, IOS is still a bit weird but it should just be HTML work

This commit is contained in:
2025-05-26 11:38:44 -06:00
parent 2ba48354ac
commit 88ce6db3aa
10 changed files with 375 additions and 187 deletions
+11 -9
View File
@@ -6,8 +6,8 @@ pub type NewUserState {
}
pub type NewUserClientMessages {
JoinAsPlayer(token: String, user_id: Int, game_id: String)
JoinAsHost(token: String, user_id: Int, game_id: String)
JoinAsPlayer(token: String, user_id: Int, game_code: String)
JoinAsHost(token: String, user_id: Int, game_code: String)
}
pub fn new_user_client_messages_decoder() -> decode.Decoder(
@@ -18,14 +18,14 @@ pub fn new_user_client_messages_decoder() -> decode.Decoder(
"JoinAsPlayer" -> {
use token <- decode.field("token", decode.string)
use user_id <- decode.field("user_id", decode.int)
use game_id <- decode.field("game_id", decode.string)
decode.success(JoinAsPlayer(token:, user_id:, game_id:))
use game_code <- decode.field("game_code", decode.string)
decode.success(JoinAsPlayer(token:, user_id:, game_code:))
}
"JoinAsHost" -> {
use token <- decode.field("token", decode.string)
use user_id <- decode.field("user_id", decode.int)
use game_id <- decode.field("game_id", decode.string)
decode.success(JoinAsHost(token:, user_id:, game_id:))
use game_code <- decode.field("game_code", decode.string)
decode.success(JoinAsHost(token:, user_id:, game_code:))
}
_ -> decode.failure(JoinAsPlayer("", 0, ""), "NewUserClientMessages")
}
@@ -39,8 +39,10 @@ pub type NewUserServerMessages {
pub fn encode_new_user_server_messages(
new_user_server_messages: NewUserServerMessages,
) -> json.Json {
case new_user_server_messages {
RegisterResponse -> json.string("register_response")
HostRegisterResponse -> json.string("host_register_response")
let msg_type = case new_user_server_messages {
RegisterResponse -> json.string("RegisterResponse")
HostRegisterResponse -> json.string("HostRegisterResponse")
}
json.object([#("type", msg_type)])
}
+25 -7
View File
@@ -1,3 +1,4 @@
import app/clients/host_client
import app/clients/new_user_client
import app/web
import gleam/bit_array
@@ -61,6 +62,8 @@ fn server_login(
let key = storail.key(ctx.sessions, login_req.game_code)
let session = session.Session(login_req.game_code, user_id, dict.new())
let assert Ok(Nil) = storail.write(key, session)
Nil
}
JoinAsPlayer -> {
let key = storail.key(ctx.sessions, login_req.game_code)
@@ -80,6 +83,13 @@ fn server_login(
)
let assert Ok(Nil) = storail.write(key, session)
web.send_message_to_host(
ctx,
session.host_user_id,
host_client.UpdatePlayerStates(session.players),
)
Nil
}
}
@@ -87,22 +97,30 @@ fn server_login(
JoinAsHost -> "host"
JoinAsPlayer -> "player"
}
let cookie_attr =
cookie.Attributes(..cookie.defaults(req.scheme), http_only: False)
response.new(200)
|> response.set_cookie(
"play_of_the_game/token",
token,
cookie.defaults(req.scheme),
)
|> response.set_cookie("play_of_the_game/token", token, cookie_attr)
|> response.set_cookie(
"play_of_the_game/client_type",
join_type_name,
cookie.defaults(req.scheme),
cookie_attr,
)
|> response.set_cookie(
"play_of_the_game/username",
login_req.username,
cookie.defaults(req.scheme),
cookie_attr,
)
|> response.set_cookie(
"play_of_the_game/user_id",
int.to_string(user_id),
cookie_attr,
)
|> response.set_cookie(
"play_of_the_game/game_code",
login_req.game_code,
cookie_attr,
)
|> response.set_body(mist.Bytes(bytes_tree.new()))
}
+22 -21
View File
@@ -78,7 +78,7 @@ fn set_buzz_in(
let assert Ok(_) = storail.write(key, session)
send_message_to_host(
socket_state,
socket_state.ctx,
session.host_user_id,
host_client.UpdatePlayerStates(session.players),
)
@@ -189,19 +189,20 @@ fn handle_new_user(
#(
SocketState(
..socket_state,
state: Player(player_client.PlayerState(user_id:, game_id:)),
state: Host(host_client.HostState(user_id:, game_id:)),
),
new_user_client.HostRegisterResponse,
)
}
new_user_client.JoinAsPlayer(token, user_id, game_id) -> {
let assert Ok(_) = attach_socket_to_user(socket_state, user_id, token)
#(
SocketState(
..socket_state,
state: Host(host_client.HostState(user_id:, game_id:)),
state: Player(player_client.PlayerState(user_id:, game_id:)),
),
new_user_client.HostRegisterResponse,
new_user_client.RegisterResponse,
)
}
}
@@ -231,41 +232,41 @@ fn get_player_session_subject(
subject
}
fn broadcast_message_to_players(
socket_state: SocketState,
pub fn broadcast_message_to_players(
ctx: Context,
session: session.Session,
msg: player_client.PlayerServerMessages,
) {
dict.keys(session.players)
|> list.map(get_player_session_from_id(socket_state.ctx, _))
|> list.map(get_player_session_subject(socket_state.ctx, _))
|> list.map(get_player_session_from_id(ctx, _))
|> list.map(get_player_session_subject(ctx, _))
|> list.each(fn(subject) {
let client_msg = player_client.encode_player_server_messages(msg)
actor.send(subject, json.to_string(client_msg))
})
}
fn send_message_to_player(
socket_state: SocketState,
pub fn send_message_to_player(
ctx: Context,
id: Int,
msg: player_client.PlayerServerMessages,
) {
let client_msg = player_client.encode_player_server_messages(msg)
get_player_session_from_id(socket_state.ctx, id)
|> get_player_session_subject(socket_state.ctx, _)
get_player_session_from_id(ctx, id)
|> get_player_session_subject(ctx, _)
|> actor.send(json.to_string(client_msg))
}
fn send_message_to_host(
socket_state: SocketState,
pub fn send_message_to_host(
ctx: Context,
id: Int,
msg: host_client.HostServerMessages,
) {
let client_msg = host_client.encode_host_server_messages(msg)
get_player_session_from_id(socket_state.ctx, id)
|> get_player_session_subject(socket_state.ctx, _)
get_player_session_from_id(ctx, id)
|> get_player_session_subject(ctx, _)
|> actor.send(json.to_string(client_msg))
}
@@ -286,7 +287,7 @@ fn reset_player_buzzer(
let assert Ok(_) = storail.write(session_key, session)
send_message_to_host(
socket_state,
socket_state.ctx,
session.host_user_id,
host_client.UpdatePlayerStates(session.players),
)
@@ -311,7 +312,7 @@ fn handle_host(
})
broadcast_message_to_players(
socket_state,
socket_state.ctx,
session,
player_client.ResetBuzzer,
)
@@ -319,7 +320,7 @@ fn handle_host(
}
host_client.ResetPlayerBuzzer(id) -> {
reset_player_buzzer(socket_state, session_key, id)
send_message_to_player(socket_state, id, player_client.ResetBuzzer)
send_message_to_player(socket_state.ctx, id, player_client.ResetBuzzer)
#(socket_state, host_client.Ack)
}
host_client.UpdateScore(id, score) -> {
@@ -333,13 +334,13 @@ fn handle_host(
let assert Ok(_) = storail.write(session_key, session)
send_message_to_player(
socket_state,
socket_state.ctx,
id,
player_client.UpdatePointTotal(player.score),
)
send_message_to_host(
socket_state,
socket_state.ctx,
session.host_user_id,
host_client.UpdatePlayerStates(session.players),
)