111 Part(msg) => { |
111 Part(msg) => { |
112 let lobby_id = server.lobby_id; |
112 let lobby_id = server.lobby_id; |
113 if let (client, Some(room)) = server.client_and_room(client_id) { |
113 if let (client, Some(room)) = server.client_and_room(client_id) { |
114 let msg = match msg { |
114 let msg = match msg { |
115 Some(s) => format!("part: {}", s), |
115 Some(s) => format!("part: {}", s), |
116 None => "part".to_string() |
116 None => "part".to_string(), |
117 }; |
117 }; |
118 super::common::exit_room(client, room, response, &msg); |
118 super::common::exit_room(client, room, response, &msg); |
119 client.room_id = Some(lobby_id); |
119 client.room_id = Some(lobby_id); |
120 } |
120 } |
121 }, |
121 } |
122 Chat(msg) => { |
122 Chat(msg) => { |
123 let client = &mut server.clients[client_id]; |
123 let client = &mut server.clients[client_id]; |
124 response.add(ChatMsg {nick: client.nick.clone(), msg}.send_all().in_room(room_id)); |
124 response.add( |
125 }, |
125 ChatMsg { |
|
126 nick: client.nick.clone(), |
|
127 msg, |
|
128 } |
|
129 .send_all() |
|
130 .in_room(room_id), |
|
131 ); |
|
132 } |
126 Fix => { |
133 Fix => { |
127 if let (client, Some(room)) = server.client_and_room(client_id) { |
134 if let (client, Some(room)) = server.client_and_room(client_id) { |
128 if client.is_admin() { room.set_is_fixed(true) } |
135 if client.is_admin() { |
|
136 room.set_is_fixed(true) |
|
137 } |
129 } |
138 } |
130 } |
139 } |
131 Unfix => { |
140 Unfix => { |
132 if let (client, Some(room)) = server.client_and_room(client_id) { |
141 if let (client, Some(room)) = server.client_and_room(client_id) { |
133 if client.is_admin() { room.set_is_fixed(false) } |
142 if client.is_admin() { |
|
143 room.set_is_fixed(false) |
|
144 } |
134 } |
145 } |
135 } |
146 } |
136 Greeting(text) => { |
147 Greeting(text) => { |
137 if let (clienr, Some(room)) = server.client_and_room(client_id) { |
148 if let (clienr, Some(room)) = server.client_and_room(client_id) { |
138 if clienr.is_admin() || clienr.is_master() && !room.is_fixed() { |
149 if clienr.is_admin() || clienr.is_master() && !room.is_fixed() { |
144 if is_name_illegal(&new_name) { |
155 if is_name_illegal(&new_name) { |
145 response.add(Warning("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self()); |
156 response.add(Warning("Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string()).send_self()); |
146 } else if server.rooms[room_id].is_fixed() { |
157 } else if server.rooms[room_id].is_fixed() { |
147 response.add(Warning("Access denied.".to_string()).send_self()); |
158 response.add(Warning("Access denied.".to_string()).send_self()); |
148 } else if server.has_room(&new_name) { |
159 } else if server.has_room(&new_name) { |
149 response.add(Warning("A room with the same name already exists.".to_string()).send_self()); |
160 response.add( |
|
161 Warning("A room with the same name already exists.".to_string()).send_self(), |
|
162 ); |
150 } else { |
163 } else { |
151 let mut old_name = new_name.clone(); |
164 let mut old_name = new_name.clone(); |
152 let client = &server.clients[client_id]; |
165 let client = &server.clients[client_id]; |
153 let room = &mut server.rooms[room_id]; |
166 let room = &mut server.rooms[room_id]; |
154 swap(&mut room.name, &mut old_name); |
167 swap(&mut room.name, &mut old_name); |
155 let update_msg = RoomUpdated(old_name, room.info(Some(client))); |
168 let update_msg = RoomUpdated(old_name, room.info(Some(client))); |
156 response.add(update_msg.send_all().with_protocol(room.protocol_number)); |
169 response.add(update_msg.send_all().with_protocol(room.protocol_number)); |
157 }; |
170 }; |
158 }, |
171 } |
159 ToggleReady => { |
172 ToggleReady => { |
160 if let (client, Some(room)) = server.client_and_room(client_id) { |
173 if let (client, Some(room)) = server.client_and_room(client_id) { |
161 let flags = if client.is_ready() { |
174 let flags = if client.is_ready() { |
162 room.ready_players_number -= 1; |
175 room.ready_players_number -= 1; |
163 "-r" |
176 "-r" |
184 if room.teams.len() >= room.team_limit as usize { |
197 if room.teams.len() >= room.team_limit as usize { |
185 response.add(Warning("Too many teams!".to_string()).send_self()); |
198 response.add(Warning("Too many teams!".to_string()).send_self()); |
186 } else if room.addable_hedgehogs() == 0 { |
199 } else if room.addable_hedgehogs() == 0 { |
187 response.add(Warning("Too many hedgehogs!".to_string()).send_self()); |
200 response.add(Warning("Too many hedgehogs!".to_string()).send_self()); |
188 } else if room.find_team(|t| t.name == info.name) != None { |
201 } else if room.find_team(|t| t.name == info.name) != None { |
189 response.add(Warning("There's already a team with same name in the list.".to_string()).send_self()); |
202 response.add( |
|
203 Warning("There's already a team with same name in the list.".to_string()) |
|
204 .send_self(), |
|
205 ); |
190 } else if room.game_info.is_some() { |
206 } else if room.game_info.is_some() { |
191 response.add(Warning("Joining not possible: Round is in progress.".to_string()).send_self()); |
207 response.add( |
|
208 Warning("Joining not possible: Round is in progress.".to_string()) |
|
209 .send_self(), |
|
210 ); |
192 } else if room.is_team_add_restricted() { |
211 } else if room.is_team_add_restricted() { |
193 response.add(Warning("This room currently does not allow adding new teams.".to_string()).send_self()); |
212 response.add( |
|
213 Warning("This room currently does not allow adding new teams.".to_string()) |
|
214 .send_self(), |
|
215 ); |
194 } else { |
216 } else { |
195 let team = room.add_team(client.id, *info, client.protocol_number < 42); |
217 let team = room.add_team(client.id, *info, client.protocol_number < 42); |
196 client.teams_in_game += 1; |
218 client.teams_in_game += 1; |
197 client.clan = Some(team.color); |
219 client.clan = Some(team.color); |
198 response.add(TeamAccepted(team.name.clone()) |
220 response.add(TeamAccepted(team.name.clone()).send_self()); |
199 .send_self()); |
221 response.add( |
200 response.add(TeamAdd(HWRoom::team_info(&client, team)) |
222 TeamAdd(HWRoom::team_info(&client, team)) |
201 .send_all().in_room(room_id).but_self()); |
223 .send_all() |
202 response.add(TeamColor(team.name.clone(), team.color) |
224 .in_room(room_id) |
203 .send_all().in_room(room_id)); |
225 .but_self(), |
204 response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number) |
226 ); |
205 .send_all().in_room(room_id)); |
227 response.add( |
|
228 TeamColor(team.name.clone(), team.color) |
|
229 .send_all() |
|
230 .in_room(room_id), |
|
231 ); |
|
232 response.add( |
|
233 HedgehogsNumber(team.name.clone(), team.hedgehogs_number) |
|
234 .send_all() |
|
235 .in_room(room_id), |
|
236 ); |
206 |
237 |
207 let update_msg = RoomUpdated(room.name.clone(), room.info(Some(client))); |
238 let update_msg = RoomUpdated(room.name.clone(), room.info(Some(client))); |
208 response.add(update_msg.send_all().with_protocol(room.protocol_number)); |
239 response.add(update_msg.send_all().with_protocol(room.protocol_number)); |
209 } |
240 } |
210 } |
241 } |
211 }, |
242 } |
212 RemoveTeam(name) => { |
243 RemoveTeam(name) => { |
213 if let (client, Some(room)) = server.client_and_room(client_id) { |
244 if let (client, Some(room)) = server.client_and_room(client_id) { |
214 match room.find_team_owner(&name) { |
245 match room.find_team_owner(&name) { |
215 None => |
246 None => response.add( |
216 response.add(Warning("Error: The team you tried to remove does not exist.".to_string()).send_self()), |
247 Warning("Error: The team you tried to remove does not exist.".to_string()) |
217 Some((id, _)) if id != client_id => |
248 .send_self(), |
218 response.add(Warning("You can't remove a team you don't own.".to_string()).send_self()), |
249 ), |
|
250 Some((id, _)) if id != client_id => response.add( |
|
251 Warning("You can't remove a team you don't own.".to_string()).send_self(), |
|
252 ), |
219 Some((_, name)) => { |
253 Some((_, name)) => { |
220 client.teams_in_game -= 1; |
254 client.teams_in_game -= 1; |
221 client.clan = room.find_team_color(client.id); |
255 client.clan = room.find_team_color(client.id); |
222 super::common::remove_teams(room, vec![name.to_string()], client.is_in_game(), response); |
256 super::common::remove_teams( |
223 } |
257 room, |
224 } |
258 vec![name.to_string()], |
225 } |
259 client.is_in_game(), |
226 }, |
260 response, |
|
261 ); |
|
262 } |
|
263 } |
|
264 } |
|
265 } |
227 SetHedgehogsNumber(team_name, number) => { |
266 SetHedgehogsNumber(team_name, number) => { |
228 if let (client, Some(room)) = server.client_and_room(client_id) { |
267 if let (client, Some(room)) = server.client_and_room(client_id) { |
229 let addable_hedgehogs = room.addable_hedgehogs(); |
268 let addable_hedgehogs = room.addable_hedgehogs(); |
230 if let Some((_, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { |
269 if let Some((_, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { |
231 if !client.is_master() { |
270 if !client.is_master() { |
232 response.add(Error("You're not the room master!".to_string()).send_self()); |
271 response.add(Error("You're not the room master!".to_string()).send_self()); |
233 } else if number < 1 || number > MAX_HEDGEHOGS_PER_TEAM |
272 } else if number < 1 |
234 || number > addable_hedgehogs + team.hedgehogs_number { |
273 || number > MAX_HEDGEHOGS_PER_TEAM |
235 response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send_self()); |
274 || number > addable_hedgehogs + team.hedgehogs_number |
|
275 { |
|
276 response.add( |
|
277 HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send_self(), |
|
278 ); |
236 } else { |
279 } else { |
237 team.hedgehogs_number = number; |
280 team.hedgehogs_number = number; |
238 response.add(HedgehogsNumber(team.name.clone(), number) |
281 response.add( |
239 .send_all().in_room(room_id).but_self()); |
282 HedgehogsNumber(team.name.clone(), number) |
|
283 .send_all() |
|
284 .in_room(room_id) |
|
285 .but_self(), |
|
286 ); |
240 } |
287 } |
241 } else { |
288 } else { |
242 response.add(Warning("No such team.".to_string()).send_self()); |
289 response.add(Warning("No such team.".to_string()).send_self()); |
243 } |
290 } |
244 } |
291 } |
245 }, |
292 } |
246 SetTeamColor(team_name, color) => { |
293 SetTeamColor(team_name, color) => { |
247 if let (client, Some(room)) = server.client_and_room(client_id) { |
294 if let (client, Some(room)) = server.client_and_room(client_id) { |
248 if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { |
295 if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) { |
249 if !client.is_master() { |
296 if !client.is_master() { |
250 response.add(Error("You're not the room master!".to_string()).send_self()); |
297 response.add(Error("You're not the room master!".to_string()).send_self()); |
251 } else { |
298 } else { |
252 team.color = color; |
299 team.color = color; |
253 response.add(TeamColor(team.name.clone(), color) |
300 response.add( |
254 .send_all().in_room(room_id).but_self()); |
301 TeamColor(team.name.clone(), color) |
|
302 .send_all() |
|
303 .in_room(room_id) |
|
304 .but_self(), |
|
305 ); |
255 server.clients[owner].clan = Some(color); |
306 server.clients[owner].clan = Some(color); |
256 } |
307 } |
257 } else { |
308 } else { |
258 response.add(Warning("No such team.".to_string()).send_self()); |
309 response.add(Warning("No such team.".to_string()).send_self()); |
259 } |
310 } |
260 } |
311 } |
261 }, |
312 } |
262 Cfg(cfg) => { |
313 Cfg(cfg) => { |
263 if let (client, Some(room)) = server.client_and_room(client_id) { |
314 if let (client, Some(room)) = server.client_and_room(client_id) { |
264 if room.is_fixed() { |
315 if room.is_fixed() { |
265 response.add(Warning("Access denied.".to_string()).send_self()); |
316 response.add(Warning("Access denied.".to_string()).send_self()); |
266 } else if !client.is_master() { |
317 } else if !client.is_master() { |
273 s.push_str(&values.pop().unwrap()); |
324 s.push_str(&values.pop().unwrap()); |
274 values.push(s); |
325 values.push(s); |
275 } |
326 } |
276 GameCfg::Scheme(name, values) |
327 GameCfg::Scheme(name, values) |
277 } |
328 } |
278 cfg => cfg |
329 cfg => cfg, |
279 }; |
330 }; |
280 |
331 |
281 response.add(cfg.to_server_msg() |
332 response.add(cfg.to_server_msg().send_all().in_room(room.id).but_self()); |
282 .send_all().in_room(room.id).but_self()); |
|
283 room.set_config(cfg); |
333 room.set_config(cfg); |
284 } |
334 } |
285 } |
335 } |
286 } |
336 } |
287 Save(name, location) => { |
337 Save(name, location) => { |
288 response.add(server_chat(format!("Room config saved as {}", name)) |
338 response.add( |
289 .send_all().in_room(room_id)); |
339 server_chat(format!("Room config saved as {}", name)) |
|
340 .send_all() |
|
341 .in_room(room_id), |
|
342 ); |
290 server.rooms[room_id].save_config(name, location); |
343 server.rooms[room_id].save_config(name, location); |
291 } |
344 } |
292 SaveRoom(filename) => { |
345 SaveRoom(filename) => { |
293 if server.clients[client_id].is_admin() { |
346 if server.clients[client_id].is_admin() { |
294 match server.rooms[room_id].get_saves() { |
347 match server.rooms[room_id].get_saves() { |
295 Ok(text) => match server.io.write_file(&filename, &text) { |
348 Ok(text) => match server.io.write_file(&filename, &text) { |
296 Ok(_) => response.add(server_chat("Room configs saved successfully.".to_string()) |
349 Ok(_) => response.add( |
297 .send_self()), |
350 server_chat("Room configs saved successfully.".to_string()).send_self(), |
|
351 ), |
298 Err(e) => { |
352 Err(e) => { |
299 warn!("Error while writing the config file \"{}\": {}", filename, e); |
353 warn!( |
300 response.add(Warning("Unable to save the room configs.".to_string()).send_self()); |
354 "Error while writing the config file \"{}\": {}", |
301 } |
355 filename, e |
302 } |
356 ); |
|
357 response.add( |
|
358 Warning("Unable to save the room configs.".to_string()).send_self(), |
|
359 ); |
|
360 } |
|
361 }, |
303 Err(e) => { |
362 Err(e) => { |
304 warn!("Error while serializing the room configs: {}", e); |
363 warn!("Error while serializing the room configs: {}", e); |
305 response.add(Warning("Unable to serialize the room configs.".to_string()).send_self()) |
364 response.add( |
|
365 Warning("Unable to serialize the room configs.".to_string()) |
|
366 .send_self(), |
|
367 ) |
306 } |
368 } |
307 } |
369 } |
308 } |
370 } |
309 } |
371 } |
310 LoadRoom(filename) => { |
372 LoadRoom(filename) => { |
311 if server.clients[client_id].is_admin() { |
373 if server.clients[client_id].is_admin() { |
312 match server.io.read_file(&filename) { |
374 match server.io.read_file(&filename) { |
313 Ok(text) => match server.rooms[room_id].set_saves(&text) { |
375 Ok(text) => match server.rooms[room_id].set_saves(&text) { |
314 Ok(_) => response.add(server_chat("Room configs loaded successfully.".to_string()) |
376 Ok(_) => response.add( |
315 .send_self()), |
377 server_chat("Room configs loaded successfully.".to_string()) |
|
378 .send_self(), |
|
379 ), |
316 Err(e) => { |
380 Err(e) => { |
317 warn!("Error while deserializing the room configs: {}", e); |
381 warn!("Error while deserializing the room configs: {}", e); |
318 response.add(Warning("Unable to deserialize the room configs.".to_string()).send_self()); |
382 response.add( |
319 } |
383 Warning("Unable to deserialize the room configs.".to_string()) |
320 } |
384 .send_self(), |
|
385 ); |
|
386 } |
|
387 }, |
321 Err(e) => { |
388 Err(e) => { |
322 warn!("Error while reading the config file \"{}\": {}", filename, e); |
389 warn!( |
323 response.add(Warning("Unable to load the room configs.".to_string()).send_self()); |
390 "Error while reading the config file \"{}\": {}", |
|
391 filename, e |
|
392 ); |
|
393 response.add( |
|
394 Warning("Unable to load the room configs.".to_string()).send_self(), |
|
395 ); |
324 } |
396 } |
325 } |
397 } |
326 } |
398 } |
327 } |
399 } |
328 Delete(name) => { |
400 Delete(name) => { |
329 if !server.rooms[room_id].delete_config(&name) { |
401 if !server.rooms[room_id].delete_config(&name) { |
330 response.add(Warning(format!("Save doesn't exist: {}", name)).send_self()); |
402 response.add(Warning(format!("Save doesn't exist: {}", name)).send_self()); |
331 } else { |
403 } else { |
332 response.add(server_chat(format!("Room config {} has been deleted", name)) |
404 response.add( |
333 .send_all().in_room(room_id)); |
405 server_chat(format!("Room config {} has been deleted", name)) |
|
406 .send_all() |
|
407 .in_room(room_id), |
|
408 ); |
334 } |
409 } |
335 } |
410 } |
336 CallVote(None) => { |
411 CallVote(None) => { |
337 response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string()) |
412 response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string()) |
338 .send_self()); |
413 .send_self()); |
339 } |
414 } |
340 CallVote(Some(kind)) => { |
415 CallVote(Some(kind)) => { |
341 let is_in_game = server.rooms[room_id].game_info.is_some(); |
416 let is_in_game = server.rooms[room_id].game_info.is_some(); |
342 let error = match &kind { |
417 let error = match &kind { |
343 VoteType::Kick(nick) => { |
418 VoteType::Kick(nick) => { |
344 if server.find_client(&nick).filter(|c| c.room_id == Some(room_id)).is_some() { |
419 if server |
|
420 .find_client(&nick) |
|
421 .filter(|c| c.room_id == Some(room_id)) |
|
422 .is_some() |
|
423 { |
345 None |
424 None |
346 } else { |
425 } else { |
347 Some("/callvote kick: No such user!".to_string()) |
426 Some("/callvote kick: No such user!".to_string()) |
348 } |
427 } |
349 }, |
428 } |
350 VoteType::Map(None) => { |
429 VoteType::Map(None) => { |
351 let names: Vec<_> = server.rooms[room_id].saves.keys().cloned().collect(); |
430 let names: Vec<_> = server.rooms[room_id].saves.keys().cloned().collect(); |
352 if names.is_empty() { |
431 if names.is_empty() { |
353 Some("/callvote map: No maps saved in this room!".to_string()) |
432 Some("/callvote map: No maps saved in this room!".to_string()) |
354 } else { |
433 } else { |
355 Some(format!("Available maps: {}", names.join(", "))) |
434 Some(format!("Available maps: {}", names.join(", "))) |
356 } |
435 } |
357 }, |
436 } |
358 VoteType::Map(Some(name)) => { |
437 VoteType::Map(Some(name)) => { |
359 if server.rooms[room_id].saves.get(&name[..]).is_some() { |
438 if server.rooms[room_id].saves.get(&name[..]).is_some() { |
360 None |
439 None |
361 } else { |
440 } else { |
362 Some("/callvote map: No such map!".to_string()) |
441 Some("/callvote map: No such map!".to_string()) |
363 } |
442 } |
364 }, |
443 } |
365 VoteType::Pause => { |
444 VoteType::Pause => { |
366 if is_in_game { |
445 if is_in_game { |
367 None |
446 None |
368 } else { |
447 } else { |
369 Some("/callvote pause: No game in progress!".to_string()) |
448 Some("/callvote pause: No game in progress!".to_string()) |
370 } |
449 } |
371 }, |
450 } |
372 VoteType::NewSeed => { |
451 VoteType::NewSeed => None, |
373 None |
452 VoteType::HedgehogsPerTeam(number) => match number { |
374 }, |
453 1...MAX_HEDGEHOGS_PER_TEAM => None, |
375 VoteType::HedgehogsPerTeam(number) => { |
454 _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string()), |
376 match number { |
|
377 1...MAX_HEDGEHOGS_PER_TEAM => None, |
|
378 _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string()) |
|
379 } |
|
380 }, |
455 }, |
381 }; |
456 }; |
382 match error { |
457 match error { |
383 None => { |
458 None => { |
384 let msg = voting_description(&kind); |
459 let msg = voting_description(&kind); |
414 if c.teams_in_game > 0 { |
497 if c.teams_in_game > 0 { |
415 let decoding = decode(&em[..]).unwrap(); |
498 let decoding = decode(&em[..]).unwrap(); |
416 let messages = by_msg(&decoding); |
499 let messages = by_msg(&decoding); |
417 let valid = messages.filter(|m| is_msg_valid(m, &c.team_indices)); |
500 let valid = messages.filter(|m| is_msg_valid(m, &c.team_indices)); |
418 let non_empty = valid.clone().filter(|m| !is_msg_empty(m)); |
501 let non_empty = valid.clone().filter(|m| !is_msg_empty(m)); |
419 let sync_msg = valid.clone().filter(|m| is_msg_timed(m)) |
502 let sync_msg = valid.clone().filter(|m| is_msg_timed(m)).last().map(|m| { |
420 .last().map(|m| if is_msg_empty(m) {Some(encode(m))} else {None}); |
503 if is_msg_empty(m) { |
421 |
504 Some(encode(m)) |
422 let em_response = encode(&valid.flat_map(|msg| msg).cloned().collect::<Vec<_>>()); |
505 } else { |
|
506 None |
|
507 } |
|
508 }); |
|
509 |
|
510 let em_response = |
|
511 encode(&valid.flat_map(|msg| msg).cloned().collect::<Vec<_>>()); |
423 if !em_response.is_empty() { |
512 if !em_response.is_empty() { |
424 actions.push(ForwardEngineMessage(vec![em_response]) |
513 response.add( |
425 .send_all().in_room(r.id).but_self().action()); |
514 ForwardEngineMessage(vec![em_response]) |
426 } |
515 .send_all() |
427 let em_log = encode(&non_empty.flat_map(|msg| msg).cloned().collect::<Vec<_>>()); |
516 .in_room(r.id) |
|
517 .but_self(), |
|
518 ); |
|
519 } |
|
520 let em_log = |
|
521 encode(&non_empty.flat_map(|msg| msg).cloned().collect::<Vec<_>>()); |
428 if let Some(ref mut info) = r.game_info { |
522 if let Some(ref mut info) = r.game_info { |
429 if !em_log.is_empty() { |
523 if !em_log.is_empty() { |
430 info.msg_log.push(em_log); |
524 info.msg_log.push(em_log); |
431 } |
525 } |
432 if let Some(msg) = sync_msg { |
526 if let Some(msg) = sync_msg { |
440 RoundFinished => { |
534 RoundFinished => { |
441 let mut actions = Vec::new(); |
535 let mut actions = Vec::new(); |
442 if let (c, Some(r)) = server.client_and_room(client_id) { |
536 if let (c, Some(r)) = server.client_and_room(client_id) { |
443 if c.is_in_game() { |
537 if c.is_in_game() { |
444 c.set_is_in_game(false); |
538 c.set_is_in_game(false); |
445 actions.push(ClientFlags("-g".to_string(), vec![c.nick.clone()]). |
539 response.add( |
446 send_all().in_room(r.id).action()); |
540 ClientFlags("-g".to_string(), vec![c.nick.clone()]) |
|
541 .send_all() |
|
542 .in_room(r.id), |
|
543 ); |
447 if r.game_info.is_some() { |
544 if r.game_info.is_some() { |
448 for team in r.client_teams(c.id) { |
545 for team in r.client_teams(c.id) { |
449 actions.push(SendTeamRemovalMessage(team.name.clone())); |
546 actions.push(SendTeamRemovalMessage(team.name.clone())); |
450 } |
547 } |
451 } |
548 } |
452 } |
549 } |
453 } |
550 } |
454 server.react(client_id, actions) |
551 server.react(client_id, actions) |
455 }, |
552 } |
456 Rnd(v) => { |
553 Rnd(v) => { |
457 let result = rnd_reply(&v); |
554 let result = rnd_reply(&v); |
458 let mut echo = vec!["/rnd".to_string()]; |
555 let mut echo = vec!["/rnd".to_string()]; |
459 echo.extend(v.into_iter()); |
556 echo.extend(v.into_iter()); |
460 let chat_msg = ChatMsg { |
557 let chat_msg = ChatMsg { |
461 nick: server.clients[client_id].nick.clone(), |
558 nick: server.clients[client_id].nick.clone(), |
462 msg: echo.join(" ") |
559 msg: echo.join(" "), |
463 }; |
560 }; |
464 response.add(chat_msg.send_all().in_room(room_id)); |
561 response.add(chat_msg.send_all().in_room(room_id)); |
465 response.add(result.send_all().in_room(room_id)); |
562 response.add(result.send_all().in_room(room_id)); |
466 }, |
563 } |
467 _ => warn!("Unimplemented!") |
564 _ => warn!("Unimplemented!"), |
468 } |
565 } |
469 } |
566 } |