1 use crate::{ |
1 use crate::{ |
2 core::{ |
2 core::{ |
3 client::HwClient, |
3 client::HwClient, |
4 room::HwRoom, |
4 room::HwRoom, |
5 server::HwServer, |
5 server::{HwServer, JoinRoomError}, |
6 types::{ClientId, GameCfg, RoomId, TeamInfo, Vote, VoteType}, |
6 types::{ClientId, GameCfg, RoomId, TeamInfo, Vote, VoteType}, |
7 }, |
7 }, |
8 protocol::messages::{ |
8 protocol::messages::{ |
9 add_flags, remove_flags, server_chat, |
9 add_flags, remove_flags, server_chat, |
10 HwProtocolMessage::{self, Rnd}, |
10 HwProtocolMessage::{self, Rnd}, |
225 .send_all() |
225 .send_all() |
226 .in_room(room_id), |
226 .in_room(room_id), |
227 ); |
227 ); |
228 } |
228 } |
229 |
229 |
230 pub fn enter_room( |
230 pub fn get_room_join_data<'a, I: Iterator<Item = &'a HwClient> + Clone>( |
231 server: &mut HwServer, |
231 client: &HwClient, |
232 client_id: ClientId, |
232 room: &HwRoom, |
233 room_id: RoomId, |
233 room_clients: I, |
234 response: &mut Response, |
234 response: &mut Response, |
235 ) { |
235 ) { |
236 let nick = server.clients[client_id].nick.clone(); |
236 #[inline] |
237 server.move_to_room(client_id, room_id); |
237 fn collect_nicks<'a, I, F>(clients: I, f: F) -> Vec<String> |
238 |
238 where |
239 response.add(RoomJoined(vec![nick.clone()]).send_all().in_room(room_id)); |
239 I: Iterator<Item = &'a HwClient>, |
|
240 F: Fn(&&'a HwClient) -> bool, |
|
241 { |
|
242 clients.filter(f).map(|c| &c.nick).cloned().collect() |
|
243 } |
|
244 |
|
245 let nick = client.nick.clone(); |
|
246 response.add(RoomJoined(vec![nick.clone()]).send_all().in_room(room.id)); |
240 response.add(ClientFlags(add_flags(&[Flags::InRoom]), vec![nick]).send_all()); |
247 response.add(ClientFlags(add_flags(&[Flags::InRoom]), vec![nick]).send_all()); |
241 let nicks = server.collect_nicks(|(_, c)| c.room_id == Some(room_id)); |
248 let nicks = collect_nicks(room_clients.clone(), |c| c.room_id == Some(room.id)); |
242 response.add(RoomJoined(nicks).send_self()); |
249 response.add(RoomJoined(nicks).send_self()); |
243 |
250 |
244 get_room_teams(server, room_id, client_id, response); |
251 get_room_teams(room, client.id, response); |
245 |
252 get_room_config(room, client.id, response); |
246 let room = &server.rooms[room_id]; |
|
247 get_room_config(room, client_id, response); |
|
248 |
253 |
249 let mut flag_selectors = [ |
254 let mut flag_selectors = [ |
250 ( |
255 ( |
251 Flags::RoomMaster, |
256 Flags::RoomMaster, |
252 server.collect_nicks(|(_, c)| c.is_master()), |
257 collect_nicks(room_clients.clone(), |c| c.is_master()), |
253 ), |
258 ), |
254 (Flags::Ready, server.collect_nicks(|(_, c)| c.is_ready())), |
259 ( |
255 (Flags::InGame, server.collect_nicks(|(_, c)| c.is_in_game())), |
260 Flags::Ready, |
|
261 collect_nicks(room_clients.clone(), |c| c.is_ready()), |
|
262 ), |
|
263 ( |
|
264 Flags::InGame, |
|
265 collect_nicks(room_clients.clone(), |c| c.is_in_game()), |
|
266 ), |
256 ]; |
267 ]; |
257 |
268 |
258 for (flag, nicks) in &mut flag_selectors { |
269 for (flag, nicks) in &mut flag_selectors { |
259 response.add(ClientFlags(add_flags(&[*flag]), replace(nicks, vec![])).send_self()); |
270 response.add(ClientFlags(add_flags(&[*flag]), replace(nicks, vec![])).send_self()); |
260 } |
271 } |
265 nick: "[greeting]".to_string(), |
276 nick: "[greeting]".to_string(), |
266 msg: room.greeting.clone(), |
277 msg: room.greeting.clone(), |
267 } |
278 } |
268 .send_self(), |
279 .send_self(), |
269 ); |
280 ); |
|
281 } |
|
282 } |
|
283 |
|
284 pub fn get_room_join_error(error: JoinRoomError, response: &mut Response) { |
|
285 use super::strings::*; |
|
286 match error { |
|
287 JoinRoomError::DoesntExist => response.warn(NO_ROOM), |
|
288 JoinRoomError::WrongProtocol => response.warn(WRONG_PROTOCOL), |
|
289 JoinRoomError::Full => response.warn(ROOM_FULL), |
|
290 JoinRoomError::Restricted => response.warn(ROOM_JOIN_RESTRICTED), |
270 } |
291 } |
271 } |
292 } |
272 |
293 |
273 pub fn exit_room(server: &mut HwServer, client_id: ClientId, response: &mut Response, msg: &str) { |
294 pub fn exit_room(server: &mut HwServer, client_id: ClientId, response: &mut Response, msg: &str) { |
274 let client = &mut server.clients[client_id]; |
295 let client = &mut server.clients[client_id]; |
352 response.add(TeamColor(team.name.clone(), team.color).send(to_client)); |
373 response.add(TeamColor(team.name.clone(), team.color).send(to_client)); |
353 response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send(to_client)); |
374 response.add(HedgehogsNumber(team.name.clone(), team.hedgehogs_number).send(to_client)); |
354 } |
375 } |
355 } |
376 } |
356 |
377 |
357 pub fn get_room_teams( |
378 pub fn get_room_teams(room: &HwRoom, to_client: ClientId, response: &mut Response) { |
358 server: &HwServer, |
|
359 room_id: RoomId, |
|
360 to_client: ClientId, |
|
361 response: &mut Response, |
|
362 ) { |
|
363 let room = &server.rooms[room_id]; |
|
364 let current_teams = match room.game_info { |
379 let current_teams = match room.game_info { |
365 Some(ref info) => &info.teams_at_start, |
380 Some(ref info) => &info.teams_at_start, |
366 None => &room.teams, |
381 None => &room.teams, |
367 }; |
382 }; |
368 |
383 |