rust/hedgewars-server/src/server/handlers/common.rs
changeset 14781 01f8ab45f806
parent 14697 f64e21f164a5
child 14782 50fcef24003f
equal deleted inserted replaced
14780:65861ba8b4e8 14781:01f8ab45f806
    31         nick: "[random]".to_string(),
    31         nick: "[random]".to_string(),
    32         msg: reply,
    32         msg: reply,
    33     }
    33     }
    34 }
    34 }
    35 
    35 
    36 pub fn process_login(server: &mut HWServer, response: &mut Response) {
    36 pub fn join_lobby(server: &mut HWServer, response: &mut Response) {
    37     let client_id = response.client_id();
    37     let client_id = response.client_id();
    38     let nick = server.clients[client_id].nick.clone();
    38 
    39 
    39     let lobby_nicks: Vec<_> = server.collect_nicks(|(_, c)| c.room_id.is_none());
    40     let has_nick_clash = server
    40 
    41         .clients
    41     let joined_msg = LobbyJoined(lobby_nicks);
    42         .iter()
    42 
    43         .any(|(id, c)| id != client_id && c.nick == nick);
    43     let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]);
    44 
    44     let flags_msg = ClientFlags(
    45     let client = &mut server.clients[client_id];
    45         "+i".to_string(),
    46 
    46         server.collect_nicks(|(_, c)| c.room_id.is_some()),
    47     if !client.is_checker() && has_nick_clash {
    47     );
    48         if client.protocol_number < 38 {
    48     let server_msg = ServerMessage("\u{1f994} is watching".to_string());
    49             remove_client(server, response, "Nickname is already in use".to_string());
    49 
    50         } else {
    50     let rooms_msg = Rooms(
    51             client.nick.clear();
    51         server
    52             response.add(Notice("NickAlreadyInUse".to_string()).send_self());
    52             .rooms
    53         }
       
    54     } else {
       
    55         server.clients[client_id].room_id = None;
       
    56 
       
    57         let lobby_nicks: Vec<_> = server
       
    58             .clients
       
    59             .iter()
    53             .iter()
    60             .filter_map(|(_, c)| c.room_id.and(Some(c.nick.clone())))
    54             .flat_map(|(_, r)| r.info(r.master_id.map(|id| &server.clients[id])))
    61             .collect();
    55             .collect(),
    62         let joined_msg = LobbyJoined(lobby_nicks);
    56     );
    63 
    57 
    64         let everyone_msg = LobbyJoined(vec![server.clients[client_id].nick.clone()]);
    58     response.add(everyone_msg.send_all().but_self());
    65         let flags_msg = ClientFlags(
    59     response.add(joined_msg.send_self());
    66             "+i".to_string(),
    60     response.add(flags_msg.send_self());
    67             server
    61     response.add(server_msg.send_self());
    68                 .clients
    62     response.add(rooms_msg.send_self());
    69                 .iter()
       
    70                 .filter(|(_, c)| c.room_id.is_some())
       
    71                 .map(|(_, c)| c.nick.clone())
       
    72                 .collect(),
       
    73         );
       
    74         let server_msg = ServerMessage("\u{1f994} is watching".to_string());
       
    75 
       
    76         let rooms_msg = Rooms(
       
    77             server
       
    78                 .rooms
       
    79                 .iter()
       
    80                 .flat_map(|(_, r)| r.info(r.master_id.map(|id| &server.clients[id])))
       
    81                 .collect(),
       
    82         );
       
    83 
       
    84         response.add(everyone_msg.send_all().but_self());
       
    85         response.add(joined_msg.send_self());
       
    86         response.add(flags_msg.send_self());
       
    87         response.add(server_msg.send_self());
       
    88         response.add(rooms_msg.send_self());
       
    89     }
       
    90 }
    63 }
    91 
    64 
    92 pub fn remove_teams(
    65 pub fn remove_teams(
    93     room: &mut HWRoom,
    66     room: &mut HWRoom,
    94     team_names: Vec<String>,
    67     team_names: Vec<String>,
   190         let room = &mut server.rooms[room_id];
   163         let room = &mut server.rooms[room_id];
   191 
   164 
   192         remove_client_from_room(client, room, response, msg);
   165         remove_client_from_room(client, room, response, msg);
   193 
   166 
   194         if !room.is_fixed() && room.master_id == None {
   167         if !room.is_fixed() && room.master_id == None {
   195             if let Some(new_master_id) = server.room_clients(room_id).first().cloned() {
   168             if let Some(new_master_id) = server.collect_room_clients(room_id).first().cloned() {
   196                 let new_master_nick = server.clients[new_master_id].nick.clone();
   169                 let new_master_nick = server.clients[new_master_id].nick.clone();
   197                 let room = &mut server.rooms[room_id];
   170                 let room = &mut server.rooms[room_id];
   198                 room.master_id = Some(new_master_id);
   171                 room.master_id = Some(new_master_id);
   199                 server.clients[new_master_id].set_is_master(true);
   172                 server.clients[new_master_id].set_is_master(true);
   200 
   173