Starting work on the game server

wip/yesman
Katharina Fey 4 years ago
parent 8d1556fce9
commit 64a0db905d
Signed by: kookie
GPG Key ID: F972AEEA2887D547
  1. 73
      src/server.rs

@ -0,0 +1,73 @@
use crate::{
map::Map,
wire::{Match, MatchId, MatchUser, Response, User, UserId},
};
use async_std::sync::{Arc, Mutex};
use std::{collections::BTreeMap, path::Path};
/// A convenience result wrapper for server actions
pub type Result<T> = std::result::Result<T, ServerErr>;
pub enum ServerErr {
/// The requested directory is corrupted
NoSuchDir,
/// Corrupted game state
Corrupted,
/// No such match found
NoSuchMatch,
}
/// The game's server backend
pub struct Server {
matches: BTreeMap<MatchId, Mutex<Match>>,
users: BTreeMap<UserId, User>,
}
impl Server {
/// Create a new game server
fn new() -> Self {
Self {
matches: Default::default(),
users: Default::default(),
}
}
/// Open the state dir of a game server
pub async fn open(self: Arc<Self>, path: &Path) -> Result<()> {
Ok(())
}
/// Stop accepting new game connections and shutdown gracefully
///
/// Returns the number of matches still going on.
pub async fn shutdown(self: Arc<Self>) -> Result<u64> {
Ok(0)
}
/// Save and close the statedir and kicking all players
///
/// Returns the number of players that were kicked off the server
/// prematurely.
pub async fn kill(self: Arc<Self>) -> Result<u64> {
Ok(0)
}
pub async fn update_map<F>(self: Arc<Self>, id: MatchId, cb: F) -> Result<Response>
where
F: Fn(&mut Map) -> Result<Response>,
{
match self.matches.get(&id) {
Some(ref mut m) => m.lock().await.map.update(cb),
None => Err(ServerErr::NoSuchMatch),
}
}
pub async fn update_players<F>(self: Arc<Self>, id: MatchId, cb: F) -> Result<Response>
where
F: Fn(&mut Vec<MatchUser>) -> Result<Response>,
{
match self.matches.get(&id) {
Some(ref mut m) => cb(&mut m.lock().await.players),
None => Err(ServerErr::NoSuchMatch),
}
}
}
Loading…
Cancel
Save