rust/hedgewars-server/src/server/actions.rs
changeset 14673 08a8605bafaf
parent 14671 455865ccd36c
child 14675 dfe652c53470
equal deleted inserted replaced
14672:6e6632068a33 14673:08a8605bafaf
   111     }
   111     }
   112 }
   112 }
   113 
   113 
   114 pub enum Action {
   114 pub enum Action {
   115     Send(PendingMessage),
   115     Send(PendingMessage),
   116     RemoveClient,
       
   117     ByeClient(String),
       
   118     CheckRegistered,
   116     CheckRegistered,
   119     JoinLobby,
   117     JoinLobby,
   120     RemoveRoom(RoomId),
   118     RemoveRoom(RoomId),
   121     MoveToRoom(RoomId),
   119     MoveToRoom(RoomId),
   122     MoveToLobby(String),
   120     MoveToLobby(String),
   145 use self::Action::*;
   143 use self::Action::*;
   146 
   144 
   147 pub fn run_action(server: &mut HWServer, client_id: usize, action: Action) {
   145 pub fn run_action(server: &mut HWServer, client_id: usize, action: Action) {
   148     match action {
   146     match action {
   149         Send(msg) => server.send(client_id, &msg.destination, msg.message),
   147         Send(msg) => server.send(client_id, &msg.destination, msg.message),
   150         ByeClient(msg) => {
       
   151             let c = &server.clients[client_id];
       
   152             let nick = c.nick.clone();
       
   153 
       
   154             if let Some(id) = c.room_id {
       
   155                 if id != server.lobby_id {
       
   156                     server.react(
       
   157                         client_id,
       
   158                         vec![MoveToLobby(format!("quit: {}", msg.clone()))],
       
   159                     );
       
   160                 }
       
   161             }
       
   162 
       
   163             server.react(
       
   164                 client_id,
       
   165                 vec![
       
   166                     LobbyLeft(nick, msg.clone()).send_all().action(),
       
   167                     Bye(msg).send_self().action(),
       
   168                     RemoveClient,
       
   169                 ],
       
   170             );
       
   171         }
       
   172         RemoveClient => {
       
   173             server.removed_clients.push(client_id);
       
   174             if server.clients.contains(client_id) {
       
   175                 server.clients.remove(client_id);
       
   176             }
       
   177         }
       
   178         CheckRegistered => {
   148         CheckRegistered => {
   179             let client = &server.clients[client_id];
   149             let client = &server.clients[client_id];
   180             if client.protocol_number > 0 && client.nick != "" {
   150             if client.protocol_number > 0 && client.nick != "" {
   181                 let has_nick_clash = server
   151                 let has_nick_clash = server
   182                     .clients
   152                     .clients
   183                     .iter()
   153                     .iter()
   184                     .any(|(id, c)| id != client_id && c.nick == client.nick);
   154                     .any(|(id, c)| id != client_id && c.nick == client.nick);
   185 
   155 
   186                 let actions = if !client.is_checker() && has_nick_clash {
   156                 let actions = if !client.is_checker() && has_nick_clash {
   187                     if client.protocol_number < 38 {
   157                     if client.protocol_number < 38 {
   188                         vec![ByeClient("Nickname is already in use".to_string())]
   158                         //ByeClient("Nickname is already in use".to_string())
       
   159                         vec![]
   189                     } else {
   160                     } else {
   190                         server.clients[client_id].nick.clear();
   161                         server.clients[client_id].nick.clear();
   191                         vec![Notice("NickAlreadyInUse".to_string()).send_self().action()]
   162                         vec![Notice("NickAlreadyInUse".to_string()).send_self().action()]
   192                     }
   163                     }
   193                 } else {
   164                 } else {