summaryrefslogtreecommitdiff
path: root/src/gameserver.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-01-27 21:15:07 +0100
committertroido <troido@protonmail.com>2020-01-27 21:15:07 +0100
commit599d7dc27df5e5ba37ef622d520399d7ca331425 (patch)
tree14f540fb9d186d11dedbea40e731ff2e2db2cf44 /src/gameserver.rs
parent62c810b6f8ef7c3feca62637b8361a3386fa43d8 (diff)
started using specs for a room
Diffstat (limited to 'src/gameserver.rs')
-rw-r--r--src/gameserver.rs49
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())
}