rust/hedgewars-server/src/handlers/inroom.rs
changeset 15487 91f0c5ec37b5
parent 15482 4cc9ec732392
child 15492 395be40faa51
equal deleted inserted replaced
15486:d668fcb9307e 15487:91f0c5ec37b5
     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::{HwServer, LeaveRoomResult},
     5         server::{ChangeMasterError, ChangeMasterResult, HwServer, LeaveRoomResult},
     6         types,
     6         types,
     7         types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
     7         types::{ClientId, GameCfg, RoomId, VoteType, Voting, MAX_HEDGEHOGS_PER_TEAM},
     8     },
     8     },
     9     protocol::messages::{
     9     protocol::messages::{
    10         add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*,
    10         add_flags, remove_flags, server_chat, HwProtocolMessage, HwServerMessage::*,
   313                         TeamColor(team.name.clone(), color)
   313                         TeamColor(team.name.clone(), color)
   314                             .send_all()
   314                             .send_all()
   315                             .in_room(room_id)
   315                             .in_room(room_id)
   316                             .but_self(),
   316                             .but_self(),
   317                     );
   317                     );
   318                     server.clients[owner].clan = Some(color);
   318                     server.client_mut(owner).clan = Some(color);
   319                 }
   319                 }
   320             } else {
   320             } else {
   321                 response.warn(NO_TEAM);
   321                 response.warn(NO_TEAM);
   322             }
   322             }
   323         }
   323         }
   569         Rnd(v) => {
   569         Rnd(v) => {
   570             let result = rnd_reply(&v);
   570             let result = rnd_reply(&v);
   571             let mut echo = vec!["/rnd".to_string()];
   571             let mut echo = vec!["/rnd".to_string()];
   572             echo.extend(v.into_iter());
   572             echo.extend(v.into_iter());
   573             let chat_msg = ChatMsg {
   573             let chat_msg = ChatMsg {
   574                 nick: server.clients[client_id].nick.clone(),
   574                 nick: server.client(client_id).nick.clone(),
   575                 msg: echo.join(" "),
   575                 msg: echo.join(" "),
   576             };
   576             };
   577             response.add(chat_msg.send_all().in_room(room_id));
   577             response.add(chat_msg.send_all().in_room(room_id));
   578             response.add(result.send_all().in_room(room_id));
   578             response.add(result.send_all().in_room(room_id));
   579         }
   579         }
   580         Delegate(nick) => {
   580         Delegate(nick) => match server.change_master(client_id, room_id, nick) {
   581             let delegate_id = server.find_client(&nick).map(|c| (c.id, c.room_id));
   581             Ok(ChangeMasterResult {
   582             let client = &server.clients[client_id];
   582                 old_master_id,
   583             if !(client.is_admin() || client.is_master()) {
   583                 new_master_id,
       
   584             }) => {
       
   585                 if let Some(master_id) = old_master_id {
       
   586                     response.add(
       
   587                         ClientFlags(
       
   588                             remove_flags(&[Flags::RoomMaster]),
       
   589                             vec![server.client(master_id).nick.clone()],
       
   590                         )
       
   591                         .send_all()
       
   592                         .in_room(room_id),
       
   593                     );
       
   594                 }
       
   595                 response.add(
       
   596                     ClientFlags(
       
   597                         add_flags(&[Flags::RoomMaster]),
       
   598                         vec![server.client(new_master_id).nick.clone()],
       
   599                     )
       
   600                     .send_all()
       
   601                     .in_room(room_id),
       
   602                 );
       
   603             }
       
   604             Err(ChangeMasterError::NoAccess) => {
   584                 response.warn("You're not the room master or a server admin!")
   605                 response.warn("You're not the room master or a server admin!")
   585             } else {
   606             }
   586                 match delegate_id {
   607             Err(ChangeMasterError::AlreadyMaster) => {
   587                     None => response.warn("Player is not online."),
   608                 response.warn("You're already the room master.")
   588                     Some((id, _)) if id == client_id => {
   609             }
   589                         response.warn("You're already the room master.")
   610             Err(ChangeMasterError::NoClient) => response.warn("Player is not online."),
   590                     }
   611             Err(ChangeMasterError::ClientNotInRoom) => {
   591                     Some((_, id)) if id != Some(room_id) => {
   612                 response.warn("The player is not in your room.")
   592                         response.warn("The player is not in your room.")
   613             }
   593                     }
   614         },
   594                     Some((id, _)) => {
       
   595                         super::common::change_master(server, room_id, id, response);
       
   596                     }
       
   597                 }
       
   598             }
       
   599         }
       
   600         _ => warn!("Unimplemented!"),
   615         _ => warn!("Unimplemented!"),
   601     }
   616     }
   602 }
   617 }