diff options
Diffstat (limited to 'src/server.rs')
-rw-r--r-- | src/server.rs | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/server.rs b/src/server.rs index 6ddfb70a9d41..7a2fad27bb1f 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,10 +1,13 @@ use crate::{ _if::GameIf, + _match::Match, + data::Player, + lobby::LobbyList, map::Map, users::UserStore, wire::{ - Action, AuthErr, Lobby, LobbyId, Match, MatchErr, MatchId, MatchUser, RegErr, Response, - RoomErr, RoomUpdate, UpdateState, User, UserId, + Action, AuthErr, Lobby, LobbyErr, LobbyId, LobbyUpdate, MatchErr, MatchId, RegErr, + Response, UpdateState, User, UserId, }, }; use async_std::sync::{Arc, Mutex, RwLock}; @@ -27,6 +30,7 @@ pub enum ServerErr { pub struct Server { matches: BTreeMap<MatchId, Mutex<Match>>, users: UserStore, + lobbies: LobbyList, } impl Server { @@ -35,6 +39,7 @@ impl Server { Self { matches: Default::default(), users: UserStore::new(), + lobbies: LobbyList::new(), } } @@ -63,14 +68,14 @@ impl Server { F: Fn(&mut Map) -> ServerResult<Response>, { match self.matches.get(&id) { - Some(ref mut m) => m.lock().await.map.update(cb), + Some(ref m) => m.lock().await.map.update(cb), None => Err(ServerErr::NoSuchMatch), } } pub async fn update_players<F>(self: Arc<Self>, id: MatchId, cb: F) -> ServerResult<Response> where - F: Fn(&mut Vec<MatchUser>) -> ServerResult<Response>, + F: Fn(&mut Vec<Player>) -> ServerResult<Response>, { match self.matches.get(&id) { Some(ref mut m) => cb(&mut m.lock().await.players), @@ -98,20 +103,36 @@ impl GameIf for Server { Ok(auth) } - async fn join(self: Arc<Self>, user: User, lobby: LobbyId) -> Result<Lobby, RoomErr> { - unimplemented!() + async fn join(self: Arc<Self>, user: User, lobby: LobbyId) -> Result<Lobby, LobbyErr> { + let mu = self.users.get(&user).await?; + self.lobbies.get_mut(lobby, |mut l| l.join(&mu)).await } - async fn leave(self: Arc<Self>, user: User, lobby: LobbyId) -> Result<(), RoomErr> { - unimplemented!() + async fn leave(self: Arc<Self>, user: User, lobby: LobbyId) -> Result<(), LobbyErr> { + let mu = self.users.get(&user).await?; + self.lobbies.get_mut(lobby, |mut l| l.leave(&mu)).await } - async fn ready(self: Arc<Self>, user: User, lobby: LobbyId, ready: bool) -> RoomUpdate { - unimplemented!() + async fn ready( + self: Arc<Self>, + user: User, + lobby: LobbyId, + ready: bool, + ) -> Result<LobbyUpdate, LobbyErr> { + self.lobbies + .get_mut(lobby, |mut l| l.ready(user, ready)) + .await } - async fn start_req(self: Arc<Self>, user: User, lobby: LobbyId) -> DateTime<Utc> { - unimplemented!() + /// A start request was received + async fn start_req( + self: Arc<Self>, + user: UserId, + lobby: LobbyId, + ) -> Result<DateTime<Utc>, LobbyErr> { + self.lobbies.get_mut(lobby, |mut l| l.start(user)).await?; + let lob = self.lobbies.consume(lobby).await?; + Ok(Utc::now()) } async fn perform_action( |