diff -r 1ddb8aac5e30 -r 1e39b8749072 gameServer2/src/protocol/messages.rs --- a/gameServer2/src/protocol/messages.rs Thu Mar 08 16:49:49 2018 +0100 +++ b/gameServer2/src/protocol/messages.rs Thu Mar 08 15:01:18 2018 -0500 @@ -3,7 +3,7 @@ use std::ops; use std::convert::From; -#[derive(PartialEq, Debug)] +#[derive(PartialEq, Eq, Clone, Debug)] pub enum HWProtocolMessage { // core Ping, @@ -69,17 +69,17 @@ Empty, } -pub enum HWServerMessage<'a> { +pub enum HWServerMessage { Ping, Pong, - Bye(&'a str), - Nick(&'a str), - LobbyLeft(&'a str), - LobbyJoined(&'a [&'a str]), - ChatMsg(&'a str, &'a str), - ClientFlags(&'a str, &'a [&'a str]), + Bye(String), + Nick(String), + LobbyLeft(String), + LobbyJoined(Vec), + ChatMsg(String, String), + ClientFlags(String, Vec), - Warning(&'a str), + Warning(String), Connected(u32), Unreachable, } @@ -96,41 +96,117 @@ m } -impl<'a> HWServerMessage<'a> { +impl<'a> HWProtocolMessage { pub fn to_raw_protocol(&self) -> String { + use self::HWProtocolMessage::*; + match *self { + Ping => "PING\n\n".to_string(), + Pong => "PONG\n\n".to_string(), + Quit(None) => format!("QUIT\n\n"), + Quit(Some(ref msg)) => format!("QUIT\n{}\n\n", msg), + Global(ref msg) => format!("CMD\nGLOBAL\n{}\n\n", msg), + Watch(ref name) => format!("CMD\nWATCH\n{}\n\n", name), + ToggleServerRegisteredOnly => "CMD\nREGISTERED_ONLY\n\n".to_string(), + SuperPower => "CMD\nSUPER_POWER\n\n".to_string(), + Info(ref info) => format!("CMD\nINFO\n{}\n\n", info), + Nick(ref nick) => format!("NICK\n{}\n\n", nick), + Proto(version) => format!("PROTO\n{}\n\n", version), + Password(ref p, ref s) => format!("PASSWORD\n{}\n{}\n\n", p, s), //? + Checker(i, ref n, ref p) => + format!("CHECKER\n{}\n{}\n{}\n\n", i, n, p), //?, + List => "LIST\n\n".to_string(), + Chat(ref msg) => format!("CHAT\n{}\n\n", msg), + CreateRoom(ref name, None) => + format!("CREATE_ROOM\n{}\n\n", name), + CreateRoom(ref name, Some(ref password)) => + format!("CREATE_ROOM\n{}\n{}\n\n", name, password), + Join(ref name, None) => + format!("JOIN\n{}\n\n", name), + Join(ref name, Some(ref arg)) => + format!("JOIN\n{}\n{}\n\n", name, arg), + Follow(ref name) => + format!("FOLLOW\n{}\n\n", name), + //Rnd(Vec), ??? + Kick(ref name) => format!("KICK\n{}\n\n", name), + Ban(ref name, ref reason, time) => + format!("BAN\n{}\n{}\n{}\n\n", name, reason, time), + BanIP(ref ip, ref reason, time) => + format!("BAN_IP\n{}\n{}\n{}\n\n", ip, reason, time), + BanNick(ref nick, ref reason, time) => + format!("BAN_NICK\n{}\n{}\n{}\n\n", nick, reason, time), + BanList => "BANLIST\n\n".to_string(), + Unban(ref name) => format!("UNBAN\n{}\n\n", name), + //SetServerVar(ServerVar), ??? + GetServerVar => "GET_SERVER_VAR\n\n".to_string(), + RestartServer => "CMD\nRESTART_SERVER\nYES\n\n".to_string(), + Stats => "CMD\nSTATS\n\n".to_string(), + Part(None) => "CMD\nPART\n\n".to_string(), + Part(Some(ref msg)) => format!("CMD\nPART\n{}\n\n", msg), + //Cfg(GameCfg) ?? + //AddTeam(TeamInfo) ??, + RemoveTeam(ref name) => format!("REMOVE_TEAM\n{}\n\n", name), + //SetHedgehogsNumber(String, u8), ?? + //SetTeamColor(String, u8), ?? + ToggleReady => "TOGGLE_READY\n\n".to_string(), + StartGame => "START_GAME\n\n".to_string(), + EngineMessage(ref msg) => format!("EM\n{}\n\n", msg), + RoundFinished => "ROUNDFINISHED\n\n".to_string(), + ToggleRestrictJoin => "TOGGLE_RESTRICT_JOINS\n\n".to_string(), + ToggleRestrictTeams => "TOGGLE_RESTRICT_TEAMS\n\n".to_string(), + ToggleRegisteredOnly => "TOGGLE_REGISTERED_ONLY\n\n".to_string(), + RoomName(ref name) => format!("ROOM_NAME\n{}\n\n", name), + Delegate(ref name) => format!("CMD\nDELEGATE\n{}\n\n", name), + TeamChat(ref msg) => format!("TEAMCHAT\n{}\n\n", msg), + MaxTeams(count) => format!("CMD\nMAXTEAMS\n{}\n\n", count) , + Fix => "CMD\nFIX\n\n".to_string(), + Unfix => "CMD\nUNFIX\n\n".to_string(), + Greeting(ref msg) => format!("CMD\nGREETING\n{}\n\n", msg), + //CallVote(Option<(String, Option)>) =>, ?? + Vote(ref msg) => format!("CMD\nVOTE\n{}\n\n", msg), + ForceVote(ref msg) => format!("CMD\nFORCE\n{}\n\n", msg), + //Save(String, String), ?? + Delete(ref room) => format!("CMD\nDELETE\n{}\n\n", room), + SaveRoom(ref room) => format!("CMD\nSAVEROOM\n{}\n\n", room), + LoadRoom(ref room) => format!("CMD\nLOADROOM\n{}\n\n", room), + Malformed => "A\nQUICK\nBROWN\nHOG\nJUMPS\nOVER\nTHE\nLAZY\nDOG\n\n".to_string(), + Empty => "\n\n".to_string(), + _ => panic!("Protocol message not yet implemented") + } + } +} + +impl HWServerMessage { + pub fn to_raw_protocol(&self) -> String { + use self::HWServerMessage::*; match self { - &HWServerMessage::Ping - => "PING\n\n".to_string(), - &HWServerMessage::Pong - => "PONG\n\n".to_string(), - &HWServerMessage::Connected(protocol_version) + &Ping => "PING\n\n".to_string(), + &Pong => "PONG\n\n".to_string(), + &Connected(protocol_version) => construct_message(&[ "CONNECTED", "Hedgewars server http://www.hedgewars.org/", &protocol_version.to_string() ]), - &HWServerMessage::Bye(msg) - => construct_message(&["BYE", &msg]), - &HWServerMessage::Nick(nick) - => construct_message(&["NICK", &nick]), - &HWServerMessage::LobbyLeft(nick) + &Bye(ref msg) => construct_message(&["BYE", &msg]), + &Nick(ref nick) => construct_message(&["NICK", &nick]), + &LobbyLeft(ref nick) => construct_message(&["LOBBY_LEFT", &nick]), - &HWServerMessage::LobbyJoined(nicks) + &LobbyJoined(ref nicks) => { let mut v = vec!["LOBBY:JOINED"]; - v.extend_from_slice(nicks); + v.extend(nicks.iter().map(|n| { &n[..] })); construct_message(&v) }, - &HWServerMessage::ClientFlags(flags, nicks) - => { + &ClientFlags(ref flags, ref nicks) + => { let mut v = vec!["CLIENT_FLAGS"]; - v.push(flags); - v.extend_from_slice(nicks); + v.push(&flags[..]); + v.extend(nicks.iter().map(|n| { &n[..] })); construct_message(&v) }, - &HWServerMessage::ChatMsg(nick, msg) + &ChatMsg(ref nick, ref msg) => construct_message(&["CHAT", &nick, &msg]), - &HWServerMessage::Warning(msg) + &Warning(ref msg) => construct_message(&["WARNING", &msg]), _ => construct_message(&["ERROR", "UNIMPLEMENTED"]), }