rust/hedgewars-server/src/handlers/inroom.rs
changeset 15525 16d3c9acd715
parent 15523 f4f6060b536c
child 15527 428a0e7da27b
equal deleted inserted replaced
15524:fbcee515b946 15525:16d3c9acd715
     3 use crate::core::server::{AddTeamError, SetTeamCountError};
     3 use crate::core::server::{AddTeamError, SetTeamCountError};
     4 use crate::{
     4 use crate::{
     5     core::{
     5     core::{
     6         room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM},
     6         room::{HwRoom, RoomFlags, MAX_TEAMS_IN_ROOM},
     7         server::{
     7         server::{
     8             ChangeMasterError, ChangeMasterResult, HwRoomControl, LeaveRoomResult, ModifyTeamError,
     8             ChangeMasterError, ChangeMasterResult, HwRoomControl, HwServer, LeaveRoomResult,
     9             StartGameError,
     9             ModifyTeamError, StartGameError,
    10         },
    10         },
    11         types,
    11         types,
    12         types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
    12         types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
    13     },
    13     },
    14     protocol::messages::{
    14     protocol::messages::{
   233                             .send_all()
   233                             .send_all()
   234                             .in_room(room_id),
   234                             .in_room(room_id),
   235                     );
   235                     );
   236 
   236 
   237                     let room = room_control.room();
   237                     let room = room_control.room();
   238                     let room_master = if let Some(id) = room.master_id {
   238                     let room_master = room.master_id.map(|id| room_control.server().client(id));
   239                         Some(room_control.server().client(id))
       
   240                     } else {
       
   241                         None
       
   242                     };
       
   243                     super::common::get_room_update(None, room, room_master, response);
   239                     super::common::get_room_update(None, room, room_master, response);
   244                 }
   240                 }
   245                 Err(AddTeamError::TooManyTeams) => response.warn(TOO_MANY_TEAMS),
   241                 Err(AddTeamError::TooManyTeams) => response.warn(TOO_MANY_TEAMS),
   246                 Err(AddTeamError::TooManyHedgehogs) => response.warn(TOO_MANY_HEDGEHOGS),
   242                 Err(AddTeamError::TooManyHedgehogs) => response.warn(TOO_MANY_HEDGEHOGS),
   247                 Err(AddTeamError::TeamAlreadyExists) => response.warn(TEAM_EXISTS),
   243                 Err(AddTeamError::TeamAlreadyExists) => response.warn(TEAM_EXISTS),
   363         }
   359         }
   364         CallVote(None) => {
   360         CallVote(None) => {
   365             response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string())
   361             response.add(server_chat("Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs <number>".to_string())
   366                 .send_self());
   362                 .send_self());
   367         }
   363         }
   368         /*CallVote(Some(kind)) => {
   364         CallVote(Some(kind)) => {
   369             let is_in_game = room.game_info.is_some();
   365             use crate::core::server::StartVoteError;
   370             let error = match &kind {
   366             let room_id = room_control.room().id;
   371                 VoteType::Kick(nick) => {
   367             if super::common::check_vote(
   372                     if room_control.server()
   368                 room_control.server(),
   373                         .find_client(&nick)
   369                 room_control.room(),
   374                         .filter(|c| c.room_id == Some(room_id))
   370                 &kind,
   375                         .is_some()
   371                 response,
   376                     {
   372             ) {
   377                         None
   373                 match room_control.start_vote(kind.clone()) {
   378                     } else {
   374                     Ok(()) => {
   379                         Some("/callvote kick: No such user!".to_string())
   375                         let msg = voting_description(&kind);
   380                     }
   376                         response.add(server_chat(msg).send_all().in_room(room_id));
   381                 }
   377                         let vote_result = room_control.vote(types::Vote {
   382                 VoteType::Map(None) => {
       
   383                     let names: Vec<_> = room.saves.keys().cloned().collect();
       
   384                     if names.is_empty() {
       
   385                         Some("/callvote map: No maps saved in this room!".to_string())
       
   386                     } else {
       
   387                         Some(format!("Available maps: {}", names.join(", ")))
       
   388                     }
       
   389                 }
       
   390                 VoteType::Map(Some(name)) => {
       
   391                     if room.saves.get(&name[..]).is_some() {
       
   392                         None
       
   393                     } else {
       
   394                         Some("/callvote map: No such map!".to_string())
       
   395                     }
       
   396                 }
       
   397                 VoteType::Pause => {
       
   398                     if is_in_game {
       
   399                         None
       
   400                     } else {
       
   401                         Some("/callvote pause: No game in progress!".to_string())
       
   402                     }
       
   403                 }
       
   404                 VoteType::NewSeed => None,
       
   405                 VoteType::HedgehogsPerTeam(number) => match number {
       
   406                     1..=MAX_HEDGEHOGS_PER_TEAM => None,
       
   407                     _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string()),
       
   408                 },
       
   409             };
       
   410 
       
   411             match error {
       
   412                 None => {
       
   413                     let msg = voting_description(&kind);
       
   414                     let voting = Voting::new(kind, room_control.server().room_clients(client_id).collect());
       
   415                     let room = room_control.server().room_mut(room_id);
       
   416                     room.voting = Some(voting);
       
   417                     response.add(server_chat(msg).send_all().in_room(room_id));
       
   418                     super::common::submit_vote(
       
   419                         room_control.server(),
       
   420                         types::Vote {
       
   421                             is_pro: true,
   378                             is_pro: true,
   422                             is_forced: false,
   379                             is_forced: false,
   423                         },
   380                         });
   424                         response,
   381                         super::common::handle_vote(room_control, vote_result, response);
   425                     );
   382                     }
   426                 }
   383                     Err(StartVoteError::VotingInProgress) => {
   427                 Some(msg) => {
   384                         response.add(
   428                     response.add(server_chat(msg).send_self());
   385                             server_chat("There is already voting in progress".to_string())
   429                 }
   386                                 .send_self(),
   430             }
   387                         );
   431         }*/
   388                     }
   432         /*Vote(vote) => {
   389                 }
   433             super::common::submit_vote(
   390             }
   434                 room_control.server(),
   391         }
   435                 types::Vote {
   392         Vote(vote) => {
   436                     is_pro: vote,
   393             let vote_result = room_control.vote(types::Vote {
   437                     is_forced: false,
   394                 is_pro: vote,
   438                 },
   395                 is_forced: false,
   439                 response,
   396             });
   440             );
   397             super::common::handle_vote(room_control, vote_result, response);
   441         }*/
   398         }
   442         /*ForceVote(vote) => {
   399         ForceVote(vote) => {
   443             let is_forced = client.is_admin();
   400             let is_forced = client.is_admin();
   444             super::common::submit_vote(
   401             let vote_result = room_control.vote(types::Vote {
   445                 room_control.server(),
   402                 is_pro: vote,
   446                 types::Vote {
   403                 is_forced,
   447                     is_pro: vote,
   404             });
   448                     is_forced,
   405             super::common::handle_vote(room_control, vote_result, response);
   449                 },
   406         }
   450                 response,
       
   451             );
       
   452         }*/
       
   453         ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly => {
   407         ToggleRestrictJoin | ToggleRestrictTeams | ToggleRegisteredOnly => {
   454             if room_control.toggle_flag(room_message_flag(&message)) {
   408             if room_control.toggle_flag(room_message_flag(&message)) {
   455                 let (client, room) = room_control.get();
   409                 let (client, room) = room_control.get();
   456                 super::common::get_room_update(None, room, Some(&client), response);
   410                 super::common::get_room_update(None, room, Some(&client), response);
   457             }
   411             }