demo code, needs some work to be more stable
This commit is contained in:
		
							parent
							
								
									88ce6db3aa
								
							
						
					
					
						commit
						ef4602a062
					
				| @ -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" | ||||
|  | ||||
| @ -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" } | ||||
|  | ||||
| @ -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( | ||||
|  | ||||
| @ -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))); | ||||
|             }; | ||||
|         </script> | ||||
|         <div | ||||
| @ -62,8 +62,8 @@ | ||||
|             <form id="login"> | ||||
|                 <label for="username">Username:</label><br /> | ||||
|                 <input type="text" id="username" name="username" /><br /> | ||||
|                 <label for="gamecode">Gamecode:</label><br /> | ||||
|                 <input type="text" id="gamecode" name="gamecode" /><br /> | ||||
|                 <label for="game_code">Gamecode:</label><br /> | ||||
|                 <input type="text" id="game_code" name="game_code" /><br /> | ||||
|             </form> | ||||
|             <button onclick="run('join')">Join Game</button> | ||||
|             <button onclick="run('host')">Host Game</button> | ||||
|  | ||||
| @ -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) => { | ||||
|  | ||||
| @ -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; | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -112,7 +112,7 @@ fn get_ws_url() -> String { | ||||
|         "ws" | ||||
|     }; | ||||
| 
 | ||||
|     format!("{}://{}/ws", protocol, location.host().unwrap()) | ||||
|     format!("wss://{}/ws", location.host().unwrap()) | ||||
| } | ||||
| 
 | ||||
| mod modname {} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user