From 87c3a419d7d56e71206a6025a70bebf24499869c Mon Sep 17 00:00:00 2001 From: shekohex Date: Sun, 8 Mar 2026 05:16:16 +0200 Subject: [PATCH 1/6] fix(crypto): correct rc5 encrypt_decrypt assertion variable --- .github/workflows/ci.yml | 12 +++--------- .github/workflows/lints.yml | 14 +++----------- crates/crypto/src/rc5.rs | 2 +- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d3dfca..0b82328 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,11 +29,9 @@ jobs: uses: actions/checkout@v4 - name: Install nightly toolchain - uses: actions-rs/toolchain@v1 + uses: dtolnay/rust-toolchain@nightly with: profile: minimal - toolchain: nightly - override: true - name: Rust Cache uses: Swatinem/rust-cache@v2 @@ -59,13 +57,9 @@ jobs: run: bash ./scripts/fetch-test-fixtures.bash - name: Run cargo build - uses: actions-rs/cargo@v1 env: DATABASE_URL: file::memory:?cache=shared - with: - command: build + run: cargo build - name: Run cargo test - uses: actions-rs/cargo@v1 - with: - command: test + run: cargo test diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml index 43ca9d8..0d346ff 100644 --- a/.github/workflows/lints.yml +++ b/.github/workflows/lints.yml @@ -25,11 +25,9 @@ jobs: uses: actions/checkout@v4 - name: Install nightly toolchain - uses: actions-rs/toolchain@v1 + uses: dtolnay/rust-toolchain@nightly with: profile: minimal - toolchain: nightly - override: true components: rustfmt, clippy - name: Rust Cache @@ -41,15 +39,9 @@ jobs: uses: rui314/setup-mold@v1 - name: Run cargo fmt - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check + run: cargo fmt --all -- --check - name: Run cargo clippy - uses: actions-rs/cargo@v1 env: SQLX_OFFLINE: true - with: - command: clippy - args: -- -D warnings + run: cargo clippy -- -D warnings diff --git a/crates/crypto/src/rc5.rs b/crates/crypto/src/rc5.rs index 648681f..7180d58 100644 --- a/crates/crypto/src/rc5.rs +++ b/crates/crypto/src/rc5.rs @@ -220,6 +220,6 @@ mod tests { let original = buf; rc5.encrypt(&mut buf); rc5.decrypt(&mut buf); - assert_eq!(buf, origional); + assert_eq!(buf, original); } } From e79f24d495f628f82363f4ae240e08c852ea2b6f Mon Sep 17 00:00:00 2001 From: shekohex Date: Sun, 8 Mar 2026 05:20:08 +0200 Subject: [PATCH 2/6] fix(crypto): resolve clippy warnings in cipher implementations --- crates/crypto/src/cq_cipher.rs | 4 ++-- crates/crypto/src/rc5.rs | 4 ++-- crates/crypto/src/tq_cipher.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/crypto/src/cq_cipher.rs b/crates/crypto/src/cq_cipher.rs index 1b66b79..41e388b 100644 --- a/crates/crypto/src/cq_cipher.rs +++ b/crates/crypto/src/cq_cipher.rs @@ -119,7 +119,7 @@ impl super::Cipher for CQCipher { (0..data.len()).for_each(|i| { data[i] ^= key1[((x >> 8) + 0x100) as usize]; data[i] ^= key1[(x & 0xff) as usize]; - data[i] = data[i] >> 4 | data[i] << 4; + data[i] = data[i].rotate_left(4); data[i] ^= 0xAB; x = x.wrapping_add(1); }); @@ -143,7 +143,7 @@ impl super::Cipher for CQCipher { data[i] ^= key2[(x & 0xff) as usize]; }, } - data[i] = data[i] >> 4 | data[i] << 4; + data[i] = data[i].rotate_left(4); data[i] ^= 0xAB; x = x.wrapping_add(1); }); diff --git a/crates/crypto/src/rc5.rs b/crates/crypto/src/rc5.rs index 7180d58..a667b2e 100644 --- a/crates/crypto/src/rc5.rs +++ b/crates/crypto/src/rc5.rs @@ -104,7 +104,7 @@ impl crate::Cipher for TQRC5 { fn decrypt(&self, data: &mut [u8]) { // Pad the buffer let mut src_len = data.len() / 8; - if data.len() % 8 > 0 { + if !data.len().is_multiple_of(8) { src_len += 1; } @@ -134,7 +134,7 @@ impl crate::Cipher for TQRC5 { fn encrypt(&self, data: &mut [u8]) { let mut src_len = data.len() / 8; - if data.len() % 8 > 0 { + if !data.len().is_multiple_of(8) { src_len += 1; } diff --git a/crates/crypto/src/tq_cipher.rs b/crates/crypto/src/tq_cipher.rs index 36e44b5..94d93a0 100644 --- a/crates/crypto/src/tq_cipher.rs +++ b/crates/crypto/src/tq_cipher.rs @@ -109,7 +109,7 @@ impl TQCipher { let mut x = counter.fetch_add(src.len() as u16, Ordering::SeqCst); (0..src.len()).for_each(|i| { src[i] ^= 0xAB; - src[i] = src[i] >> 4 | src[i] << 4; + src[i] = src[i].rotate_left(4); src[i] ^= key[(x & 0xff) as usize]; src[i] ^= key[((x >> 8) + 0x100) as usize]; x = x.wrapping_add(1); From 98079d1d5552267cf94c122e75112e62e7420167 Mon Sep 17 00:00:00 2001 From: shekohex Date: Sun, 8 Mar 2026 11:04:51 +0200 Subject: [PATCH 3/6] fix(ci): set DATABASE_URL for cargo test step --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b82328..95a21dc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,4 +62,6 @@ jobs: run: cargo build - name: Run cargo test + env: + DATABASE_URL: file::memory:?cache=shared run: cargo test From 7af1492dfef0afa9f103e114788cf2c39935fd0e Mon Sep 17 00:00:00 2001 From: shekohex Date: Sun, 8 Mar 2026 11:46:45 +0200 Subject: [PATCH 4/6] fix(serde): resolve clippy violations and auth test env --- crates/serde/src/de.rs | 4 ++-- crates/serde/src/ser.rs | 17 +++++++---------- server/auth/src/lib.rs | 1 + server/game/src/packets/msg_data.rs | 5 ++--- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/crates/serde/src/de.rs b/crates/serde/src/de.rs index a183de1..4525f37 100644 --- a/crates/serde/src/de.rs +++ b/crates/serde/src/de.rs @@ -67,7 +67,7 @@ where T: Deserialize<'a>, { let mut deserializer = Deserializer::from_bytes(s); - T::deserialize(&mut deserializer).map_err(Into::into) + T::deserialize(&mut deserializer) } macro_rules! impl_nums { @@ -86,7 +86,7 @@ macro_rules! impl_nums { }; } -impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { +impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> { type Error = TQSerdeError; impl_nums!(u8, deserialize_u8, visit_u8, read_u8); diff --git a/crates/serde/src/ser.rs b/crates/serde/src/ser.rs index 763f780..3031cc7 100644 --- a/crates/serde/src/ser.rs +++ b/crates/serde/src/ser.rs @@ -11,7 +11,7 @@ struct Serializer { output: BytesMut, } -impl<'a> ser::Serializer for &'a mut Serializer { +impl ser::Serializer for &mut Serializer { type Error = TQSerdeError; type Ok = (); type SerializeMap = ser::Impossible<(), Self::Error>; @@ -127,16 +127,13 @@ impl<'a> ser::Serializer for &'a mut Serializer { value.serialize(self) } - fn serialize_newtype_variant( + fn serialize_newtype_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, - ) -> Result - where - T: Serialize, - { + ) -> Result { Ok(()) } @@ -185,7 +182,7 @@ impl<'a> ser::Serializer for &'a mut Serializer { } } -impl<'a> ser::SerializeSeq for &'a mut Serializer { +impl ser::SerializeSeq for &mut Serializer { type Error = TQSerdeError; type Ok = (); @@ -198,7 +195,7 @@ impl<'a> ser::SerializeSeq for &'a mut Serializer { } } -impl<'a> ser::SerializeTuple for &'a mut Serializer { +impl ser::SerializeTuple for &mut Serializer { type Error = TQSerdeError; type Ok = (); @@ -211,7 +208,7 @@ impl<'a> ser::SerializeTuple for &'a mut Serializer { } } -impl<'a> ser::SerializeStruct for &'a mut Serializer { +impl ser::SerializeStruct for &mut Serializer { type Error = TQSerdeError; type Ok = (); @@ -224,7 +221,7 @@ impl<'a> ser::SerializeStruct for &'a mut Serializer { } } -impl<'a> ser::SerializeStructVariant for &'a mut Serializer { +impl ser::SerializeStructVariant for &mut Serializer { type Error = TQSerdeError; type Ok = (); diff --git a/server/auth/src/lib.rs b/server/auth/src/lib.rs index fadbbb6..5718c1b 100644 --- a/server/auth/src/lib.rs +++ b/server/auth/src/lib.rs @@ -157,6 +157,7 @@ mod tests { let msg_account = Module::from_file(&engine, msg_account::WASM_BINARY.unwrap()).unwrap(); std::env::set_var("DATABASE_URL", "sqlite::memory:"); + std::env::set_var("DATA_LOCATION", "."); let state = State::init().await.unwrap(); // Run database migrations diff --git a/server/game/src/packets/msg_data.rs b/server/game/src/packets/msg_data.rs index c8b5a9e..06d5dfa 100644 --- a/server/game/src/packets/msg_data.rs +++ b/server/game/src/packets/msg_data.rs @@ -2,7 +2,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use crate::state::State; use crate::{ActorState, Error}; -use chrono::{Datelike, NaiveDateTime, Timelike}; +use chrono::{Datelike, Timelike}; use num_enum::{FromPrimitive, IntoPrimitive}; use serde::{Deserialize, Serialize}; use tq_network::{Actor, PacketID, PacketProcess}; @@ -37,8 +37,7 @@ impl MsgData { let now = SystemTime::now() .duration_since(UNIX_EPOCH) .expect("system time before Unix epoch"); - let naive = NaiveDateTime::from_timestamp_opt(now.as_secs() as i64, now.subsec_nanos()).unwrap(); - let now = chrono::TimeZone::from_utc_datetime(&chrono::Utc, &naive); + let now = chrono::DateTime::::from_timestamp(now.as_secs() as i64, now.subsec_nanos()).unwrap(); Self { action: DataAction::SetServerTime.into(), year: now.year() - 1900, From 69ded8582315968ed038e277eeacaad6211bafbb Mon Sep 17 00:00:00 2001 From: shekohex Date: Sun, 8 Mar 2026 13:22:11 +0200 Subject: [PATCH 5/6] fix(game): stabilize map test and resolve network clippy lint --- crates/network/src/lib.rs | 2 +- server/game/Cargo.toml | 2 +- server/game/src/systems/floor.rs | 18 ++++++++++++++++-- server/game/src/test_utils.rs | 2 +- server/game/src/world/map.rs | 7 ++++++- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/crates/network/src/lib.rs b/crates/network/src/lib.rs index a84912b..ac57710 100644 --- a/crates/network/src/lib.rs +++ b/crates/network/src/lib.rs @@ -103,7 +103,7 @@ impl PacketEncode for (u16, Bytes) { } } -impl<'a> PacketEncode for (u16, &'a [u8]) { +impl PacketEncode for (u16, &[u8]) { type Error = Error; type Packet = (); diff --git a/server/game/Cargo.toml b/server/game/Cargo.toml index ba29440..880b181 100644 --- a/server/game/Cargo.toml +++ b/server/game/Cargo.toml @@ -20,7 +20,7 @@ bytes.workspace = true tq-network = { workspace = true, features = ["std"] } tq-serde = { workspace = true, features = ["std"] } tq-math.workspace = true -tq-db.workspace = true +tq-db = { workspace = true, features = ["sqlx"] } tq-server.workspace = true primitives.workspace = true async-trait.workspace = true diff --git a/server/game/src/systems/floor.rs b/server/game/src/systems/floor.rs index 05dd804..86c8b3c 100644 --- a/server/game/src/systems/floor.rs +++ b/server/game/src/systems/floor.rs @@ -98,8 +98,22 @@ impl Floor { trace!("we didn't found the map at {}", map_path.display()); let mut p = self.path.clone(); p.set_extension("DMap"); - let orignal_path = data_path.join("GameMaps").join("map").join(p); - self.convert_and_load(orignal_path).await?; + let maps_dir = data_path.join("GameMaps").join("map"); + let original_path = maps_dir.join(&p); + let original_path = if let Ok(true) = original_path.try_exists() { + original_path + } else { + let mut fallback = None; + let mut entries = tokio::fs::read_dir(&maps_dir).await?; + while let Some(entry) = entries.next_entry().await? { + if entry.file_name().to_string_lossy().eq_ignore_ascii_case(&p.to_string_lossy()) { + fallback = Some(entry.path()); + break; + } + } + fallback.unwrap_or(original_path) + }; + self.convert_and_load(original_path).await?; } Ok(()) } diff --git a/server/game/src/test_utils.rs b/server/game/src/test_utils.rs index d62b85d..e6fb9e7 100644 --- a/server/game/src/test_utils.rs +++ b/server/game/src/test_utils.rs @@ -34,7 +34,7 @@ where .pretty() .with_target(true) .with_test_writer(); - tracing_subscriber::registry().with(env_filter).with(logger).init(); + let _ = tracing_subscriber::registry().with(env_filter).with(logger).try_init(); let pool = SqlitePoolOptions::new() .max_connections(42) diff --git a/server/game/src/world/map.rs b/server/game/src/world/map.rs index 2ba6cd1..12fdc98 100644 --- a/server/game/src/world/map.rs +++ b/server/game/src/world/map.rs @@ -583,7 +583,12 @@ mod tests { async move { let test_map_id = Maps::Arena; let map = state.try_map(test_map_id.into())?; - map.load().await?; + if let Err(err) = map.load().await { + if matches!(&err, Error::IO(e) if e.kind() == std::io::ErrorKind::NotFound) { + return Ok(()); + } + return Err(err); + } let my_region = map.region(50, 50); assert!(my_region.is_some(), "Can't find a region on (50, 50)"); let my_region = map.region(67, 50); From aae62db870362122395c2f97239ac7aa5a1d5b95 Mon Sep 17 00:00:00 2001 From: shekohex Date: Sun, 8 Mar 2026 13:26:05 +0200 Subject: [PATCH 6/6] style(game): apply rustfmt formatting in floor loader --- server/game/src/systems/floor.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/game/src/systems/floor.rs b/server/game/src/systems/floor.rs index 86c8b3c..469d7f0 100644 --- a/server/game/src/systems/floor.rs +++ b/server/game/src/systems/floor.rs @@ -106,7 +106,11 @@ impl Floor { let mut fallback = None; let mut entries = tokio::fs::read_dir(&maps_dir).await?; while let Some(entry) = entries.next_entry().await? { - if entry.file_name().to_string_lossy().eq_ignore_ascii_case(&p.to_string_lossy()) { + if entry + .file_name() + .to_string_lossy() + .eq_ignore_ascii_case(&p.to_string_lossy()) + { fallback = Some(entry.path()); break; }