# HG changeset patch # User alfadur # Date 1531769524 -10800 # Node ID ba5211dddb21274df35bfcd7dda05db19d00f6ba # Parent 1ee192f134567810af01f15b8ba029312e027af8 Assorted chat fixes diff -r 1ee192f13456 -r ba5211dddb21 gameServer2/src/server/handlers/common.rs --- a/gameServer2/src/server/handlers/common.rs Fri Jul 13 19:52:19 2018 +0300 +++ b/gameServer2/src/server/handlers/common.rs Mon Jul 16 22:32:04 2018 +0300 @@ -1,30 +1,21 @@ use protocol::messages::{ HWProtocolMessage::{self, Rnd}, HWServerMessage::{self, ChatMsg}, }; -use rand::{self, Rng}; -use server::{actions::Action, room::HWRoom, server::HWServer}; +use rand::{self, Rng, thread_rng}; +use server::{actions::Action, server::HWServer}; -pub fn rnd_action(options: Vec, room: Option<&mut HWRoom>) -> Vec { - if let Some(room) = room { - let msg = rnd_reply(options); - vec![msg.send_all().in_room(room.id).action()] +pub fn rnd_reply(options: &Vec) -> HWServerMessage { + let mut rng = thread_rng(); + let reply = if options.is_empty() { + (*rng.choose(&["heads", "tails"]).unwrap()).to_owned() } else { - Vec::new() - } -} + rng.choose(&options).unwrap().clone() + }; -fn rnd_reply(options: Vec) -> HWServerMessage { - 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 { + ChatMsg { nick: "[random]".to_owned(), msg: reply.clone(), - }; - msg + } } #[cfg(test)] @@ -45,7 +36,7 @@ fn run_handle_test(opts: Vec) { let opts2 = opts.clone(); for opt in opts { - while reply2string(rnd_reply(opts2.clone())) != opt {} + while reply2string(rnd_reply(&opts2)) != opt {} } } @@ -72,7 +63,7 @@ while tries < 1000 || ((ones as f64 / tries as f64) - lim).abs() >= eps { tries += 1; - if reply2string(rnd_reply(opts.clone())) == 1.to_string() { + if reply2string(rnd_reply(&opts)) == 1.to_string() { ones += 1; } } diff -r 1ee192f13456 -r ba5211dddb21 gameServer2/src/server/handlers/inroom.rs --- a/gameServer2/src/server/handlers/inroom.rs Fri Jul 13 19:52:19 2018 +0300 +++ b/gameServer2/src/server/handlers/inroom.rs Mon Jul 16 22:32:04 2018 +0300 @@ -6,7 +6,7 @@ server_chat }; use server::{ - coretypes::{ClientId, Voting, VoteType}, + coretypes::{ClientId, RoomId, Voting, VoteType}, server::HWServer, room::HWRoom, actions::{Action, Action::*} @@ -14,7 +14,7 @@ use utils::is_name_illegal; use std::mem::swap; use base64::{encode, decode}; -use super::common::rnd_action; +use super::common::rnd_reply; #[derive(Clone)] struct ByMsg<'a> { @@ -81,7 +81,7 @@ }) } -pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) { +pub fn handle(server: &mut HWServer, client_id: ClientId, room_id: RoomId, message: HWProtocolMessage) { use protocol::messages::HWProtocolMessage::*; match message { Part(None) => server.react(client_id, vec![ @@ -92,11 +92,7 @@ let actions = { let c = &mut server.clients[client_id]; 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 { - Vec::new() - } + vec![chat_msg.send_all().in_room(room_id).but_self().action()] }; server.react(client_id, actions); }, @@ -162,7 +158,6 @@ AddTeam(info) => { let mut actions = Vec::new(); if let (c, Some(r)) = server.client_and_room(client_id) { - let room_id = r.id; if r.teams.len() >= r.team_limit as usize { actions.push(Warn("Too many teams!".to_string())) } else if r.addable_hedgehogs() == 0 { @@ -207,7 +202,6 @@ }, SetHedgehogsNumber(team_name, number) => { let actions = if let (c, Some(r)) = server.client_and_room(client_id) { - let room_id = r.id; let addable_hedgehogs = r.addable_hedgehogs(); if let Some((_, mut team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { if !c.is_master() { @@ -232,7 +226,6 @@ SetTeamColor(team_name, color) => { let mut owner_id = None; let actions = if let (c, Some(r)) = server.client_and_room(client_id) { - let room_id = r.id; if let Some((owner, mut team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { if !c.is_master() { vec![ProtocolError("You're not the room master!".to_string())] @@ -280,8 +273,7 @@ .send_self().action()]) } CallVote(Some(kind)) => { - let (room_id, is_in_game) = server.room(client_id) - .map(|r| (r.id, r.game_info.is_some())).unwrap(); + let is_in_game = server.rooms[room_id].game_info.is_some(); let error = match &kind { VoteType::Kick(nick) => { if server.find_client(&nick).filter(|c| c.room_id == Some(room_id)).is_some() { @@ -398,8 +390,16 @@ server.react(client_id, actions) }, Rnd(v) => { - let actions = rnd_action(v, server.room(client_id)); - server.react(client_id, actions) + let result = rnd_reply(&v); + let mut echo = vec!["/rnd".to_string()]; + echo.extend(v.into_iter()); + let chat_msg = ChatMsg { + nick: server.clients[client_id].nick.clone(), + msg: echo.join(" ") + }; + server.react(client_id, vec![ + chat_msg.send_all().in_room(room_id).action(), + result.send_all().in_room(room_id).action()]) }, _ => warn!("Unimplemented!") } diff -r 1ee192f13456 -r ba5211dddb21 gameServer2/src/server/handlers/lobby.rs --- a/gameServer2/src/server/handlers/lobby.rs Fri Jul 13 19:52:19 2018 +0300 +++ b/gameServer2/src/server/handlers/lobby.rs Mon Jul 16 22:32:04 2018 +0300 @@ -10,7 +10,7 @@ HWServerMessage::* }; use utils::is_name_illegal; -use super::common::rnd_action; +use super::common::rnd_reply; pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) { use protocol::messages::HWProtocolMessage::*; @@ -31,8 +31,9 @@ server.react(client_id, actions); }, Chat(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()]); + let actions = vec![ChatMsg {nick: server.clients[client_id].nick.clone(), msg} + .send_all().in_room(server.lobby_id).but_self().action()]; + server.react(client_id, actions); }, JoinRoom(name, password) => { let actions; @@ -59,8 +60,7 @@ server.react(client_id, actions); }, Rnd(v) => { - let actions = rnd_action(v, server.room(client_id)); - server.react(client_id, actions) + server.react(client_id, vec![rnd_reply(&v).send_self().action()]); }, List => warn!("Deprecated LIST message received"), _ => warn!("Incorrect command in lobby state"), diff -r 1ee192f13456 -r ba5211dddb21 gameServer2/src/server/handlers/mod.rs --- a/gameServer2/src/server/handlers/mod.rs Fri Jul 13 19:52:19 2018 +0300 +++ b/gameServer2/src/server/handlers/mod.rs Mon Jul 16 22:32:04 2018 +0300 @@ -1,36 +1,38 @@ use mio; -use std::io::Write; -use std::io; +use std::{io, io::Write}; -use super::server::HWServer; -use super::actions::Action; -use super::actions::Action::*; -use protocol::messages::HWProtocolMessage; -use protocol::messages::HWServerMessage::*; - +use super::{ + server::HWServer, + actions::{Action, Action::*}, + coretypes::ClientId +}; +use protocol::messages::{ + HWProtocolMessage, + HWServerMessage::* +}; mod common; mod loggingin; mod lobby; mod inroom; -pub fn handle(server: &mut HWServer, token: usize, message: HWProtocolMessage) { +pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) { match message { HWProtocolMessage::Ping => - server.react(token, vec![Pong.send_self().action()]), + server.react(client_id, vec![Pong.send_self().action()]), HWProtocolMessage::Quit(Some(msg)) => - server.react(token, vec![ByeClient("User quit: ".to_string() + &msg)]), + server.react(client_id, vec![ByeClient("User quit: ".to_string() + &msg)]), HWProtocolMessage::Quit(None) => - server.react(token, vec![ByeClient("User quit".to_string())]), + server.react(client_id, vec![ByeClient("User quit".to_string())]), HWProtocolMessage::Malformed => warn!("Malformed/unknown message"), HWProtocolMessage::Empty => warn!("Empty message"), _ => { - match server.clients[token].room_id { + match server.clients[client_id].room_id { None => - loggingin::handle(server, token, message), + loggingin::handle(server, client_id, message), Some(id) if id == server.lobby_id => - lobby::handle(server, token, message), - _ => - inroom::handle(server, token, message) + lobby::handle(server, client_id, message), + Some(id) => + inroom::handle(server, client_id, id, message) } }, } diff -r 1ee192f13456 -r ba5211dddb21 gameServer2/src/server/server.rs --- a/gameServer2/src/server/server.rs Fri Jul 13 19:52:19 2018 +0300 +++ b/gameServer2/src/server/server.rs Mon Jul 16 22:32:04 2018 +0300 @@ -94,6 +94,8 @@ } } + pub fn lobby(&self) -> &HWRoom { &self.rooms[self.lobby_id] } + pub fn has_room(&self, name: &str) -> bool { self.rooms.iter().any(|(_, r)| r.name == name) }