|
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; |