rust/hedgewars-server/src/handlers/inroom.rs
changeset 15518 e705d30e0f10
parent 15516 b907b9071ec5
child 15519 b3157d218ae2
equal deleted inserted replaced
15517:abd5eb807166 15518:e705d30e0f10
     1 use super::{common::rnd_reply, strings::*};
     1 use super::{common::rnd_reply, strings::*};
     2 use crate::{
     2 use crate::{
     3     core::{
     3     core::{
     4         room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM},
     4         room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM},
     5         server::{
     5         server::{
     6             ChangeMasterError, ChangeMasterResult, HwServer, LeaveRoomResult, StartGameError,
     6             ChangeMasterError, ChangeMasterResult, HwServer, LeaveRoomResult, ModifyTeamError,
       
     7             StartGameError,
     7         },
     8         },
     8         types,
     9         types,
     9         types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
    10         types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
    10     },
    11     },
    11     protocol::messages::{
    12     protocol::messages::{
   172             } else {
   173             } else {
   173                 room.max_teams = count;
   174                 room.max_teams = count;
   174             }
   175             }
   175         }
   176         }
   176         RoomName(new_name) => {
   177         RoomName(new_name) => {
   177             if is_name_illegal(&new_name) {
   178             use crate::core::server::ModifyRoomNameError;
   178                 response.warn("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: $()*+?[]^{|}");
   179             match server.set_room_name(client_id, room_id, new_name) {
   179             } else if server.has_room(&new_name) {
   180                 Ok(old_name) => {
   180                 response.warn("A room with the same name already exists.");
   181                     let (client, room) = server.client_and_room(client_id, room_id);
   181             } else {
   182                     super::common::get_room_update(Some(old_name), room, Some(client), response)
   182                 let (client, room) = server.client_and_room_mut(client_id, room_id);
   183                 }
   183                 if room.is_fixed() || room.master_id != Some(client_id) {
   184                 Err(ModifyRoomNameError::AccessDenied) => response.warn(ACCESS_DENIED),
   184                     response.warn(ACCESS_DENIED);
   185                 Err(ModifyRoomNameError::InvalidName) => response.warn(ILLEGAL_ROOM_NAME),
   185                 } else {
   186                 Err(ModifyRoomNameError::DuplicateName) => response.warn(ROOM_EXISTS),
   186                     let mut old_name = new_name.clone();
       
   187                     swap(&mut room.name, &mut old_name);
       
   188                     super::common::get_room_update(Some(old_name), room, Some(&client), response);
       
   189                 }
       
   190             }
   187             }
   191         }
   188         }
   192         ToggleReady => {
   189         ToggleReady => {
   193             let flags = if client.is_ready() {
   190             let flags = if server.toggle_ready(client_id) {
   194                 room.ready_players_number -= 1;
   191                 add_flags(&[Flags::Ready])
       
   192             } else {
   195                 remove_flags(&[Flags::Ready])
   193                 remove_flags(&[Flags::Ready])
   196             } else {
       
   197                 room.ready_players_number += 1;
       
   198                 add_flags(&[Flags::Ready])
       
   199             };
   194             };
       
   195             let (client, room) = server.client_and_room(client_id, room_id);
   200 
   196 
   201             let msg = if client.protocol_number < 38 {
   197             let msg = if client.protocol_number < 38 {
   202                 LegacyReady(client.is_ready(), vec![client.nick.clone()])
   198                 LegacyReady(client.is_ready(), vec![client.nick.clone()])
   203             } else {
   199             } else {
   204                 ClientFlags(flags, vec![client.nick.clone()])
   200                 ClientFlags(flags, vec![client.nick.clone()])
   205             };
   201             };
   206             response.add(msg.send_all().in_room(room.id));
   202             response.add(msg.send_all().in_room(room_id));
   207             client.set_is_ready(!client.is_ready());
       
   208 
   203 
   209             if room.is_fixed() && room.ready_players_number == room.players_number {
   204             if room.is_fixed() && room.ready_players_number == room.players_number {
   210                 let result = server.start_game(room_id);
   205                 let result = server.start_game(room_id);
   211                 super::common::get_start_game_data(server, room_id, result, response);
   206                 super::common::get_start_game_data(server, room_id, result, response);
   212             }
   207             }
   305             } else {
   300             } else {
   306                 response.warn(NO_TEAM);
   301                 response.warn(NO_TEAM);
   307             }
   302             }
   308         }
   303         }
   309         SetTeamColor(team_name, color) => {
   304         SetTeamColor(team_name, color) => {
   310             if let Some((owner, team)) = room.find_team_and_owner_mut(|t| t.name == team_name) {
   305             match server.set_team_color(client_id, room_id, &team_name, color) {
   311                 if !client.is_master() {
   306                 Ok(()) => response.add(
   312                     response.error(NOT_MASTER);
   307                     TeamColor(team_name, color)
   313                 } else {
   308                         .send_all()
   314                     team.color = color;
   309                         .in_room(room_id)
   315                     response.add(
   310                         .but_self(),
   316                         TeamColor(team.name.clone(), color)
   311                 ),
   317                             .send_all()
   312                 Err(ModifyTeamError::NoTeam) => response.warn(NO_TEAM),
   318                             .in_room(room_id)
   313                 Err(ModifyTeamError::NotMaster) => response.error(NOT_MASTER),
   319                             .but_self(),
       
   320                     );
       
   321                     server.client_mut(owner).clan = Some(color);
       
   322                 }
       
   323             } else {
       
   324                 response.warn(NO_TEAM);
       
   325             }
   314             }
   326         }
   315         }
   327         Cfg(cfg) => {
   316         Cfg(cfg) => {
   328             if room.is_fixed() {
   317             if room.is_fixed() {
   329                 response.warn(ACCESS_DENIED);
   318                 response.warn(ACCESS_DENIED);