rust/hedgewars-server/src/handlers.rs
changeset 16120 5febd2bc5372
parent 16031 e915ed28726e
--- a/rust/hedgewars-server/src/handlers.rs	Mon Feb 17 16:38:24 2025 +0100
+++ b/rust/hedgewars-server/src/handlers.rs	Sat Feb 22 19:39:31 2025 +0300
@@ -28,6 +28,7 @@
     types::{GameCfg, TeamInfo},
 };
 
+use crate::core::digest::Sha1Digest;
 use base64::encode;
 use log::*;
 use rand::{thread_rng, RngCore};
@@ -40,53 +41,6 @@
 mod inroom;
 mod strings;
 
-#[derive(PartialEq, Debug)]
-pub struct Sha1Digest([u8; 20]);
-
-impl Sha1Digest {
-    pub fn new(digest: [u8; 20]) -> Self {
-        Self(digest)
-    }
-}
-
-impl LowerHex for Sha1Digest {
-    fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> {
-        for byte in &self.0 {
-            write!(f, "{:02x}", byte)?;
-        }
-        Ok(())
-    }
-}
-
-impl PartialEq<&str> for Sha1Digest {
-    fn eq(&self, other: &&str) -> bool {
-        if other.len() != self.0.len() * 2 {
-            false
-        } else {
-            #[inline]
-            fn convert(c: u8) -> u8 {
-                if c > b'9' {
-                    c.wrapping_sub(b'a').saturating_add(10)
-                } else {
-                    c.wrapping_sub(b'0')
-                }
-            }
-
-            other
-                .as_bytes()
-                .chunks_exact(2)
-                .zip(&self.0)
-                .all(|(chars, byte)| {
-                    if let [hi, lo] = chars {
-                        convert(*lo) == byte & 0x0f && convert(*hi) == (byte & 0xf0) >> 4
-                    } else {
-                        unreachable!()
-                    }
-                })
-        }
-    }
-}
-
 pub struct ServerState {
     pub server: HwServer,
     pub anteroom: HwAnteroom,
@@ -270,16 +224,14 @@
         HwProtocolMessage::Ping => response.add(Pong.send_self()),
         HwProtocolMessage::Pong => (),
         _ => {
-            if state.anteroom.clients.contains(client_id) {
-                match inanteroom::handle(state, client_id, response, message) {
+            if state.anteroom.has_client(client_id) {
+                match inanteroom::handle(&mut state.anteroom, client_id, response, message) {
                     LoginResult::Unchanged => (),
-                    LoginResult::Complete => {
-                        if let Some(client) = state.anteroom.remove_client(client_id) {
-                            let is_checker = client.is_checker;
-                            state.server.add_client(client_id, client);
-                            if !is_checker {
-                                common::get_lobby_join_data(&state.server, response);
-                            }
+                    LoginResult::Complete(client) => {
+                        let is_checker = client.is_checker;
+                        state.server.add_client(client_id, client);
+                        if !is_checker {
+                            common::get_lobby_join_data(&state.server, response);
                         }
                     }
                     LoginResult::Exit => {
@@ -292,12 +244,18 @@
                     HwProtocolMessage::Quit(Some(msg)) => {
                         common::remove_client(
                             &mut state.server,
+                            &mut state.anteroom,
                             response,
                             "User quit: ".to_string() + &msg,
                         );
                     }
                     HwProtocolMessage::Quit(None) => {
-                        common::remove_client(&mut state.server, response, "User quit".to_string());
+                        common::remove_client(
+                            &mut state.server,
+                            &mut state.anteroom,
+                            response,
+                            "User quit".to_string(),
+                        );
                     }
                     HwProtocolMessage::Info(nick) => {
                         if let Some(client) = state.server.find_client(&nick) {
@@ -394,7 +352,7 @@
         .filter(|_| !is_local)
         .and_then(|a| state.anteroom.find_ip_ban(a));
     if let Some(reason) = ban_reason {
-        response.add(HwServerMessage::Bye(reason).send_self());
+        response.add(Bye(reason).send_self());
         response.remove_client(client_id);
         false
     } else {
@@ -405,17 +363,20 @@
             .anteroom
             .add_client(client_id, encode(&salt), is_local);
 
-        response.add(
-            HwServerMessage::Connected(utils::SERVER_MESSAGE.to_owned(), utils::SERVER_VERSION)
-                .send_self(),
-        );
+        response
+            .add(Connected(utils::SERVER_MESSAGE.to_owned(), utils::SERVER_VERSION).send_self());
         true
     }
 }
 
 pub fn handle_client_loss(state: &mut ServerState, client_id: ClientId, response: &mut Response) {
     if state.anteroom.remove_client(client_id).is_none() {
-        common::remove_client(&mut state.server, response, "Connection reset".to_string());
+        common::remove_client(
+            &mut state.server,
+            &mut state.anteroom,
+            response,
+            "Connection reset".to_string(),
+        );
     }
 }
 
@@ -431,7 +392,7 @@
                 response.add(Bye(REGISTRATION_REQUIRED.to_string()).send_self());
                 response.remove_client(client_id);
             } else if is_registered {
-                let client = &state.anteroom.clients[client_id];
+                let client = state.anteroom.get_client(client_id);
                 response.add(AskPassword(client.server_salt.clone()).send_self());
             } else if let Some(client) = state.anteroom.remove_client(client_id) {
                 state.server.add_client(client_id, client);
@@ -508,7 +469,7 @@
 
 #[cfg(test)]
 mod test {
-    use super::Sha1Digest;
+    use crate::core::digest::Sha1Digest;
 
     #[test]
     fn hash_cmp_test() {