gameServer2/src/server/handlers/inroom.rs
changeset 13416 cdf69667593b
parent 13119 1e39b8749072
child 13419 81e0ed105f5d
--- a/gameServer2/src/server/handlers/inroom.rs	Thu Jun 14 16:44:27 2018 -0400
+++ b/gameServer2/src/server/handlers/inroom.rs	Mon Jun 18 09:22:53 2018 -0400
@@ -1,13 +1,52 @@
 use mio;
 
-use server::server::HWServer;
-use server::actions::Action;
-use server::actions::Action::*;
-use protocol::messages::HWProtocolMessage;
-use protocol::messages::HWServerMessage::*;
+use server::{
+    server::HWServer,
+    actions::{Action, Action::*}
+};
+use protocol::messages::{
+    HWProtocolMessage,
+    HWServerMessage::*
+};
+use utils::is_name_illegal;
+use std::mem::swap;
 
 pub fn handle(server: &mut HWServer, token: usize, message: HWProtocolMessage) {
+    use protocol::messages::HWProtocolMessage::*;
     match message {
+        Part(None) => server.react(token, vec![
+            MoveToLobby("part".to_string())]),
+        Part(Some(msg)) => server.react(token, vec![
+            MoveToLobby(format!("part: {}", msg))]),
+        Chat(msg) => {
+            let chat_msg;
+            let room_id;
+            {
+                let c = &mut server.clients[token];
+                chat_msg = ChatMsg(c.nick.clone(), msg);
+                room_id = c.room_id;
+            }
+            let client_ids = server.other_clients_in_room(token);
+            server.react(token, vec![
+                SendToSelected(client_ids, chat_msg)]);
+        },
+        RoomName(new_name) => {
+            let actions =
+                if is_name_illegal(&new_name) {
+                    vec![Warn("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())]
+                } else if server.has_room(&new_name) {
+                    vec![Warn("A room with the same name already exists.".to_string())]
+                } else {
+                    let mut old_name = new_name.clone();
+                    if let (c, Some(r)) = server.client_and_room(token) {
+                        swap(&mut r.name, &mut old_name);
+                        vec![SendRoomUpdate(Some(old_name))]
+                    } else {
+                        Vec::new()
+                    }
+                };
+            server.react(token, actions);
+        }
         _ => warn!("Unimplemented!"),
     }
 }