From ef4602a062c0af59d1912dd3e41d35aad64827f0 Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Tue, 27 May 2025 18:43:02 -0600 Subject: [PATCH] demo code, needs some work to be more stable --- backend/gleam.toml | 1 + backend/manifest.toml | 2 ++ backend/src/app/web.gleam | 44 ++++++++++++++++++++++++++---------- frontend/index/index.html | 10 ++++---- frontend/src/context.rs | 7 ++---- frontend/src/login_screen.rs | 8 +++---- frontend/src/main.rs | 2 +- 7 files changed, 46 insertions(+), 28 deletions(-) diff --git a/backend/gleam.toml b/backend/gleam.toml index 0bf07ef..1c75897 100644 --- a/backend/gleam.toml +++ b/backend/gleam.toml @@ -26,6 +26,7 @@ gleam_http = ">= 4.0.0 and < 5.0.0" gleam_otp = ">= 0.16.1 and < 1.0.0" gleam_crypto = ">= 1.5.0 and < 2.0.0" gleam_json = ">= 2.3.0 and < 3.0.0" +gleescript = ">= 1.4.0 and < 2.0.0" [dev-dependencies] gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/backend/manifest.toml b/backend/manifest.toml index 61b3d50..e371d8f 100644 --- a/backend/manifest.toml +++ b/backend/manifest.toml @@ -16,6 +16,7 @@ packages = [ { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "9C215C6CA84A5B35BB934A9B61A9A306EC743153BE2B0425A0D032E477B062A9" }, { name = "gleam_stdlib", version = "0.59.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "F8FEE9B35797301994B81AF75508CF87C328FE1585558B0FFD188DC2B32EAA95" }, { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" }, + { name = "gleescript", version = "1.4.0", build_tools = ["gleam"], requirements = ["argv", "filepath", "gleam_erlang", "gleam_stdlib", "simplifile", "snag", "tom"], otp_app = "gleescript", source = "hex", outer_checksum = "8CDDD29F91064E69950A91A40061785F10275ADB70A0520075591F61A724C455" }, { name = "gleeunit", version = "1.3.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "A7DD6C07B7DA49A6E28796058AA89E651D233B357D5607006D70619CD89DAAAB" }, { name = "glint", version = "1.2.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "2214C7CEFDE457CEE62140C3D4899B964E05236DA74E4243DFADF4AF29C382BB" }, { name = "glisten", version = "7.0.1", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_otp", "gleam_stdlib", "logging", "telemetry"], otp_app = "glisten", source = "hex", outer_checksum = "1A53CF9FB3231A93FF7F1BD519A43DC968C1722F126CDD278403A78725FC5189" }, @@ -40,6 +41,7 @@ gleam_http = { version = ">= 4.0.0 and < 5.0.0" } gleam_json = { version = ">= 2.3.0 and < 3.0.0" } gleam_otp = { version = ">= 0.16.1 and < 1.0.0" } gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } +gleescript = { version = ">= 1.4.0 and < 2.0.0" } gleeunit = { version = ">= 1.0.0 and < 2.0.0" } glint = { version = ">= 1.2.1 and < 2.0.0" } mist = { version = ">= 4.0.7 and < 5.0.0" } diff --git a/backend/src/app/web.gleam b/backend/src/app/web.gleam index 97d6190..bc2bf1e 100644 --- a/backend/src/app/web.gleam +++ b/backend/src/app/web.gleam @@ -11,7 +11,7 @@ import gleam/int import gleam/io import gleam/json import gleam/list -import gleam/option.{None, Some} +import gleam/option.{type Option, None, Some} import gleam/otp/actor import player import player_session @@ -225,11 +225,16 @@ fn get_player_session_from_id( fn get_player_session_subject( ctx: Context, player: player_session.PlayerSession, -) -> process.Subject(String) { - let assert Some(id) = player.socket_id - let assert Ok(subject) = - socket_manager.get_socket_subj_by_id(ctx.socket_manager, id) - subject +) -> Option(process.Subject(String)) { + case player.socket_id { + None -> None + Some(id) -> { + let assert Ok(subject) = + socket_manager.get_socket_subj_by_id(ctx.socket_manager, id) + + Some(subject) + } + } } pub fn broadcast_message_to_players( @@ -240,6 +245,7 @@ pub fn broadcast_message_to_players( dict.keys(session.players) |> list.map(get_player_session_from_id(ctx, _)) |> list.map(get_player_session_subject(ctx, _)) + |> list.filter_map(fn(subject) { option.to_result(subject, "Missing") }) |> list.each(fn(subject) { let client_msg = player_client.encode_player_server_messages(msg) actor.send(subject, json.to_string(client_msg)) @@ -253,9 +259,16 @@ pub fn send_message_to_player( ) { let client_msg = player_client.encode_player_server_messages(msg) - get_player_session_from_id(ctx, id) - |> get_player_session_subject(ctx, _) - |> actor.send(json.to_string(client_msg)) + let subject = + get_player_session_from_id(ctx, id) + |> get_player_session_subject(ctx, _) + + case subject { + None -> Nil + Some(subject) -> { + actor.send(subject, json.to_string(client_msg)) + } + } } pub fn send_message_to_host( @@ -265,9 +278,16 @@ pub fn send_message_to_host( ) { let client_msg = host_client.encode_host_server_messages(msg) - get_player_session_from_id(ctx, id) - |> get_player_session_subject(ctx, _) - |> actor.send(json.to_string(client_msg)) + let subject = + get_player_session_from_id(ctx, id) + |> get_player_session_subject(ctx, _) + + case subject { + None -> Nil + Some(subject) -> { + actor.send(subject, json.to_string(client_msg)) + } + } } fn reset_player_buzzer( diff --git a/frontend/index/index.html b/frontend/index/index.html index 59c1e58..8994e3a 100644 --- a/frontend/index/index.html +++ b/frontend/index/index.html @@ -32,11 +32,11 @@ load("./static/frontend_bg.wasm"); } window.run = function (join_type) { - console.log("Joining as: ", join_type); + console.log("Joining as:", join_type); var xhr = new XMLHttpRequest(); xhr.open("POST", "./login/" + join_type); xhr.onload = function (event) { - console.log("Starting game...", event.target); + console.log("Starting game...", event); document.getElementById("run-container").remove(); document .getElementById("glcanvas") @@ -46,7 +46,7 @@ }; // or onerror, onabort var formData = new FormData(document.getElementById("login")); - xhr.send(JSON.stringify(Object.fromEntries(formData)); + xhr.send(JSON.stringify(Object.fromEntries(formData))); };


-
-
+
+
diff --git a/frontend/src/context.rs b/frontend/src/context.rs index b9b3142..cc5690e 100644 --- a/frontend/src/context.rs +++ b/frontend/src/context.rs @@ -16,6 +16,7 @@ pub struct Context { impl Context { pub fn new(url: &str, cfg: Cfg) -> Context { + info!("Connecting to web socket server @ {}", url); let (sender, reciever) = ewebsock::connect(url, ewebsock::Options::default()).unwrap(); Self { @@ -42,11 +43,7 @@ impl Context { None } WsEvent::Message(ws_message) => match ws_message { - ewebsock::WsMessage::Text(msg) => { - let game_resp: T = serde_json::from_str(&msg).unwrap(); - - Some(game_resp) - } + ewebsock::WsMessage::Text(msg) => serde_json::from_str(&msg).ok(), _ => None, }, WsEvent::Error(err) => { diff --git a/frontend/src/login_screen.rs b/frontend/src/login_screen.rs index 5f18672..87871c3 100644 --- a/frontend/src/login_screen.rs +++ b/frontend/src/login_screen.rs @@ -29,7 +29,7 @@ pub enum NewUserServerMessages { #[derive(Default)] pub struct LoginScreen { sent_join: bool, - retry_count: usize, + retry_time: f64, } impl Screen for LoginScreen { @@ -60,6 +60,7 @@ impl Screen for LoginScreen { info!("Sending join request..."); ctx.send_msg(&msg); + self.retry_time = get_time() + 2.0; } } @@ -78,11 +79,8 @@ impl Screen for LoginScreen { } } - self.retry_count += 1; - - if self.retry_count > (get_fps() as usize * 100) { + if get_time() > self.retry_time { warn!("Join failed, try again..."); - self.retry_count = 0; self.sent_join = false; } } diff --git a/frontend/src/main.rs b/frontend/src/main.rs index 03ccd28..098fb4e 100644 --- a/frontend/src/main.rs +++ b/frontend/src/main.rs @@ -112,7 +112,7 @@ fn get_ws_url() -> String { "ws" }; - format!("{}://{}/ws", protocol, location.host().unwrap()) + format!("wss://{}/ws", location.host().unwrap()) } mod modname {}