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 |