rust/hedgewars-server/src/server/handlers/common.rs
changeset 14683 932ff7683653
parent 14675 dfe652c53470
child 14686 9f98086de1b6
equal deleted inserted replaced
14682:204fb862d0e4 14683:932ff7683653
     1 use crate::server::client::HWClient;
     1 use crate::server::client::HWClient;
       
     2 use crate::server::coretypes::ClientId;
     2 use crate::server::room::HWRoom;
     3 use crate::server::room::HWRoom;
     3 use crate::utils::to_engine_msg;
     4 use crate::utils::to_engine_msg;
     4 use crate::{
     5 use crate::{
     5     protocol::messages::{
     6     protocol::messages::{
     6         HWProtocolMessage::{self, Rnd},
     7         HWProtocolMessage::{self, Rnd},
     7         HWServerMessage::{
     8         HWServerMessage::{
     8             self, Bye, ChatMsg, ClientFlags, ForwardEngineMessage, LobbyLeft, RoomLeft, RoomRemove,
     9             self, Bye, ChatMsg, ClientFlags, ForwardEngineMessage, LobbyJoined, LobbyLeft, Notice,
     9             RoomUpdated, TeamRemove,
    10             RoomLeft, RoomRemove, RoomUpdated, Rooms, ServerMessage, TeamRemove,
    10         },
    11         },
    11     },
    12     },
    12     server::{actions::Action, core::HWServer},
    13     server::{actions::Action, core::HWServer},
    13 };
    14 };
    14 use rand::{self, thread_rng, Rng};
    15 use rand::{self, thread_rng, Rng};
    23     };
    24     };
    24 
    25 
    25     ChatMsg {
    26     ChatMsg {
    26         nick: "[random]".to_owned(),
    27         nick: "[random]".to_owned(),
    27         msg: reply.clone(),
    28         msg: reply.clone(),
       
    29     }
       
    30 }
       
    31 
       
    32 pub fn process_login(server: &mut HWServer, response: &mut super::Response) {
       
    33     let client_id = response.client_id();
       
    34     let nick = server.clients[client_id].nick.clone();
       
    35 
       
    36     let has_nick_clash = server
       
    37         .clients
       
    38         .iter()
       
    39         .any(|(id, c)| id != client_id && c.nick == nick);
       
    40 
       
    41     let client = &mut server.clients[client_id];
       
    42 
       
    43     if !client.is_checker() && has_nick_clash {
       
    44         if client.protocol_number < 38 {
       
    45             remove_client(server, response, "Nickname is already in use".to_string());
       
    46         } else {
       
    47             client.nick.clear();
       
    48             response.add(Notice("NickAlreadyInUse".to_string()).send_self());
       
    49         }
       
    50     } else {
       
    51         server.clients[client_id].room_id = Some(server.lobby_id);
       
    52 
       
    53         let lobby_nicks: Vec<_> = server
       
    54             .clients
       
    55             .iter()
       
    56             .filter_map(|(_, c)| c.room_id.and(Some(c.nick.clone())))
       
    57             .collect();
       
    58         let joined_msg = LobbyJoined(lobby_nicks);
       
    59 
       
    60         let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]);
       
    61         let flags_msg = ClientFlags(
       
    62             "+i".to_string(),
       
    63             server
       
    64                 .clients
       
    65                 .iter()
       
    66                 .filter(|(_, c)| c.room_id.is_some())
       
    67                 .map(|(_, c)| c.nick.clone())
       
    68                 .collect(),
       
    69         );
       
    70         let server_msg = ServerMessage("\u{1f994} is watching".to_string());
       
    71 
       
    72         let rooms_msg = Rooms(
       
    73             server
       
    74                 .rooms
       
    75                 .iter()
       
    76                 .filter(|(id, _)| *id != server.lobby_id)
       
    77                 .flat_map(|(_, r)| r.info(r.master_id.map(|id| &server.clients[id])))
       
    78                 .collect(),
       
    79         );
       
    80 
       
    81         response.add(everyone_msg.send_all().but_self());
       
    82         response.add(joined_msg.send_self());
       
    83         response.add(flags_msg.send_self());
       
    84         response.add(server_msg.send_self());
       
    85         response.add(rooms_msg.send_self());
    28     }
    86     }
    29 }
    87 }
    30 
    88 
    31 pub fn remove_teams(
    89 pub fn remove_teams(
    32     room: &mut HWRoom,
    90     room: &mut HWRoom,
   130 
   188 
   131 #[cfg(test)]
   189 #[cfg(test)]
   132 mod tests {
   190 mod tests {
   133     use super::*;
   191     use super::*;
   134     use crate::protocol::messages::HWServerMessage::ChatMsg;
   192     use crate::protocol::messages::HWServerMessage::ChatMsg;
   135     use crate::server::actions::{
   193     use crate::server::actions::PendingMessage;
   136         Action::{self, Send},
       
   137         PendingMessage,
       
   138     };
       
   139 
   194 
   140     fn reply2string(r: HWServerMessage) -> String {
   195     fn reply2string(r: HWServerMessage) -> String {
   141         match r {
   196         match r {
   142             ChatMsg { msg: p, .. } => String::from(p),
   197             ChatMsg { msg: p, .. } => String::from(p),
   143             _ => panic!("expected a ChatMsg"),
   198             _ => panic!("expected a ChatMsg"),