diff --git a/backend/src/app/clients/new_user_client.gleam b/backend/src/app/clients/new_user_client.gleam index ba5d121..9e5ec51 100644 --- a/backend/src/app/clients/new_user_client.gleam +++ b/backend/src/app/clients/new_user_client.gleam @@ -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)]) } diff --git a/backend/src/app/router.gleam b/backend/src/app/router.gleam index 9354abf..522361b 100644 --- a/backend/src/app/router.gleam +++ b/backend/src/app/router.gleam @@ -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())) } diff --git a/backend/src/app/web.gleam b/backend/src/app/web.gleam index af2ee28..97d6190 100644 --- a/backend/src/app/web.gleam +++ b/backend/src/app/web.gleam @@ -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), ) diff --git a/frontend/Cargo.lock b/frontend/Cargo.lock index d7cff58..e01af10 100644 --- a/frontend/Cargo.lock +++ b/frontend/Cargo.lock @@ -14,6 +14,21 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "autocfg" version = "1.4.0" @@ -59,18 +74,47 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cc" +version = "1.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -194,6 +238,9 @@ dependencies = [ "macroquad", "serde", "serde_json", + "thiserror 2.0.12", + "wasm-cookies", + "web-sys", "web-time", ] @@ -252,6 +299,30 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "image" version = "0.24.9" @@ -517,6 +588,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simd-adler32" version = "0.3.7" @@ -540,7 +617,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", ] [[package]] @@ -554,6 +640,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ttf-parser" version = "0.21.1" @@ -574,7 +671,7 @@ dependencies = [ "log", "rand", "sha1", - "thiserror", + "thiserror 1.0.69", "utf-8", ] @@ -590,6 +687,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "urlencoding" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a1f0175e03a0973cf4afd476bef05c26e228520400eb1fd473ad417b1c00ffb" + [[package]] name = "utf-8" version = "0.7.6" @@ -679,6 +782,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-cookies" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "792b7c4fd62cde421f0e757620053efa7b0c23441c05c6ec02baf96cd74973be" +dependencies = [ + "chrono", + "js-sys", + "urlencoding", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -721,6 +837,65 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "zerocopy" version = "0.8.25" diff --git a/frontend/Cargo.toml b/frontend/Cargo.toml index 8aaebbe..4cfd2fe 100644 --- a/frontend/Cargo.toml +++ b/frontend/Cargo.toml @@ -8,4 +8,7 @@ ewebsock = "0.8.0" macroquad = "0.4.14" serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.140" +thiserror = "2.0.12" +wasm-cookies = "0.2.1" +web-sys = { version = "0.3.77", features = ["Window", "Document", "Location", "HtmlDocument"] } web-time = "1.1.0" diff --git a/frontend/build_wasm.sh b/frontend/build_wasm.sh index b88a540..2662b51 100755 --- a/frontend/build_wasm.sh +++ b/frontend/build_wasm.sh @@ -58,56 +58,6 @@ set -- "${POSITIONAL[@]}" PROJECT_NAME=$1 -HTML=$( - cat <<-END - - - - ${PROJECT_NAME} - - - - - - -
- -
- - - END -) - TARGET_DIR="target/wasm32-unknown-unknown" # Build if [ -n "$RELEASE" ]; then @@ -127,6 +77,3 @@ sed -i "s/import \* as __wbg_star0 from 'env';//" dist/"$PROJECT_NAME".js sed -i "s/let wasm;/let wasm; export const set_wasm = (w) => wasm = w;/" dist/"$PROJECT_NAME".js sed -i "s/imports\['env'\] = __wbg_star0;/return imports.wbg\;/" dist/"$PROJECT_NAME".js sed -i "s/const imports = __wbg_get_imports();/return __wbg_get_imports();/" dist/"$PROJECT_NAME".js - -# Create index from the HTML variable -echo "$HTML" >dist/index.html diff --git a/frontend/src/cfg.rs b/frontend/src/cfg.rs new file mode 100644 index 0000000..49f6283 --- /dev/null +++ b/frontend/src/cfg.rs @@ -0,0 +1,66 @@ +use std::str::FromStr; + +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum CfgError { + #[error("Unknown client type: '{0}'")] + UnkownClientType(String), + #[error("Missing cookie: '{0}'")] + MissingCookie(String), + #[error("Invalid cookie value: '{0}'")] + InvalidCookie(String), +} + +#[derive(Debug, Clone)] +pub enum ClientType { + Host, + Player, +} + +impl FromStr for ClientType { + type Err = CfgError; + + fn from_str(s: &str) -> Result { + match s { + "host" => Ok(Self::Host), + "player" => Ok(Self::Player), + _ => Err(CfgError::UnkownClientType(s.to_string())), + } + } +} + +pub struct Cfg { + pub token: String, + pub username: String, + pub user_id: u64, + pub game_code: String, + pub client_type: ClientType, +} + +impl Cfg { + pub fn load_from_cookies() -> Result { + let client_type = wasm_cookies::get_raw("play_of_the_game/client_type") + .ok_or(CfgError::MissingCookie("client_type".to_string()))?; + let token = wasm_cookies::get_raw("play_of_the_game/token") + .ok_or(CfgError::MissingCookie("token".to_string()))?; + let user_id = wasm_cookies::get_raw("play_of_the_game/user_id") + .ok_or(CfgError::MissingCookie("user_id".to_string()))? + .parse() + .map_err(|_| CfgError::InvalidCookie("user_id".to_string()))?; + let game_id = wasm_cookies::get_raw("play_of_the_game/game_code") + .ok_or(CfgError::MissingCookie("game_id".to_string()))?; + let username = wasm_cookies::get_raw("play_of_the_game/username") + .ok_or(CfgError::MissingCookie("username".to_string()))?; + + let client_type: ClientType = ClientType::from_str(&client_type)?; + + Ok(Self { + token, + username, + user_id, + game_code: game_id, + client_type, + }) + } +} diff --git a/frontend/src/context.rs b/frontend/src/context.rs index 1275c99..b9b3142 100644 --- a/frontend/src/context.rs +++ b/frontend/src/context.rs @@ -2,22 +2,30 @@ use ewebsock::WsEvent; use macroquad::prelude::{error, info}; use serde::{Serialize, de::DeserializeOwned}; +use crate::cfg::{Cfg, ClientType}; + pub struct Context { pub sender: ewebsock::WsSender, pub reciever: ewebsock::WsReceiver, pub token: String, pub username: String, + pub user_id: u64, + pub game_code: String, + pub client_type: ClientType, } impl Context { - pub fn new(url: &str) -> Context { + pub fn new(url: &str, cfg: Cfg) -> Context { let (sender, reciever) = ewebsock::connect(url, ewebsock::Options::default()).unwrap(); Self { sender, reciever, - token: String::new(), - username: String::new(), + token: cfg.token, + username: cfg.username, + game_code: cfg.game_code, + user_id: cfg.user_id, + client_type: cfg.client_type, } } diff --git a/frontend/src/login_screen.rs b/frontend/src/login_screen.rs index 3662ed7..5f18672 100644 --- a/frontend/src/login_screen.rs +++ b/frontend/src/login_screen.rs @@ -2,131 +2,77 @@ use crate::StateTransition; use crate::context::Context; use crate::font::FontSize; use crate::screen::Screen; -use crate::ui_scaling::window_width; -use macroquad::hash; -use macroquad::ui::widgets::Window; -use macroquad::{prelude::*, ui::root_ui}; +use macroquad::prelude::*; use serde::{Deserialize, Serialize}; +#[derive(Debug, Serialize)] +pub struct JoinMessage { + pub game_code: String, + pub user_id: u64, + pub token: String, +} + #[derive(Debug, Serialize)] #[serde(tag = "type")] pub enum NewUserClientMessages { - Register { game_code: String, username: String }, - CreateRoom { game_code: String, username: String }, + JoinAsPlayer(JoinMessage), + JoinAsHost(JoinMessage), } #[derive(Debug, Deserialize)] #[serde(tag = "type")] pub enum NewUserServerMessages { - RegisterResponse { username: String, token: String }, - HostRegisterResponse { username: String, token: String }, + RegisterResponse, + HostRegisterResponse, } #[derive(Default)] pub struct LoginScreen { - new_username: String, - new_room_code: String, sent_join: bool, - sent_host: bool, retry_count: usize, - error_msg: bool, } impl Screen for LoginScreen { fn handle_frame(&mut self, ctx: &mut Context) { clear_background(BEIGE); - let group_size = Vec2::new(window_width(), screen_height() * 0.05); - let window_size = Vec2::new(window_width(), screen_height() * 0.4); - - let mut pressed_join = false; - let mut pressed_host = false; - - Window::new( - hash!("Window"), - Vec2::new( - screen_width() * 0.5 - window_size.x * 0.5, - screen_height() * 0.5 - window_size.x * 0.5, - ), - window_size, - ) - .movable(false) - .ui(&mut root_ui(), |ui| { - ui.group(hash!("User Group"), group_size, |ui| { - ui.input_text(hash!("Username In"), "Username", &mut self.new_username); - }); - ui.group(hash!("Room Group"), group_size, |ui| { - ui.input_text(hash!("Room Code In"), "Room Code", &mut self.new_room_code); - }); - ui.group(hash!("Join Group"), group_size, |ui| { - let dim = FontSize::Large.measure("Join"); - if ui.button( - Vec2::new(group_size.x * 0.50, 0.0) - Vec2::new(dim.width * 0.5, 0.0), - "Join", - ) { - info!( - "User pressed joined with name={} room_code={}", - self.new_username, self.new_room_code - ); - - pressed_join = true; - } - }); - ui.group(hash!("Host Group"), group_size, |ui| { - let dim = FontSize::Large.measure("Host Game"); - if ui.button( - Vec2::new(group_size.x * 0.50, 0.0) - Vec2::new(dim.width * 0.5, 0.0), - "Host Game", - ) { - info!( - "User pressed host with name={} room_code={}", - self.new_username, self.new_room_code - ); - - pressed_host = true; - } - }); - - if self.error_msg { - ui.group(hash!("Error Group"), group_size, |ui| { - ui.label(Vec2::new(0.0, 0.0), "Failed to join game, try again..."); - }); - } - }); - - if pressed_join { - ctx.send_msg(&NewUserClientMessages::Register { - game_code: self.new_room_code.clone(), - username: self.new_username.clone(), - }); + draw_text( + "Starting up...", + screen_width() * 0.5, + screen_height() * 0.5, + FontSize::Large.size() as f32, + BLACK, + ); + if !self.sent_join { self.sent_join = true; - } - if pressed_host { - ctx.send_msg(&NewUserClientMessages::CreateRoom { - game_code: self.new_room_code.clone(), - username: self.new_username.clone(), - }); + let join_msg = JoinMessage { + game_code: ctx.game_code.clone(), + user_id: ctx.user_id, + token: ctx.token.clone(), + }; - self.sent_host = true; + let msg = match ctx.client_type { + crate::cfg::ClientType::Host => NewUserClientMessages::JoinAsHost(join_msg), + crate::cfg::ClientType::Player => NewUserClientMessages::JoinAsPlayer(join_msg), + }; + + info!("Sending join request..."); + ctx.send_msg(&msg); } } fn handle_messages(&mut self, ctx: &mut Context) -> Option { - if self.sent_join || self.sent_host { + if self.sent_join { let msg = ctx.recv_msg(); if let Some(msg) = msg { match msg { - NewUserServerMessages::RegisterResponse { username, token } => { - ctx.username = username; - ctx.token = token; + NewUserServerMessages::RegisterResponse => { return Some(StateTransition::JoinAsPlayer); } - NewUserServerMessages::HostRegisterResponse { username, token } => { - ctx.username = username; - ctx.token = token; + NewUserServerMessages::HostRegisterResponse => { return Some(StateTransition::JoinAsHost); } } @@ -134,11 +80,10 @@ impl Screen for LoginScreen { self.retry_count += 1; - if self.retry_count > get_fps() as usize * 5 { + if self.retry_count > (get_fps() as usize * 100) { warn!("Join failed, try again..."); self.retry_count = 0; self.sent_join = false; - self.error_msg = true; } } diff --git a/frontend/src/main.rs b/frontend/src/main.rs index 2dcdd57..03ccd28 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -1,3 +1,4 @@ +use cfg::Cfg; use context::Context; use font::FontSize; use host_screen::HostScreen; @@ -9,6 +10,7 @@ use macroquad::{ use player_screen::PlayerScreen; use screen::Screen; +mod cfg; mod context; mod font; mod host_screen; @@ -96,9 +98,30 @@ pub fn default_skin() -> Skin { } } +fn get_ws_url() -> String { + let location = web_sys::window() + .unwrap() + .document() + .unwrap() + .location() + .unwrap(); + + let protocol = if location.protocol().unwrap() == "https" { + "wss" + } else { + "ws" + }; + + format!("{}://{}/ws", protocol, location.host().unwrap()) +} + +mod modname {} + #[macroquad::main("Play of the Game")] async fn main() { - let mut context = Context::new("ws://127.0.0.1:8080/ws"); + let cfg = Cfg::load_from_cookies().unwrap(); + + let mut context = Context::new(&get_ws_url(), cfg); let mut state = State::Init; state.transition_state(StateTransition::Init);