diff --git a/snippets/back_to_home.html b/snippets/back_to_home.html
new file mode 100644
index 0000000..605c874
--- /dev/null
+++ b/snippets/back_to_home.html
@@ -0,0 +1 @@
+
Sorry! This room is already full. Maybe try another one?
diff --git a/src/main.rs b/src/main.rs
index b6186ef..a20b552 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,12 +6,15 @@ extern crate lazy_static;
use clap::Parser;
use rocket::fs::{relative, FileServer};
use rocket_dyn_templates::Template;
+use std::{collections::HashMap, mem::drop, sync::Mutex};
mod names;
mod rooms;
+mod templates;
lazy_static! {
static ref ARGS: Args = Args::parse();
+ static ref ROOMS: Mutex> = Mutex::new(HashMap::new());
}
#[derive(Parser, Debug)]
@@ -20,6 +23,8 @@ struct Args {
// Port number for server
#[clap(short, long, default_value_t = 8000)]
port: u16,
+ #[clap(short, long, default_value = "localhost")]
+ base_url: String,
}
#[launch]
@@ -29,10 +34,43 @@ fn rocket() -> _ {
rocket::custom(config)
.attach(Template::fairing())
.mount("/", FileServer::from(relative!("static")))
- .mount("/", routes![join])
+ .mount("/", routes![index, room])
}
#[get("/?")]
-fn join (roomname: &str) -> String {
- format!("You're joining {}", roomname)
+async fn index(mut roomname: String) -> Template {
+ // generate roomname if there is none yet
+ if roomname.chars().count() == 0 {
+ roomname = names::get_random_name().await;
+ print!("{}", roomname)
+ }
+ // lock list of rooms
+ let mut rooms = ROOMS.lock().unwrap();
+ // do this if there are already people in the room
+ // first let the new player join and then lock the room for others
+ if rooms.contains_key(&roomname) {
+ let mut room = rooms.get_mut(&roomname).unwrap();
+ if room.full {
+ drop(rooms);
+ return templates::get_back_to_home(&roomname);
+ }
+ room.full = true;
+ let templ = templates::join_room(&roomname, room.token);
+ drop(rooms);
+ return templ;
+ }
+ //create a new room if it doesn't exist yet
+ else {
+ // create new room
+ let room = rooms::Room::new();
+ let templ = templates::join_new_room(&roomname, room.token);
+ rooms.insert(roomname.to_string(), room);
+ drop(rooms);
+ return templ;
+ }
+}
+
+#[get("/room?&")]
+async fn room(roomname: &str, token: usize) -> String{
+ "hey gamer".to_string()
}
diff --git a/src/rooms.rs b/src/rooms.rs
index f9db392..e4621ee 100644
--- a/src/rooms.rs
+++ b/src/rooms.rs
@@ -1,11 +1,17 @@
-use std::sync::Mutex;
-
-lazy_static! {
- static ref ARRAY: Mutex> = Mutex::new(vec![]);
-}
+use rand::{thread_rng, Rng};
+#[derive(Debug)]
pub struct Room {
- id: String,
- players: Vec,
- full: bool
+ pub token: usize,
+ pub full: bool,
+}
+
+impl Room {
+ pub fn new() -> Room {
+ let random: usize = thread_rng().gen();
+ Room {
+ full: false,
+ token: random,
+ }
+ }
}
diff --git a/src/templates.rs b/src/templates.rs
new file mode 100644
index 0000000..c9c2f10
--- /dev/null
+++ b/src/templates.rs
@@ -0,0 +1,47 @@
+use std::collections::HashMap;
+use rocket_dyn_templates::Template;
+use clap::Parser;
+
+
+
+lazy_static! {
+ static ref ARGS: Args = Args::parse();
+}
+
+#[derive(Parser, Debug)]
+#[clap(about, version, author)]
+struct Args {
+ #[clap(short, long, default_value = "localhost")]
+ base_url: String,
+}
+
+pub fn get_back_to_home(roomname: &str) -> Template {
+ join_template_from("sorry! looks like this room is already full!", "try another!", "./", "hidden", roomname)
+}
+
+pub fn join_new_room(roomname: &str, token: usize) -> Template {
+ let message = format!("your room is \"{}\"! copy your link and send it to a friend to let them join", roomname);
+ let link_url = link_url_from(roomname, token);
+ join_template_from(&message, "let me in!", &link_url, "url_button", roomname)
+}
+
+pub fn join_room(roomname: &str, token: usize) -> Template {
+ let message = format!("your room is \"{}\"! someone is already waiting in this room!", roomname);
+ let link_url = link_url_from(roomname, token);
+ join_template_from(&message, "let me in!", &link_url, "hidden", roomname)
+}
+
+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();
+ context.insert("message", message);
+ context.insert("link", link);
+ context.insert("link_url", link_url);
+ context.insert("hide_url_button", hide_url_button);
+ context.insert("url_button_url", url_button_url);
+ Template::render("join", context)
+}
+
+fn link_url_from(roomname: &str, token: usize) -> String{
+ format!("./room?roomname={}&token={}", roomname, token)
+}
diff --git a/static/index.html b/static/index.html
index 8916942..4870508 100644
--- a/static/index.html
+++ b/static/index.html
@@ -17,9 +17,9 @@