Created
July 4, 2018 17:21
-
-
Save marmistrz/0dd1e15ec88c8f767b54b6270bd44b83 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# HG changeset patch | |
# User Marcin Mielniczuk <marmistrz.dev@zoho.eu> | |
Implement server-side logic for Rnd | |
--- | |
gameServer2/src/protocol/messages.rs | 4 +- | |
gameServer2/src/server/handlers/common.rs | 63 +++++++++++++++++++++++ | |
gameServer2/src/server/handlers/inroom.rs | 6 ++- | |
gameServer2/src/server/handlers/lobby.rs | 4 +- | |
gameServer2/src/server/handlers/mod.rs | 1 + | |
5 files changed, 73 insertions(+), 5 deletions(-) | |
create mode 100644 gameServer2/src/server/handlers/common.rs | |
diff --git a/gameServer2/src/protocol/messages.rs b/gameServer2/src/protocol/messages.rs | |
index e31a270ca..ae72c1607 100644 | |
--- a/gameServer2/src/protocol/messages.rs | |
+++ b/gameServer2/src/protocol/messages.rs | |
@@ -78,7 +78,7 @@ pub enum HWServerMessage { | |
Proto(u32), | |
LobbyLeft(String, String), | |
LobbyJoined(Vec<String>), | |
- ChatMsg(String, String), | |
+ ChatMsg {nick: String, msg: String}, | |
ClientFlags(String, Vec<String>), | |
Rooms(Vec<String>), | |
RoomAdd(Vec<String>), | |
@@ -268,7 +268,7 @@ impl HWServerMessage { | |
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 --git a/gameServer2/src/server/handlers/common.rs b/gameServer2/src/server/handlers/common.rs | |
new file mode 100644 | |
index 000000000..bb8362473 | |
--- /dev/null | |
+++ b/gameServer2/src/server/handlers/common.rs | |
@@ -0,0 +1,63 @@ | |
+use protocol::messages::{ | |
+ HWProtocolMessage::{self, Rnd}, HWServerMessage::ChatMsg, | |
+}; | |
+use rand::{self, Rng}; | |
+use server::{actions::Action, server::HWServer}; | |
+ | |
+fn choose_consume<T>(mut v: Vec<T>) -> T { | |
+ let size = v.len(); | |
+ let i = rand::thread_rng().gen_range(0, size); | |
+ v.remove(i) | |
+} | |
+ | |
+pub fn rnd_reply(options: Vec<String>) -> Vec<Action> { | |
+ let options = if options.is_empty() { | |
+ vec!["heads".to_owned(), "tails".to_owned()] | |
+ } else { | |
+ options | |
+ }; | |
+ let reply = choose_consume(options); | |
+ let msg = ChatMsg { | |
+ nick: "[random]".to_owned(), | |
+ msg: reply, | |
+ }; | |
+ let msg = msg.send_self().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<Action>) -> 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<String>) { | |
+ 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 --git a/gameServer2/src/server/handlers/inroom.rs b/gameServer2/src/server/handlers/inroom.rs | |
index 21e23bbab..8933a66a8 100644 | |
--- a/gameServer2/src/server/handlers/inroom.rs | |
+++ b/gameServer2/src/server/handlers/inroom.rs | |
@@ -13,6 +13,7 @@ use server::{ | |
use utils::is_name_illegal; | |
use std::mem::swap; | |
use base64::{encode, decode}; | |
+use super::common::rnd_reply; | |
#[derive(Clone)] | |
struct ByMsg<'a> { | |
@@ -75,7 +76,7 @@ pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMes | |
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 { | |
@@ -281,7 +282,8 @@ pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMes | |
} | |
} | |
server.react(client_id, actions) | |
- } | |
+ }, | |
+ Rnd(v) => server.react(client_id, rnd_reply(v)), | |
_ => warn!("Unimplemented!") | |
} | |
} | |
diff --git a/gameServer2/src/server/handlers/lobby.rs b/gameServer2/src/server/handlers/lobby.rs | |
index c25ac6c2a..4d549f407 100644 | |
--- a/gameServer2/src/server/handlers/lobby.rs | |
+++ b/gameServer2/src/server/handlers/lobby.rs | |
@@ -10,6 +10,7 @@ use protocol::messages::{ | |
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 @@ pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMes | |
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 @@ pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMes | |
} | |
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 --git a/gameServer2/src/server/handlers/mod.rs b/gameServer2/src/server/handlers/mod.rs | |
index a9d799808..a8c2871c8 100644 | |
--- a/gameServer2/src/server/handlers/mod.rs | |
+++ b/gameServer2/src/server/handlers/mod.rs | |
@@ -8,6 +8,7 @@ use super::actions::Action::*; | |
use protocol::messages::HWProtocolMessage; | |
use protocol::messages::HWServerMessage::*; | |
+mod common; | |
mod loggingin; | |
mod lobby; | |
mod inroom; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment