# HG changeset patch # User Marcin Mielniczuk # Date 1530887245 -7200 # Node ID 914f9b970f4dd5466e1117e50545a1faff2c4305 # Parent 2501428303a212fc0706d5a7683e1bd06350131b Implement server-side logic for Rnd diff -r 2501428303a2 -r 914f9b970f4d gameServer2/src/protocol/messages.rs --- a/gameServer2/src/protocol/messages.rs Wed Jul 04 18:49:51 2018 +0300 +++ b/gameServer2/src/protocol/messages.rs Fri Jul 06 16:27:25 2018 +0200 @@ -76,7 +76,7 @@ Proto(u32), LobbyLeft(String, String), LobbyJoined(Vec), - ChatMsg(String, String), + ChatMsg {nick: String, msg: String}, ClientFlags(String, Vec), Rooms(Vec), RoomAdd(Vec), @@ -284,7 +284,7 @@ ForwardEngineMessage(em) => construct_message(&["EM"], &em), RoundFinished => msg!["ROUND_FINISHED"], - ChatMsg(nick, msg) => msg!["CHAT", nick, msg], + ChatMsg {nick, msg} => msg!["CHAT", nick, msg], ServerMessage(msg) => msg!["SERVER_MESSAGE", msg], Warning(msg) => msg!["WARNING", msg], Error(msg) => msg!["ERROR", msg], diff -r 2501428303a2 -r 914f9b970f4d gameServer2/src/server/handlers/common.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/handlers/common.rs Fri Jul 06 16:27:25 2018 +0200 @@ -0,0 +1,57 @@ +use protocol::messages::{ + HWProtocolMessage::{self, Rnd}, HWServerMessage::ChatMsg, +}; +use rand::{self, Rng}; +use server::{actions::Action, server::HWServer}; + +pub fn rnd_reply(options: Vec) -> Vec { + let options = if options.is_empty() { + vec!["heads".to_owned(), "tails".to_owned()] + } else { + options + }; + let reply = rand::thread_rng().choose(&options).unwrap(); + let msg = ChatMsg { + nick: "[random]".to_owned(), + msg: reply.clone(), + }; + let msg = msg.send_all().action(); + vec![msg] +} + +#[cfg(test)] +mod tests { + use super::*; + use protocol::messages::HWServerMessage::ChatMsg; + use server::actions::{ + Action::{self, Send}, PendingMessage, + }; + + fn reply2string(mut r: Vec) -> String { + assert_eq!(r.len(), 1); + match r.remove(0) { + Send(PendingMessage { + message: ChatMsg { msg: p, .. }, + .. + }) => String::from(p), + _ => panic!("reply should be a string"), + } + } + + fn run_handle_test(opts: Vec) { + let opts2 = opts.clone(); + for opt in opts { + while reply2string(rnd_reply(opts2.clone())) != opt {} + } + } + + #[test] + fn test_handle_rnd_empty() { + run_handle_test(vec![]) + } + + #[test] + fn test_handle_rnd_nonempty() { + run_handle_test(vec!["A".to_owned(), "B".to_owned(), "C".to_owned()]) + } +} diff -r 2501428303a2 -r 914f9b970f4d gameServer2/src/server/handlers/inroom.rs --- a/gameServer2/src/server/handlers/inroom.rs Wed Jul 04 18:49:51 2018 +0300 +++ b/gameServer2/src/server/handlers/inroom.rs Fri Jul 06 16:27:25 2018 +0200 @@ -13,6 +13,7 @@ use utils::is_name_illegal; use std::mem::swap; use base64::{encode, decode}; +use super::common::rnd_reply; #[derive(Clone)] struct ByMsg<'a> { @@ -79,7 +80,7 @@ Chat(msg) => { let actions = { let c = &mut server.clients[client_id]; - let chat_msg = ChatMsg(c.nick.clone(), msg); + let chat_msg = ChatMsg {nick: c.nick.clone(), msg: msg}; if let Some(room_id) = c.room_id { vec![chat_msg.send_all().in_room(room_id).but_self().action()] } else { @@ -287,7 +288,8 @@ } } server.react(client_id, actions) - } + }, + Rnd(v) => server.react(client_id, rnd_reply(v)), _ => warn!("Unimplemented!") } } diff -r 2501428303a2 -r 914f9b970f4d gameServer2/src/server/handlers/lobby.rs --- a/gameServer2/src/server/handlers/lobby.rs Wed Jul 04 18:49:51 2018 +0300 +++ b/gameServer2/src/server/handlers/lobby.rs Fri Jul 06 16:27:25 2018 +0200 @@ -10,6 +10,7 @@ HWServerMessage::* }; use utils::is_name_illegal; +use super::common::rnd_reply; pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) { use protocol::messages::HWProtocolMessage::*; @@ -30,7 +31,7 @@ server.react(client_id, actions); }, Chat(msg) => { - let chat_msg = ChatMsg(server.clients[client_id].nick.clone(), msg); + let chat_msg = ChatMsg {nick: server.clients[client_id].nick.clone(), msg: msg}; server.react(client_id, vec![chat_msg.send_all().but_self().action()]); }, JoinRoom(name, password) => { @@ -57,6 +58,7 @@ } server.react(client_id, actions); }, + Rnd(v) => server.react(client_id, rnd_reply(v)), List => warn!("Deprecated LIST message received"), _ => warn!("Incorrect command in lobby state"), } diff -r 2501428303a2 -r 914f9b970f4d gameServer2/src/server/handlers/mod.rs --- a/gameServer2/src/server/handlers/mod.rs Wed Jul 04 18:49:51 2018 +0300 +++ b/gameServer2/src/server/handlers/mod.rs Fri Jul 06 16:27:25 2018 +0200 @@ -8,6 +8,7 @@ use protocol::messages::HWProtocolMessage; use protocol::messages::HWServerMessage::*; +mod common; mod loggingin; mod lobby; mod inroom;