--- a/rust/hedgewars-server/src/server/handlers.rs Thu Feb 07 14:49:51 2019 +0300
+++ b/rust/hedgewars-server/src/server/handlers.rs Thu Feb 07 17:02:24 2019 +0300
@@ -5,8 +5,11 @@
use crate::{
protocol::messages::{HWProtocolMessage, HWServerMessage, HWServerMessage::*},
server::actions::PendingMessage,
+ utils,
};
+use base64::encode;
use log::*;
+use rand::{thread_rng, RngCore};
mod checker;
mod common;
@@ -14,6 +17,8 @@
mod lobby;
mod loggingin;
+use self::loggingin::LoginResult;
+
pub struct Response {
client_id: ClientId,
messages: Vec<PendingMessage>,
@@ -102,27 +107,51 @@
message: HWProtocolMessage,
) {
match message {
- HWProtocolMessage::Ping => {
- response.add(Pong.send_self());
- }
- HWProtocolMessage::Quit(Some(msg)) => {
- common::remove_client(server, response, "User quit: ".to_string() + &msg);
- }
- HWProtocolMessage::Quit(None) => {
- common::remove_client(server, response, "User quit".to_string());
- }
+ HWProtocolMessage::Ping => response.add(Pong.send_self()),
HWProtocolMessage::Malformed => warn!("Malformed/unknown message"),
HWProtocolMessage::Empty => warn!("Empty message"),
- _ => match server.clients[client_id].room_id {
- None => loggingin::handle(server, client_id, response, message),
- Some(id) if id == server.lobby_id => {
- lobby::handle(server, client_id, response, message)
+ _ => {
+ if server.anteroom.clients.contains(client_id) {
+ match loggingin::handle(&mut server.anteroom, client_id, response, message) {
+ LoginResult::Unchanged => (),
+ LoginResult::Complete => {
+ if let Some(client) = server.anteroom.remove_client(client_id) {
+ server.add_client(client_id, client);
+ }
+ }
+ LoginResult::Exit => {
+ server.anteroom.remove_client(client_id);
+ }
+ }
+ } else {
+ match message {
+ HWProtocolMessage::Quit(Some(msg)) => {
+ common::remove_client(server, response, "User quit: ".to_string() + &msg);
+ }
+ HWProtocolMessage::Quit(None) => {
+ common::remove_client(server, response, "User quit".to_string());
+ }
+ _ => match server.clients[client_id].room_id {
+ None => lobby::handle(server, client_id, response, message),
+ Some(room_id) => {
+ inroom::handle(server, client_id, response, room_id, message)
+ }
+ },
+ }
}
- Some(id) => inroom::handle(server, client_id, response, id, message),
- },
+ }
}
}
+pub fn handle_client_accept(server: &mut HWServer, client_id: ClientId, response: &mut Response) {
+ let mut salt = [0u8; 18];
+ thread_rng().fill_bytes(&mut salt);
+
+ server.anteroom.add_client(client_id, encode(&salt));
+
+ response.add(HWServerMessage::Connected(utils::PROTOCOL_VERSION).send_self());
+}
+
pub fn handle_client_loss(server: &mut HWServer, client_id: ClientId, response: &mut Response) {
common::remove_client(server, response, "Connection reset".to_string());
}