diff --git a/src/database.rs b/src/database.rs index 4915ef1..f224267 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, Clone)] pub struct Player { pub uuid: String, pub cloaks: Vec, diff --git a/src/methods/mod.rs b/src/methods/mod.rs index 83ec9b2..18cc8af 100644 --- a/src/methods/mod.rs +++ b/src/methods/mod.rs @@ -8,6 +8,7 @@ use std::{ sync::Arc, }; +use player::create; use serde::{Deserialize, Serialize}; use crate::{ @@ -62,9 +63,14 @@ impl Session { local_player, }; - let player = player::player(&session, uuid)?; - - Ok((session, player)) + match player::player(&session, uuid) { + Ok(player) => Ok((session, player)), + Err(crate::response::Error::DatabaseError) => { + let player = create(&session)?; + Ok((session, player)) + } + Err(e) => Err(e), + } } pub fn handle_request(&self, method: &str, params: &HashMap) -> Result { diff --git a/src/methods/player.rs b/src/methods/player.rs index fd4a6aa..7e48780 100644 --- a/src/methods/player.rs +++ b/src/methods/player.rs @@ -1,6 +1,9 @@ use mongodb::bson::doc; -use crate::response::{Response, Result}; +use crate::{ + database::Player, + response::{Response, Result}, +}; use super::Session; @@ -12,11 +15,29 @@ pub fn player(session: &Session, uuid: String) -> Result { "uuid": uuid.clone(), }) .run()? - .deserialize_current() - .unwrap(); + .deserialize_current()?; Ok(Response::Player { cloak: player.cloak, uuid, + cloaks: player.cloaks, + }) +} + +pub fn create(session: &Session) -> Result { + let uuid = session.local_player.id.clone(); + + let player = Player { + cloak: "".to_string(), + cloaks: Vec::new(), + uuid: uuid.clone(), + }; + + session.database.players.insert_one(player.clone()).run()?; + + Ok(Response::Player { + cloak: player.cloak, + uuid, + cloaks: player.cloaks, }) } diff --git a/src/response.rs b/src/response.rs index f9a53c0..bcde811 100644 --- a/src/response.rs +++ b/src/response.rs @@ -4,7 +4,11 @@ pub type Result = std::result::Result; pub enum Response { Pong, Success, - Player { cloak: String, uuid: String }, + Player { + cloak: String, + uuid: String, + cloaks: Vec, + }, } impl std::fmt::Display for Response { @@ -12,7 +16,11 @@ impl std::fmt::Display for Response { match self { Response::Pong => write!(f, "Pong"), Response::Success => write!(f, "Success"), - Response::Player { cloak, uuid } => write!(f, "@cloak={cloak}@uuid={uuid}"), + Response::Player { + cloak, + uuid, + cloaks, + } => write!(f, "@cloak={cloak}@uuid={uuid}@cloaks={}", cloaks.join("$")), } } }