Skip to content

Instantly share code, notes, and snippets.

@marmistrz
Created July 4, 2018 17:48
Show Gist options
  • Save marmistrz/34b5559585a099635961c775d8a59af3 to your computer and use it in GitHub Desktop.
Save marmistrz/34b5559585a099635961c775d8a59af3 to your computer and use it in GitHub Desktop.
# 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..378fb86e7
--- /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_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<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