--- a/rust/hedgewars-server/src/server/actions.rs Mon Feb 04 19:22:21 2019 +0300
+++ b/rust/hedgewars-server/src/server/actions.rs Mon Feb 04 20:25:35 2019 +0300
@@ -113,8 +113,6 @@
pub enum Action {
Send(PendingMessage),
- RemoveClient,
- ByeClient(String),
CheckRegistered,
JoinLobby,
RemoveRoom(RoomId),
@@ -147,34 +145,6 @@
pub fn run_action(server: &mut HWServer, client_id: usize, action: Action) {
match action {
Send(msg) => server.send(client_id, &msg.destination, msg.message),
- ByeClient(msg) => {
- let c = &server.clients[client_id];
- let nick = c.nick.clone();
-
- if let Some(id) = c.room_id {
- if id != server.lobby_id {
- server.react(
- client_id,
- vec![MoveToLobby(format!("quit: {}", msg.clone()))],
- );
- }
- }
-
- server.react(
- client_id,
- vec![
- LobbyLeft(nick, msg.clone()).send_all().action(),
- Bye(msg).send_self().action(),
- RemoveClient,
- ],
- );
- }
- RemoveClient => {
- server.removed_clients.push(client_id);
- if server.clients.contains(client_id) {
- server.clients.remove(client_id);
- }
- }
CheckRegistered => {
let client = &server.clients[client_id];
if client.protocol_number > 0 && client.nick != "" {
@@ -185,7 +155,8 @@
let actions = if !client.is_checker() && has_nick_clash {
if client.protocol_number < 38 {
- vec![ByeClient("Nickname is already in use".to_string())]
+ //ByeClient("Nickname is already in use".to_string())
+ vec![]
} else {
server.clients[client_id].nick.clear();
vec![Notice("NickAlreadyInUse".to_string()).send_self().action()]
--- a/rust/hedgewars-server/src/server/core.rs Mon Feb 04 19:22:21 2019 +0300
+++ b/rust/hedgewars-server/src/server/core.rs Mon Feb 04 20:25:35 2019 +0300
@@ -61,12 +61,20 @@
key
}
- pub fn client_lost(&mut self, client_id: ClientId) {
- actions::run_action(
- self,
- client_id,
- actions::Action::ByeClient("Connection reset".to_string()),
- );
+ pub fn remove_client(&mut self, client_id: ClientId) {
+ let client = &self.clients[client_id];
+ let nick = client.nick.clone();
+
+ if let Some(id) = client.room_id {
+ if id != self.lobby_id {
+ //MoveToLobby(format!("quit: {}", msg.clone()))
+ }
+ }
+
+ self.removed_clients.push(client_id);
+ if self.clients.contains(client_id) {
+ self.clients.remove(client_id);
+ }
}
pub fn add_room(&mut self) -> &mut HWRoom {
--- a/rust/hedgewars-server/src/server/handlers.rs Mon Feb 04 19:22:21 2019 +0300
+++ b/rust/hedgewars-server/src/server/handlers.rs Mon Feb 04 20:25:35 2019 +0300
@@ -102,10 +102,10 @@
response.add(Pong.send_self());
}
HWProtocolMessage::Quit(Some(msg)) => {
- //ByeClient("User quit: ".to_string() + &msg)
+ common::remove_client(server, response, "User quit: ".to_string() + &msg);
}
HWProtocolMessage::Quit(None) => {
- //ByeClient("User quit".to_string())
+ common::remove_client(server, response, "User quit".to_string());
}
HWProtocolMessage::Malformed => warn!("Malformed/unknown message"),
HWProtocolMessage::Empty => warn!("Empty message"),
@@ -118,3 +118,7 @@
},
}
}
+
+pub fn handle_client_loss(server: &mut HWServer, client_id: ClientId, response: &mut Response) {
+ common::remove_client(server, response, "Connection reset".to_string());
+}
--- a/rust/hedgewars-server/src/server/handlers/common.rs Mon Feb 04 19:22:21 2019 +0300
+++ b/rust/hedgewars-server/src/server/handlers/common.rs Mon Feb 04 20:25:35 2019 +0300
@@ -21,6 +21,15 @@
}
}
+pub fn remove_client(server: &mut HWServer, response: &mut super::Response, msg: String) {
+ use HWServerMessage::*;
+ let nick = server.clients[response.client_id()].nick.clone();
+ response.add(LobbyLeft(nick, msg.to_string()).send_all());
+ response.add(Bye("User quit: ".to_string() + &msg).send_self());
+
+ server.remove_client(response.client_id());
+}
+
#[cfg(test)]
mod tests {
use super::*;
--- a/rust/hedgewars-server/src/server/handlers/loggingin.rs Mon Feb 04 19:22:21 2019 +0300
+++ b/rust/hedgewars-server/src/server/handlers/loggingin.rs Mon Feb 04 20:25:35 2019 +0300
@@ -51,11 +51,29 @@
} else if !client.nick.is_empty() {
response.add(Error("Nickname already provided.".to_string()).send_self());
} else if is_name_illegal(&nick) {
- // ByeClient("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())
+ super::common::remove_client(server, response, "Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())
} else {
client.nick = nick.clone();
response.add(Nick(nick).send_self());
- //CheckRegistered
+
+ if client.protocol_number > 0 {
+ //CheckRegistered
+ }
+ }
+ }
+ HWProtocolMessage::Proto(proto) => {
+ let client = &mut server.clients[client_id];
+ if client.protocol_number != 0 {
+ response.add(Error("Protocol already known.".to_string()).send_self());
+ } else if proto == 0 {
+ response.add(Error("Bad number.".to_string()).send_self());
+ } else {
+ client.protocol_number = proto;
+ response.add(Proto(proto).send_self());
+
+ if client.nick != "" {
+ // CheckRegistered
+ }
}
}
#[cfg(feature = "official-server")]
@@ -68,21 +86,9 @@
response.add(ServerAuth(format!("{:x}", server_hash)).send_self());
//JoinLobby
} else {
- //ByeClient("Authentication failed".to_string())
+ super::common::remove_client(server, response, "Authentication failed".to_string())
};
}
- HWProtocolMessage::Proto(proto) => {
- let client = &mut server.clients[client_id];
- if client.protocol_number != 0 {
- response.add(Error("Protocol already known.".to_string()).send_self());
- } else if proto == 0 {
- response.add(Error("Bad number.".to_string()).send_self());
- } else {
- client.protocol_number = proto;
- response.add(Proto(proto).send_self());
- // CheckRegistered
- }
- }
#[cfg(feature = "official-server")]
HWProtocolMessage::Checker(protocol, nick, password) => {
let c = &mut server.clients[client_id];
--- a/rust/hedgewars-server/src/server/network.rs Mon Feb 04 19:22:21 2019 +0300
+++ b/rust/hedgewars-server/src/server/network.rs Mon Feb 04 20:25:35 2019 +0300
@@ -470,7 +470,9 @@
pub fn client_error(&mut self, poll: &Poll, client_id: ClientId) -> io::Result<()> {
self.deregister_client(poll, client_id);
- self.server.client_lost(client_id);
+ let mut response = handlers::Response::new(client_id);
+ handlers::handle_client_loss(&mut self.server, client_id, &mut response);
+ self.flush_server_messages(response);
Ok(())
}