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"), |