2 use std; |
2 use std; |
3 use std::ops; |
3 use std::ops; |
4 use std::convert::From; |
4 use std::convert::From; |
5 |
5 |
6 #[derive(PartialEq, Debug)] |
6 #[derive(PartialEq, Debug)] |
7 pub enum HWProtocolMessage<'a> { |
7 pub enum HWProtocolMessage { |
8 // core |
8 // core |
9 Ping, |
9 Ping, |
10 Pong, |
10 Pong, |
11 Quit(Option<&'a str>), |
11 Quit(Option<String>), |
12 Bye(&'a str), |
12 //Cmd(String, Vec<String>), |
13 LobbyLeft(&'a str), |
13 Global(String), |
14 //Cmd(&'a str, Vec<&'a str>), |
14 Watch(String), |
15 Global(&'a str), |
|
16 Watch(&'a str), |
|
17 ToggleServerRegisteredOnly, |
15 ToggleServerRegisteredOnly, |
18 SuperPower, |
16 SuperPower, |
19 Info(&'a str), |
17 Info(String), |
20 // not entered state |
18 // not entered state |
21 Nick(&'a str), |
19 Nick(String), |
22 Proto(u32), |
20 Proto(u32), |
23 Password(&'a str, &'a str), |
21 Password(String, String), |
24 Checker(u32, &'a str, &'a str), |
22 Checker(u32, String, String), |
25 // lobby |
23 // lobby |
26 List, |
24 List, |
27 Chat(&'a str), |
25 Chat(String), |
28 CreateRoom(&'a str, Option<&'a str>), |
26 CreateRoom(String, Option<String>), |
29 Join(&'a str, Option<&'a str>), |
27 Join(String, Option<String>), |
30 Follow(&'a str), |
28 Follow(String), |
31 Rnd(Vec<&'a str>), |
29 Rnd(Vec<String>), |
32 Kick(&'a str), |
30 Kick(String), |
33 Ban(&'a str, &'a str, u32), |
31 Ban(String, String, u32), |
34 BanIP(&'a str, &'a str, u32), |
32 BanIP(String, String, u32), |
35 BanNick(&'a str, &'a str, u32), |
33 BanNick(String, String, u32), |
36 BanList, |
34 BanList, |
37 Unban(&'a str), |
35 Unban(String), |
38 SetServerVar(ServerVar), |
36 SetServerVar(ServerVar), |
39 GetServerVar, |
37 GetServerVar, |
40 RestartServer, |
38 RestartServer, |
41 Stats, |
39 Stats, |
42 // in room |
40 // in room |
43 Part(Option<&'a str>), |
41 Part(Option<String>), |
44 Cfg(GameCfg), |
42 Cfg(GameCfg), |
45 AddTeam(TeamInfo), |
43 AddTeam(TeamInfo), |
46 RemoveTeam(&'a str), |
44 RemoveTeam(String), |
47 SetHedgehogsNumber(&'a str, u8), |
45 SetHedgehogsNumber(String, u8), |
48 SetTeamColor(&'a str, u8), |
46 SetTeamColor(String, u8), |
49 ToggleReady, |
47 ToggleReady, |
50 StartGame, |
48 StartGame, |
51 EngineMessage(&'a str), |
49 EngineMessage(String), |
52 RoundFinished, |
50 RoundFinished, |
53 ToggleRestrictJoin, |
51 ToggleRestrictJoin, |
54 ToggleRestrictTeams, |
52 ToggleRestrictTeams, |
55 ToggleRegisteredOnly, |
53 ToggleRegisteredOnly, |
56 RoomName(&'a str), |
54 RoomName(String), |
57 Delegate(&'a str), |
55 Delegate(String), |
58 TeamChat(&'a str), |
56 TeamChat(String), |
59 MaxTeams(u8), |
57 MaxTeams(u8), |
60 Fix, |
58 Fix, |
61 Unfix, |
59 Unfix, |
62 Greeting(&'a str), |
60 Greeting(String), |
63 CallVote(Option<(&'a str, Option<&'a str>)>), |
61 CallVote(Option<(String, Option<String>)>), |
64 Vote(&'a str), |
62 Vote(String), |
65 ForceVote(&'a str), |
63 ForceVote(String), |
66 Save(&'a str, &'a str), |
64 Save(String, String), |
67 Delete(&'a str), |
65 Delete(String), |
68 SaveRoom(&'a str), |
66 SaveRoom(String), |
69 LoadRoom(&'a str), |
67 LoadRoom(String), |
70 Connected(u32), |
|
71 Malformed, |
68 Malformed, |
72 Empty, |
69 Empty, |
73 } |
70 } |
74 |
71 |
75 pub fn number<T: From<u8> |
72 pub enum HWServerMessage<'a> { |
76 + std::default::Default |
73 Ping, |
77 + std::ops::MulAssign |
74 Pong, |
78 + std::ops::AddAssign> |
75 Bye(&'a str), |
79 (digits: Vec<u8>) -> T { |
76 Nick(&'a str), |
80 let mut value: T = T::default(); |
77 LobbyLeft(&'a str), |
81 for digit in digits { |
78 |
82 value *= T::from(10); |
79 Connected(u32), |
83 value += T::from(digit); |
80 Unreachable, |
84 } |
|
85 value |
|
86 } |
81 } |
87 |
82 |
88 fn construct_message(msg: & [&str]) -> String { |
83 fn construct_message(msg: & [&str]) -> String { |
89 let mut m = String::with_capacity(64); |
84 let mut m = String::with_capacity(64); |
90 |
85 |
95 m.push('\n'); |
90 m.push('\n'); |
96 |
91 |
97 m |
92 m |
98 } |
93 } |
99 |
94 |
100 impl<'a> HWProtocolMessage<'a> { |
95 impl<'a> HWServerMessage<'a> { |
101 pub fn to_raw_protocol(&self) -> String { |
96 pub fn to_raw_protocol(&self) -> String { |
102 match self { |
97 match self { |
103 &HWProtocolMessage::Ping |
98 &HWServerMessage::Ping |
104 => "PING\n\n".to_string(), |
99 => "PING\n\n".to_string(), |
105 &HWProtocolMessage::Pong |
100 &HWServerMessage::Pong |
106 => "PONG\n\n".to_string(), |
101 => "PONG\n\n".to_string(), |
107 &HWProtocolMessage::Connected(protocol_version) |
102 &HWServerMessage::Connected(protocol_version) |
108 => construct_message(&[ |
103 => construct_message(&[ |
109 "CONNECTED", |
104 "CONNECTED", |
110 "Hedgewars server http://www.hedgewars.org/", |
105 "Hedgewars server http://www.hedgewars.org/", |
111 &protocol_version.to_string() |
106 &protocol_version.to_string() |
112 ]), |
107 ]), |
113 &HWProtocolMessage::Bye(msg) |
108 &HWServerMessage::Bye(msg) |
114 => construct_message(&["BYE", msg]), |
109 => construct_message(&["BYE", &msg]), |
115 &HWProtocolMessage::Nick(nick) |
110 &HWServerMessage::Nick(nick) |
116 => construct_message(&["NICK", nick]), |
111 => construct_message(&["NICK", &nick]), |
117 &HWProtocolMessage::LobbyLeft(msg) |
112 &HWServerMessage::LobbyLeft(msg) |
118 => construct_message(&["LOBBY_LEFT", msg]), |
113 => construct_message(&["LOBBY_LEFT", &msg]), |
119 _ => construct_message(&["ERROR", "UNIMPLEMENTED"]), |
114 _ => construct_message(&["ERROR", "UNIMPLEMENTED"]), |
120 } |
115 } |
121 } |
116 } |
122 } |
117 } |