summaryrefslogtreecommitdiff
path: root/src/gameserver.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-02-16 23:25:04 +0100
committertroido <troido@protonmail.com>2020-02-16 23:25:04 +0100
commitc9a11aec577a0927afb4e97f3041b492621ce666 (patch)
treed27ab608da72a7b17741a76da37886bd85878b8c /src/gameserver.rs
parent10bf24f99efb87b586590b8785ac8fe337db96e5 (diff)
added playerid to avoid stringly typing
Diffstat (limited to 'src/gameserver.rs')
-rw-r--r--src/gameserver.rs37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/gameserver.rs b/src/gameserver.rs
index d7b2ccd..23efc7b 100644
--- a/src/gameserver.rs
+++ b/src/gameserver.rs
@@ -7,6 +7,7 @@ use serde_json::{Value, json};
use super::controls::{Control, Action};
use super::server::Server;
+use crate::PlayerId;
#[derive(Debug)]
@@ -19,8 +20,8 @@ enum Message {
pub struct GameServer {
- players: HashMap<(usize, usize), String>,
- connections: HashMap<String, (usize, usize)>,
+ players: HashMap<(usize, usize), PlayerId>,
+ connections: HashMap<PlayerId, (usize, usize)>,
servers: Vec<Box<dyn Server>>
}
@@ -52,10 +53,10 @@ impl GameServer {
}
}
for id in left {
- if let Some(name) = self.players.remove(&(serverid, id)){
- self.connections.remove(&name);
- self.broadcast_message(&format!("{} disconnected", name));
- actions.push(Action::Leave(name.clone()));
+ if let Some(player) = self.players.remove(&(serverid, id)){
+ self.connections.remove(&player);
+ self.broadcast_message(&format!("{} disconnected", player.name));
+ actions.push(Action::Leave(player.clone()));
}
}
}
@@ -81,8 +82,8 @@ impl GameServer {
}
}
- pub fn send(&mut self, playername: &str, value: Value) -> Result<(), io::Error> {
- match self.connections.get(playername) {
+ pub fn send(&mut self, player: &PlayerId, value: Value) -> Result<(), io::Error> {
+ match self.connections.get(player) {
Some((serverid, id)) => {
self.servers[*serverid].send(*id, value.to_string().as_str())
}
@@ -113,18 +114,19 @@ impl GameServer {
let _ = self.send_error(id, "invalidaction", &format!("You can not change your name"));
return None;
}
- if self.connections.contains_key(&name) {
+ let player = PlayerId{name};
+ if self.connections.contains_key(&player) {
let _ = self.send_error(id, "nametaken", &format!("Another connections to this player exists already"));
return None;
}
- self.broadcast_message(&format!("{} connected", name));
- self.players.insert(id, name.clone());
- self.connections.insert(name.clone(), id);
- Some(Action::Join(name))
+ self.broadcast_message(&format!("{} connected", player.name));
+ self.players.insert(id, player.clone());
+ self.connections.insert(player.clone(), id);
+ Some(Action::Join(player))
}
Message::Chat(text) => {
- if let Some(nameref) = self.players.get(&id) {
- let name = nameref.clone();
+ if let Some(player) = self.players.get(&id) {
+ let name = player.name.clone();
self.broadcast_message(&format!("{}: {}", name, text));
} else {
let _ = self.send_error(id, "invalidaction", &format!("Set a name before you send other messages"));
@@ -132,10 +134,9 @@ impl GameServer {
None
}
Message::Input(inp) => {
- if let Some(nameref) = self.players.get(&id) {
- let name = nameref.clone();
+ if let Some(player) = self.players.get(&id) {
if let Some(control) = Control::from_json(&inp) {
- Some(Action::Input(name, control))
+ Some(Action::Input(player.clone(), control))
} else {
let _ = self.send_error(id, "invalidaction", &format!("unknown action: {}", inp));
None