aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKatharina Fey <kookie@spacekookie.de>2020-03-19 07:58:54 +0100
committerKatharina Fey <kookie@spacekookie.de>2020-03-19 07:58:54 +0100
commit64a0db905d24270a2af0faeef99c11f33aa601a0 (patch)
treef7df867a4e1c03efbe1c977e9c963cbe979fea70
parent8d1556fce91bbd4301cd13d4ad087640d343fad1 (diff)
Starting work on the game server
-rw-r--r--src/server.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/server.rs b/src/server.rs
new file mode 100644
index 000000000000..d8be64ee7b95
--- /dev/null
+++ b/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),
+ }
+ }
+}