rust/hedgewars-server/src/server/handlers/common.rs
changeset 14686 9f98086de1b6
parent 14683 932ff7683653
child 14687 5122c584804e
equal deleted inserted replaced
14685:669eb45bda72 14686:9f98086de1b6
       
     1 use crate::protocol::messages::server_chat;
     1 use crate::server::client::HWClient;
     2 use crate::server::client::HWClient;
     2 use crate::server::coretypes::ClientId;
     3 use crate::server::coretypes::ClientId;
     3 use crate::server::room::HWRoom;
     4 use crate::server::room::HWRoom;
     4 use crate::utils::to_engine_msg;
     5 use crate::utils::to_engine_msg;
     5 use crate::{
     6 use crate::{
    12     },
    13     },
    13     server::{actions::Action, core::HWServer},
    14     server::{actions::Action, core::HWServer},
    14 };
    15 };
    15 use rand::{self, thread_rng, Rng};
    16 use rand::{self, thread_rng, Rng};
    16 use std::iter::once;
    17 use std::iter::once;
       
    18 use std::mem::replace;
    17 
    19 
    18 pub fn rnd_reply(options: &[String]) -> HWServerMessage {
    20 pub fn rnd_reply(options: &[String]) -> HWServerMessage {
    19     let mut rng = thread_rng();
    21     let mut rng = thread_rng();
    20     let reply = if options.is_empty() {
    22     let reply = if options.is_empty() {
    21         (*rng.choose(&["heads", "tails"]).unwrap()).to_owned()
    23         (*rng.choose(&["heads", "tails"]).unwrap()).to_owned()
   184 
   186 
   185     response.add(LobbyLeft(nick, msg.to_string()).send_all());
   187     response.add(LobbyLeft(nick, msg.to_string()).send_all());
   186     response.add(Bye("User quit: ".to_string() + &msg).send_self());
   188     response.add(Bye("User quit: ".to_string() + &msg).send_self());
   187 }
   189 }
   188 
   190 
       
   191 pub fn get_room_update(
       
   192     room_name: Option<String>,
       
   193     room: &HWRoom,
       
   194     client: Option<&HWClient>,
       
   195     response: &mut super::Response,
       
   196 ) {
       
   197     let update_msg = RoomUpdated(room_name.unwrap_or(room.name.clone()), room.info(client));
       
   198     response.add(update_msg.send_all().with_protocol(room.protocol_number));
       
   199 }
       
   200 
       
   201 pub fn add_vote(room: &mut HWRoom, response: &mut super::Response, vote: bool, is_forced: bool) {
       
   202     let client_id = response.client_id;
       
   203     let mut result = None;
       
   204     if let Some(ref mut voting) = room.voting {
       
   205         if is_forced || voting.votes.iter().all(|(id, _)| client_id != *id) {
       
   206             response.add(server_chat("Your vote has been counted.".to_string()).send_self());
       
   207             voting.votes.push((client_id, vote));
       
   208             let i = voting.votes.iter();
       
   209             let pro = i.clone().filter(|(_, v)| *v).count();
       
   210             let contra = i.filter(|(_, v)| !*v).count();
       
   211             let success_quota = voting.voters.len() / 2 + 1;
       
   212             if is_forced && vote || pro >= success_quota {
       
   213                 result = Some(true);
       
   214             } else if is_forced && !vote || contra > voting.voters.len() - success_quota {
       
   215                 result = Some(false);
       
   216             }
       
   217         } else {
       
   218             response.add(server_chat("You already have voted.".to_string()).send_self());
       
   219         }
       
   220     } else {
       
   221         response.add(server_chat("There's no voting going on.".to_string()).send_self());
       
   222     }
       
   223 
       
   224     if let Some(res) = result {
       
   225         response.add(
       
   226             server_chat("Voting closed.".to_string())
       
   227                 .send_all()
       
   228                 .in_room(room.id),
       
   229         );
       
   230         let voting = replace(&mut room.voting, None).unwrap();
       
   231         if res {
       
   232             //ApplyVoting(voting.kind, room.id));
       
   233         }
       
   234     }
       
   235 }
       
   236 
   189 #[cfg(test)]
   237 #[cfg(test)]
   190 mod tests {
   238 mod tests {
   191     use super::*;
   239     use super::*;
   192     use crate::protocol::messages::HWServerMessage::ChatMsg;
   240     use crate::protocol::messages::HWServerMessage::ChatMsg;
   193     use crate::server::actions::PendingMessage;
   241     use crate::server::actions::PendingMessage;