rust/hedgewars-server/src/server/handlers/inroom.rs
changeset 14683 932ff7683653
parent 14676 9377ee00f1f1
child 14686 9f98086de1b6
equal deleted inserted replaced
14682:204fb862d0e4 14683:932ff7683653
   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);
   391                     response.add(server_chat(msg).send_self());
   466                     response.add(server_chat(msg).send_self());
   392                 }
   467                 }
   393             }
   468             }
   394         }
   469         }
   395         Vote(vote) => {
   470         Vote(vote) => {
   396             server.react(client_id, vec![AddVote{ vote, is_forced: false }]);
   471             server.react(
       
   472                 client_id,
       
   473                 vec![AddVote {
       
   474                     vote,
       
   475                     is_forced: false,
       
   476                 }],
       
   477             );
   397         }
   478         }
   398         ForceVote(vote) => {
   479         ForceVote(vote) => {
   399             let is_forced = server.clients[client_id].is_admin();
   480             let is_forced = server.clients[client_id].is_admin();
   400             server.react(client_id, vec![AddVote{ vote, is_forced }]);
   481             server.react(client_id, vec![AddVote { vote, is_forced }]);
   401         }
   482         }
   402         ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly  => {
   483         ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly => {
   403             if server.clients[client_id].is_master() {
   484             if server.clients[client_id].is_master() {
   404                 server.rooms[room_id].flags.toggle(room_message_flag(&message));
   485                 server.rooms[room_id]
       
   486                     .flags
       
   487                     .toggle(room_message_flag(&message));
   405             }
   488             }
   406             server.react(client_id, vec![SendRoomUpdate(None)]);
   489             server.react(client_id, vec![SendRoomUpdate(None)]);
   407         }
   490         }
   408         StartGame => {
   491         StartGame => {
   409             server.react(client_id, vec![StartRoomGame(room_id)]);
   492             server.react(client_id, vec![StartRoomGame(room_id)]);
   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 }