diff -r 669eb45bda72 -r 9f98086de1b6 rust/hedgewars-server/src/server/handlers/common.rs --- a/rust/hedgewars-server/src/server/handlers/common.rs Tue Feb 05 23:18:47 2019 +0300 +++ b/rust/hedgewars-server/src/server/handlers/common.rs Wed Feb 06 00:14:04 2019 +0300 @@ -1,3 +1,4 @@ +use crate::protocol::messages::server_chat; use crate::server::client::HWClient; use crate::server::coretypes::ClientId; use crate::server::room::HWRoom; @@ -14,6 +15,7 @@ }; use rand::{self, thread_rng, Rng}; use std::iter::once; +use std::mem::replace; pub fn rnd_reply(options: &[String]) -> HWServerMessage { let mut rng = thread_rng(); @@ -186,6 +188,52 @@ response.add(Bye("User quit: ".to_string() + &msg).send_self()); } +pub fn get_room_update( + room_name: Option, + room: &HWRoom, + client: Option<&HWClient>, + response: &mut super::Response, +) { + let update_msg = RoomUpdated(room_name.unwrap_or(room.name.clone()), room.info(client)); + response.add(update_msg.send_all().with_protocol(room.protocol_number)); +} + +pub fn add_vote(room: &mut HWRoom, response: &mut super::Response, vote: bool, is_forced: bool) { + let client_id = response.client_id; + let mut result = None; + if let Some(ref mut voting) = room.voting { + if is_forced || voting.votes.iter().all(|(id, _)| client_id != *id) { + response.add(server_chat("Your vote has been counted.".to_string()).send_self()); + voting.votes.push((client_id, vote)); + let i = voting.votes.iter(); + let pro = i.clone().filter(|(_, v)| *v).count(); + let contra = i.filter(|(_, v)| !*v).count(); + let success_quota = voting.voters.len() / 2 + 1; + if is_forced && vote || pro >= success_quota { + result = Some(true); + } else if is_forced && !vote || contra > voting.voters.len() - success_quota { + result = Some(false); + } + } else { + response.add(server_chat("You already have voted.".to_string()).send_self()); + } + } else { + response.add(server_chat("There's no voting going on.".to_string()).send_self()); + } + + if let Some(res) = result { + response.add( + server_chat("Voting closed.".to_string()) + .send_all() + .in_room(room.id), + ); + let voting = replace(&mut room.voting, None).unwrap(); + if res { + //ApplyVoting(voting.kind, room.id)); + } + } +} + #[cfg(test)] mod tests { use super::*;