rust/hedgewars-server/src/server/handlers/common.rs
changeset 14686 9f98086de1b6
parent 14683 932ff7683653
child 14687 5122c584804e
--- 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<String>,
+    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::*;