From 5011ae280c1b806b9186fedda07b950ae66c7528 Mon Sep 17 00:00:00 2001 From: Luuk van Oijen Date: Wed, 8 Nov 2023 21:35:13 +0100 Subject: [PATCH] wip downloading (it doesnt work) --- Cargo.lock | 1 + Cargo.toml | 2 + Resources/Client/LuuksDraftingMod.zip | Bin 0 -> 13711 bytes Resources/Client/LuuksRadarMod.zip | Bin 0 -> 5264 bytes src/config.rs | 3 + src/main.rs | 23 ++++++- src/server/client.rs | 85 +++++++++++++++++++++----- src/server/mod.rs | 7 ++- src/server/packet.rs | 7 +++ 9 files changed, 110 insertions(+), 18 deletions(-) create mode 100644 Resources/Client/LuuksDraftingMod.zip create mode 100644 Resources/Client/LuuksRadarMod.zip diff --git a/Cargo.lock b/Cargo.lock index b2b4931..2b23c74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -97,6 +97,7 @@ dependencies = [ "anyhow", "async-trait", "flate2", + "lazy_static", "log", "nalgebra", "num_enum", diff --git a/Cargo.toml b/Cargo.toml index 86740f8..fc85191 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,8 @@ edition = "2021" log = "0.4" pretty_env_logger = "0.4.0" +lazy_static = "1" + anyhow = "1.0.66" nalgebra = "0.31" num_enum = "0.5.7" diff --git a/Resources/Client/LuuksDraftingMod.zip b/Resources/Client/LuuksDraftingMod.zip new file mode 100644 index 0000000000000000000000000000000000000000..73f465bc9865a0ee35590b516ce007dca80be9ce GIT binary patch literal 13711 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
jb3o=%uQCpa7?*?{QL^l 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 Fe*pfOb|L@( literal 0 HcmV?d00001 diff --git a/Resources/Client/LuuksRadarMod.zip b/Resources/Client/LuuksRadarMod.zip new file mode 100644 index 0000000000000000000000000000000000000000..c1d5230bbbfe8680bdc8d937b640946b150c4343 GIT binary patch literal 5264 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, + #[serde(rename = "General")] pub general: GeneralSettings, } diff --git a/src/main.rs b/src/main.rs index e941d6b..7783115 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,16 @@ -#[macro_use] extern crate async_trait; #[macro_use] extern crate log; +#[macro_use] extern crate async_trait; +#[macro_use] extern crate lazy_static; mod server; mod config; #[tokio::main] async fn main() { - let user_config: config::Config = toml::from_str( + pretty_env_logger::formatted_timed_builder().filter_level(log::LevelFilter::max()).init(); + // pretty_env_logger::formatted_timed_builder().filter_level(log::LevelFilter::Info).init(); + + let mut user_config: config::Config = toml::from_str( &std::fs::read_to_string("ServerConfig.toml") .map_err(|_| error!("Failed to read config file!")) .expect("Failed to read config file!") @@ -14,6 +18,21 @@ async fn main() { .map_err(|_| error!("Failed to parse config file!")) .expect("Failed to parse config file!"); + // TODO: This should not error lol + for entry in std::fs::read_dir("Resources/Client").expect("Failed to read Resources/Client!") { + if let Ok(entry) = entry { + if entry.path().is_file() { + if let Ok(metadata) = entry.metadata() { + if let Some(filename) = entry.path().file_name().map(|s| s.to_string_lossy()) { + user_config.mods.push((filename.to_string(), metadata.len() as usize)); + } + } + } + } + } + + debug!("Mods: {:?}", user_config.mods); + let user_config = std::sync::Arc::new(user_config); let mut server = server::Server::new(user_config) diff --git a/src/server/client.rs b/src/server/client.rs index e5a66e2..d9f1d33 100644 --- a/src/server/client.rs +++ b/src/server/client.rs @@ -24,6 +24,10 @@ use super::packet::*; static ATOMIC_ID_COUNTER: AtomicU8 = AtomicU8::new(0); +lazy_static! { + static ref CLIENT_MOD_PROGRESS: Mutex> = Mutex::new(HashMap::new()); +} + #[derive(PartialEq)] pub enum ClientState { None, @@ -114,7 +118,7 @@ impl Client { } } - pub async fn authenticate(&mut self, config: &super::Config) -> anyhow::Result<()> { + pub async fn authenticate(&mut self, config: &super::Config) -> anyhow::Result { debug!("Authenticating client {}...", self.id); 'waiting_for_c: loop { @@ -128,6 +132,11 @@ impl Client { debug!("code: '{}' / {}", code as char, code); match code as char { 'C' => { + // We now delete existing data for this client ID, just in case. + // TODO: This seems like a recipe for disaster + let mut lock = CLIENT_MOD_PROGRESS.lock().await; + lock.remove(&(self.id as usize)); + // TODO: Check client version trace!("Client version packet"); self.socket.readable().await?; @@ -136,10 +145,54 @@ impl Client { break 'waiting_for_c; } 'D' => { - let id = self.read_raw(1).await?[0]; + // The download sequence is so awful + // It currently requires us to track what the next file is that + // we need to provide, which is hard to do with the current + // server design. + // I think I will simply keep a counter around that will + // track what the next mod is per client. + // TODO: Clean this up. It also needs to be moved out of the client code IMO + let id = self.read_raw(1).await?[0] as usize; debug!("HandleDownload connection for client id: {}", id); - debug!("Not handling this for now!"); - return Err(ClientError::IsDownloader.into()); + + self.write_packet(Packet::Raw(RawPacket::from_str("AG"))).await?; + + // TODO: How does this work??? + + let mut lock = CLIENT_MOD_PROGRESS.lock().await; + if lock.get(&id).is_none() { lock.insert(id, 0); } + let next_id = lock.get_mut(&id).unwrap(); + + let bmod = &config.mods[*next_id]; // TODO: This is a bit uhh yeah + + *next_id += 1; + + debug!("Mod name: {}", bmod.0); + + let mut mod_name = bmod.0.clone(); + if mod_name.starts_with("/") == false { + mod_name = format!("/{mod_name}"); + } + + let mod_path = format!("Resources/Client{mod_name}"); + let file_data = std::fs::read(mod_path)?; + + let packet = RawPacket::from_data(file_data); + // self.write_packet(Packet::Raw(packet)).await?; + + { + let mut lock = self.write_half.lock().await; + lock.writable().await?; + trace!("Sending packet!"); + if let Err(e) = tcp_write_raw(lock.deref_mut(), Packet::Raw(packet)).await { + error!("{:?}", e); + } + trace!("Packet sent!"); + drop(lock); + } + + // return Err(ClientError::IsDownloader.into()); + return Ok(false); } _ => { return Err(ClientError::AuthenticateError.into()); @@ -186,7 +239,7 @@ impl Client { ); self.sync(config).await?; - Ok(()) + Ok(true) } // TODO: https://github.com/BeamMP/BeamMP-Server/blob/master/src/TNetwork.cpp#L619 @@ -205,9 +258,20 @@ impl Client { match packet.data[0] as char { 'S' if packet.data.len() > 1 => match packet.data[1] as char { 'R' => { - let file_packet = RawPacket::from_code('-'); + // let file_packet = RawPacket::from_code('-'); // let file_data = "/bepis_dysoon_uu201_v3.zip;/bepis_laudi_v8_revolution.zip;/simraceclubclient.zip;48353220;50283849;1937;"; - // let file_packet = RawPacket::from_str(file_data); + let mut file_data = String::new(); + for (name, size) in &config.mods { + let mut mod_name = name.clone(); + if mod_name.starts_with("/") == false { + mod_name = format!("/{mod_name}"); + } + file_data.push_str(&format!("{mod_name};")); + } + for (name, size) in &config.mods { + file_data.push_str(&format!("{size};")); + } + let file_packet = RawPacket::from_str(&file_data); self.write_packet(Packet::Raw(file_packet)) .await? } @@ -218,13 +282,6 @@ impl Client { let mut file_name = packet.data_as_string().clone(); file_name.remove(0); // Remove f debug!("Client requested file {}", file_name); - self.kick(&format!("You have not yet downloaded {}!", file_name)).await; - // let mut lock = self.write_half.lock().await; - // lock.writable().await?; - // trace!("Sending packet!"); - // if let Err(e) = tcp_send_file(lock.deref_mut(), file_name).await { - // error!("{:?}", e); - // } } _ => error!("Unknown packet! {:?}", packet), } diff --git a/src/server/mod.rs b/src/server/mod.rs index 36e4924..b391d29 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -80,11 +80,11 @@ impl Server { let ci_ref = clients_incoming_ref.clone(); set.spawn(async move { - socket.set_nodelay(true); + socket.set_nodelay(true); // TODO: Is this good? let mut client = Client::new(socket); match client.authenticate(&cfg_ref).await { - Ok(_) => { + Ok(b) if b => { let mut lock = ci_ref .lock() .map_err(|e| error!("{:?}", e)) @@ -92,6 +92,9 @@ impl Server { lock.push(client); drop(lock); }, + Ok(b) => { + debug!("Downloader?"); + }, Err(e) => { error!("Authentication error occured, kicking player..."); error!("{:?}", e); diff --git a/src/server/packet.rs b/src/server/packet.rs index 43e5fab..27ffb2b 100644 --- a/src/server/packet.rs +++ b/src/server/packet.rs @@ -73,6 +73,13 @@ impl RawPacket { } } + pub fn from_data(data: Vec) -> Self { + Self { + header: data.len() as u32, + data, + } + } + pub fn from_str(str_data: &str) -> Self { let data = str_data.as_bytes().to_vec(); Self {