diff --git a/Cargo.lock b/Cargo.lock index be998d8..f9eb096 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -152,9 +152,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "3.0.13" +version = "3.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08799f92c961c7a1cf0cc398a9073da99e21ce388b46372c37f3191f2f3eed3e" +checksum = "b63edc3f163b3c71ec8aa23f9bd6070f77edbf3d1d198b164afa90ff00e4ec62" dependencies = [ "atty", "bitflags", @@ -169,9 +169,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "3.0.12" +version = "3.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fd2078197a22f338bd4fbf7d6387eb6f0d6a3c69e6cbc09f5c93e97321fd92a" +checksum = "9a1132dc3944b31c20dd8b906b3a9f0a5d0243e092d59171414969657ac6aa85" dependencies = [ "heck", "proc-macro-error", @@ -673,15 +673,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.115" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a8d982fa7a96a000f6ec4cfe966de9703eccde29750df2bb8949da91b0e818d" +checksum = "e74d72e0f9b65b5b4ca49a346af3976df0f9c61d550727f349ecd559f251a26c" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -1693,9 +1693,9 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "2d8d93354fe2a8e50d5953f5ae2e47a3fc2ef03292e7ea46e3cc38f549525fb9" dependencies = [ "cfg-if 1.0.0", "pin-project-lite", @@ -1705,9 +1705,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" +checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" dependencies = [ "proc-macro2", "quote", @@ -1716,11 +1716,12 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" dependencies = [ "lazy_static", + "valuable", ] [[package]] @@ -1736,9 +1737,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5312f325fe3588e277415f5a6cca1f4ccad0f248c4cd5a4bd33032d7286abc22" +checksum = "74786ce43333fcf51efe947aed9718fbe46d5c7328ec3f1029e818083966d9aa" dependencies = [ "ansi_term", "lazy_static", @@ -1795,6 +1796,12 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "version_check" version = "0.9.4" diff --git a/src/main.rs b/src/main.rs index fb928fd..7e33826 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,12 @@ extern crate lazy_static; use clap::Parser; use rocket::fs::{relative, FileServer}; +use rocket::{State, Shutdown}; +use rocket::serde::{Serialize, Deserialize}; use rocket_dyn_templates::Template; +use rocket::form::Form; +use rocket::tokio::sync::broadcast::{channel, Sender, error::RecvError}; +use rocket::response::stream::{EventStream, Event, TextStream}; use std::{collections::HashMap, mem::drop, sync::Mutex}; mod names; @@ -17,6 +22,16 @@ lazy_static! { static ref ROOMS: Mutex> = Mutex::new(HashMap::new()); } + +#[derive(Debug, Clone, FromForm, Serialize, Deserialize)] +#[cfg_attr(test, derive(PartialEq, UriDisplayQuery))] +#[serde(crate = "rocket::serde")] +struct Play { + pub roomname: String, + pub position: String, + pub player1: bool, +} + /* * Config options */ @@ -39,7 +54,7 @@ fn rocket() -> _ { rocket::custom(config) .attach(Template::fairing()) .mount("/", FileServer::from(relative!("static"))) - .mount("/", routes![index, room]) + .mount("/", routes![index, room, stream, post]) } /* @@ -94,7 +109,7 @@ async fn room(roomname: &str, token: usize, player1: bool) -> Template { if room.token == token { drop(rooms); //TODO: placeholder - templates::get_back_to_home("cool!") + templates::get_room(roomname, token, player1) } // the room is real but the token is incorrect else { @@ -108,3 +123,21 @@ async fn room(roomname: &str, token: usize, player1: bool) -> Template { templates::get_back_to_home("illegalroom") } } + +#[get("/stream")] +async fn stream(queue: &State>, mut end: Shutdown) -> TextStream![String]{ + let mut rx = queue.subscribe(); + TextStream! { + loop { + yield "hello!".to_string(); + } + } +} + +/// Receive a message from a form submission and broadcast it to any receivers. +#[post("/message", data = "
")] +fn post(form: Form, queue: &State>) { + // A send 'fails' if there are no active subscribers. That's okay. + let _res = queue.send(form.into_inner()); +} + diff --git a/src/rooms.rs b/src/rooms.rs index c42203b..0c611c0 100644 --- a/src/rooms.rs +++ b/src/rooms.rs @@ -4,6 +4,7 @@ use rand::{thread_rng, Rng}; pub struct Room { pub token: usize, pub full: bool, + pub play_queue: Vec, } impl Room { @@ -14,6 +15,7 @@ impl Room { Room { full: false, token: tok, + play_queue: vec![], } } } diff --git a/src/templates.rs b/src/templates.rs index fe13e81..5b0995e 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -29,6 +29,16 @@ pub fn join_room(roomname: &str, token: usize) -> Template { join_template_from(&message, "let me in!", &link_url, "hidden", roomname) } +pub fn get_room(roomname: &str, token: usize, player1: bool) -> Template{ + let mut context: HashMap<&str, &str> = HashMap::new(); + let tokstring = token.to_string(); + let p1string = player1.to_string(); + context.insert("roomname", roomname); + context.insert("token", &tokstring); + context.insert("player1", &p1string); + Template::render("room", context) +} + fn join_template_from(message: &str, link: &str, link_url: &str, hide_url_button: &str, roomname: &str) -> Template { let url_button_url = &format!("{}/?roomname={}", ARGS.base_url, roomname); let mut context: HashMap<&str, &str> = HashMap::new(); diff --git a/static/room.js b/static/room.js new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/static/room.js @@ -0,0 +1 @@ + diff --git a/templates/join.html.hbs b/templates/join.html.hbs index 669d4d8..cb393f7 100644 --- a/templates/join.html.hbs +++ b/templates/join.html.hbs @@ -1,15 +1,16 @@ + - + Reversi Online - + diff --git a/templates/room.html.hbs b/templates/room.html.hbs new file mode 100644 index 0000000..9f9ad8b --- /dev/null +++ b/templates/room.html.hbs @@ -0,0 +1,27 @@ + + + + + + + Reversi Online + + + + + + +
+
+ +