rust/hedgewars-server/src/handlers/common.rs
changeset 15439 a158ff8f84ef
parent 15111 1e45db229f9f
child 15441 61a0bd0bb021
equal deleted inserted replaced
15438:e7c059ac6e54 15439:a158ff8f84ef
     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