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 { |