diff --git a/src/main.rs b/src/main.rs index 3fcebc7..fd2317c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -25,25 +25,30 @@ fn main() -> std::io::Result<()> { let mut reader = BufReader::new(stream.try_clone().unwrap()); match methods::Session::new(&mut reader, database) { - Ok(session) => loop { - let mut request_string = String::new(); - match reader.read_line(&mut request_string).unwrap() { - 0 => break, - _ => { - let (method, params) = parser::parse(&request_string).unwrap(); - let response = session.handle_request(&method, ¶ms); - stream - .write_all( + Ok((session, res)) => { + writeln!(stream, "{res}").unwrap(); + stream.flush().unwrap(); + + loop { + let mut request_string = String::new(); + match reader.read_line(&mut request_string).unwrap() { + 0 => break, + _ => { + let (method, params) = parser::parse(&request_string).unwrap(); + let response = session.handle_request(&method, ¶ms); + writeln!( + stream, + "{}", match response { Ok(response) => response.to_string(), Err(e) => format!("!{e}"), } - .as_bytes(), ) .unwrap(); - } - }; - }, + } + }; + } + } Err(e) => { stream.write_all(format!("!{e}").as_bytes()).unwrap(); stream diff --git a/src/methods/mod.rs b/src/methods/mod.rs index 0f4f341..83ec9b2 100644 --- a/src/methods/mod.rs +++ b/src/methods/mod.rs @@ -24,14 +24,14 @@ pub struct LocalPlayer { pub struct Session { pub session_token: String, pub database: Arc, - pub player: LocalPlayer, + pub local_player: LocalPlayer, } impl Session { pub fn new( reader: &mut BufReader, database: Arc, - ) -> Result { + ) -> Result<(Self, Response)> { // Read the session token let mut session_token = String::new(); reader @@ -50,15 +50,21 @@ impl Session { } // Parse the player data - let player: LocalPlayer = response + let local_player: LocalPlayer = response .json() .map_err(|_| crate::response::Error::InvalidSession)?; - Ok(Self { + let uuid = local_player.id.clone(); + + let session = Self { session_token, database, - player, - }) + local_player, + }; + + let player = player::player(&session, uuid)?; + + Ok((session, player)) } pub fn handle_request(&self, method: &str, params: &HashMap) -> Result { diff --git a/src/methods/player.rs b/src/methods/player.rs index 1f84eab..fd4a6aa 100644 --- a/src/methods/player.rs +++ b/src/methods/player.rs @@ -17,5 +17,6 @@ pub fn player(session: &Session, uuid: String) -> Result { Ok(Response::Player { cloak: player.cloak, + uuid, }) } diff --git a/src/methods/set_cloak.rs b/src/methods/set_cloak.rs index ebb6c0b..43f19b9 100644 --- a/src/methods/set_cloak.rs +++ b/src/methods/set_cloak.rs @@ -5,16 +5,20 @@ use crate::response::{Response, Result}; use super::Session; pub fn set_cloak(session: &Session, cloak: String) -> Result { - session.database.players.update_one( - doc! { - "uuid": session.player.id.clone(), - }, - doc! { - "$set": { - "cloak": cloak, + session + .database + .players + .update_one( + doc! { + "uuid": session.local_player.id.clone(), }, - }, - ).run()?; + doc! { + "$set": { + "cloak": cloak, + }, + }, + ) + .run()?; Ok(Response::Success) } diff --git a/src/response.rs b/src/response.rs index 4cd95bb..f9a53c0 100644 --- a/src/response.rs +++ b/src/response.rs @@ -4,7 +4,7 @@ pub type Result = std::result::Result; pub enum Response { Pong, Success, - Player { cloak: String }, + Player { cloak: String, uuid: String }, } impl std::fmt::Display for Response { @@ -12,7 +12,7 @@ impl std::fmt::Display for Response { match self { Response::Pong => write!(f, "Pong"), Response::Success => write!(f, "Success"), - Response::Player { cloak } => write!(f, "@cloak={cloak}"), + Response::Player { cloak, uuid } => write!(f, "@cloak={cloak}@uuid={uuid}"), } } }