diff options
| author | troido <troido@protonmail.com> | 2020-01-27 21:15:07 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-01-27 21:15:07 +0100 |
| commit | 599d7dc27df5e5ba37ef622d520399d7ca331425 (patch) | |
| tree | 14f540fb9d186d11dedbea40e731ff2e2db2cf44 /src/gameserver.rs | |
| parent | 62c810b6f8ef7c3feca62637b8361a3386fa43d8 (diff) | |
started using specs for a room
Diffstat (limited to 'src/gameserver.rs')
| -rw-r--r-- | src/gameserver.rs | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/src/gameserver.rs b/src/gameserver.rs index 2412e28..3a63dc4 100644 --- a/src/gameserver.rs +++ b/src/gameserver.rs @@ -9,6 +9,7 @@ use json::JsonValue; use super::server::Server; +#[derive(Debug)] enum Message { Name(String), Chat(String), @@ -16,6 +17,7 @@ enum Message { Invalid(String) } +#[derive(Debug)] pub enum Action { Join(String), Leave(String), @@ -25,11 +27,11 @@ pub enum Action { pub struct GameServer { players: HashMap<(usize, usize), String>, connections: HashMap<String, (usize, usize)>, - servers: Vec<Box<Server>> + servers: Vec<Box<dyn Server>> } impl GameServer { - pub fn new(servers: Vec<Box<Server>>) -> GameServer { + pub fn new(servers: Vec<Box<dyn Server>>) -> GameServer { GameServer { players: HashMap::new(), connections: HashMap::new(), @@ -71,19 +73,41 @@ impl GameServer { } pub fn broadcast_message(&mut self, text: &str){ - println!("{}", text); - let jsontext = json::stringify(json::array!["message", text]); + println!("m {}", text); + self.broadcast_json(json::array!["message", text, ""]); + } + + pub fn broadcast_json(&mut self, value: JsonValue){ + let jsontext = json::stringify(value); for ((serverid, id), _name) in &self.players { let _ = self.servers[*serverid].send(*id, &jsontext); } } + pub fn send(&mut self, playername: &str, value: JsonValue) -> Result<(), io::Error> { + let jsontext = json::stringify(value); + match self.connections.get(playername) { + Some((serverid, id)) => { + self.servers[*serverid].send(*id, &jsontext) + } + None => Err(io::Error::new(io::ErrorKind::Other, "unknown player name")) + } + } + fn handle_message(&mut self, (serverid, connectionid): (usize, usize), msg: Message) -> Option<Action> { let id = (serverid, connectionid); match msg { Message::Name(name) => { + if name.len() > 256 { + let _ = self.send_error(id, "invalidname", "A name can not be longer than 256 bytes"); + return None + } + if name.len() == 0 { + let _ = self.send_error(id, "invalidname", "A name must have at least one character"); + return None + } let (firstchar, username) = name.split_at(1); - if firstchar == "~"{ + if firstchar == "~" { if Some(username.to_string()) != self.servers[serverid].get_name(connectionid) { let _ = self.send_error(id, "invalidname", &format!("A tilde name must match your username")); return None; @@ -103,14 +127,23 @@ impl GameServer { Some(Action::Join(name)) } Message::Chat(text) => { - if let Some(name) = self.players.get(&id) { + if let Some(nameref) = self.players.get(&id) { + let name = nameref.clone(); self.broadcast_message(&format!("{}: {}", name, text)); } else { let _ = self.send_error(id, "invalidaction", &format!("Set a name before you send other messages")); } None } - Message::Input(_) => { None } + Message::Input(inp) => { + if let Some(nameref) = self.players.get(&id) { + let name = nameref.clone(); + Some(Action::Input(name, inp)) + } else { + let _ = self.send_error(id, "invalidaction", &format!("Set a name before you send other messages")); + None + } + } Message::Invalid(text) => { let _ = self.send_error(id, "invalidmessage", &format!("Invalid: {}", text)); None @@ -139,7 +172,7 @@ fn parse_message(msg: &str) -> Message { } "chat" => { if let Some(text) = arr[1].as_str(){ - Message::Chat(text.to_string()) + Message::Chat(text.escape_debug().to_string()) } else { Message::Invalid("chat text is not a string".to_string()) } |
