diff --git a/Cargo.lock b/Cargo.lock index 3523957d..c9d4122f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,7 +455,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -464,12 +463,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - [[package]] name = "futures-sink" version = "0.3.30" @@ -489,13 +482,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", - "futures-io", - "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", - "slab", ] [[package]] @@ -1236,6 +1225,7 @@ dependencies = [ "fastnbt 2.5.0 (git+https://github.com/owengage/fastnbt.git)", "fastsnbt", "pumpkin-protocol", + "tokio", ] [[package]] @@ -1295,7 +1285,6 @@ dependencies = [ "base64", "bytes", "encoding_rs", - "futures-channel", "futures-core", "futures-util", "h2", diff --git a/pumpkin-world/Cargo.toml b/pumpkin-world/Cargo.toml index 56e82b44..c100edab 100644 --- a/pumpkin-world/Cargo.toml +++ b/pumpkin-world/Cargo.toml @@ -7,4 +7,5 @@ edition.workspace = true pumpkin-protocol = { path = "../pumpkin-protocol"} fastanvil = "0.31" fastnbt = { git = "https://github.com/owengage/fastnbt.git" } -fastsnbt = "0.2" \ No newline at end of file +fastsnbt = "0.2" +tokio.workspace = true \ No newline at end of file diff --git a/pumpkin/Cargo.toml b/pumpkin/Cargo.toml index 2572cf18..0239c0f1 100644 --- a/pumpkin/Cargo.toml +++ b/pumpkin/Cargo.toml @@ -28,7 +28,7 @@ rsa-der = "0.3.0" flate2 = "1.0.30" # authentication -reqwest = { version = "0.12.5", features = ["json", "blocking"]} +reqwest = { version = "0.12.5", features = ["json"]} sha1 = "0.10.6" digest = "=0.11.0-pre.9" diff --git a/pumpkin/src/client/authentication.rs b/pumpkin/src/client/authentication.rs index eaff1611..e8761993 100644 --- a/pumpkin/src/client/authentication.rs +++ b/pumpkin/src/client/authentication.rs @@ -46,7 +46,7 @@ pub struct GameProfile { pub profile_actions: Option>, } -pub fn authenticate( +pub async fn authenticate( username: &str, server_hash: &str, ip: &IpAddr, @@ -69,13 +69,14 @@ pub fn authenticate( .unwrap() .get(address) .send() + .await .map_err(|_| AuthError::FailedResponse)?; match response.status() { StatusCode::OK => {} StatusCode::NO_CONTENT => Err(AuthError::UnverifiedUsername)?, other => Err(AuthError::UnknownStatusCode(other.as_str().to_string()))?, } - let profile: GameProfile = response.json().map_err(|_| AuthError::FailedParse)?; + let profile: GameProfile = response.json().await.map_err(|_| AuthError::FailedParse)?; Ok(profile) } diff --git a/pumpkin/src/client/client_packet.rs b/pumpkin/src/client/client_packet.rs index 8a82ca91..52d8c072 100644 --- a/pumpkin/src/client/client_packet.rs +++ b/pumpkin/src/client/client_packet.rs @@ -71,7 +71,7 @@ impl Client { self.send_packet(packet); } - pub fn handle_encryption_response( + pub async fn handle_encryption_response( &mut self, server: &mut Server, encryption_response: SEncryptionResponse, @@ -96,7 +96,9 @@ impl Client { &hash, &ip, server, - ) { + ) + .await + { Ok(p) => { // Check if player should join if let Some(p) = &p.profile_actions { diff --git a/pumpkin/src/client/mod.rs b/pumpkin/src/client/mod.rs index e0359722..b7ddd230 100644 --- a/pumpkin/src/client/mod.rs +++ b/pumpkin/src/client/mod.rs @@ -156,17 +156,17 @@ impl Client { self.send_packet(CGameEvent::new(3, gamemode.to_f32().unwrap())); } - pub fn process_packets(&mut self, server: &mut Server) { + pub async fn process_packets(&mut self, server: &mut Server) { let mut i = 0; while i < self.client_packets_queue.len() { let mut packet = self.client_packets_queue.remove(i).unwrap(); - self.handle_packet(server, &mut packet); + self.handle_packet(server, &mut packet).await; i += 1; } } /// Handles an incoming decoded Packet - pub fn handle_packet(&mut self, server: &mut Server, packet: &mut RawPacket) { + pub async fn handle_packet(&mut self, server: &mut Server, packet: &mut RawPacket) { // TODO: handle each packet's Error instead of calling .unwrap() let bytebuf = &mut packet.bytebuf; match self.connection_state { @@ -198,7 +198,7 @@ impl Client { SEncryptionResponse::PACKET_ID => self.handle_encryption_response( server, SEncryptionResponse::read(bytebuf).unwrap(), - ), + ).await, SLoginPluginResponse::PACKET_ID => self .handle_plugin_response(server, SLoginPluginResponse::read(bytebuf).unwrap()), SLoginAcknowledged::PACKET_ID => self @@ -267,7 +267,7 @@ impl Client { // Reads the connection until our buffer of len 4096 is full, then decode /// Close connection when an error occurs - pub fn poll(&mut self, server: &mut Server, event: &Event) { + pub async fn poll(&mut self, server: &mut Server, event: &Event) { if event.is_readable() { let mut received_data = vec![0; 4096]; let mut bytes_read = 0; @@ -302,7 +302,7 @@ impl Client { Ok(packet) => { if let Some(packet) = packet { self.add_packet(packet); - self.process_packets(server); + self.process_packets(server).await; } } Err(err) => self.kick(&err.to_string()), diff --git a/pumpkin/src/main.rs b/pumpkin/src/main.rs index 84b445fb..2746444a 100644 --- a/pumpkin/src/main.rs +++ b/pumpkin/src/main.rs @@ -131,7 +131,7 @@ async fn main() -> io::Result<()> { // Maybe received an event for a TCP connection. let done = if let Some(client) = connections.get_mut(&token) { let mut client = client.borrow_mut(); - client.poll(&mut server, event); + client.poll(&mut server, event).await; client.closed } else { // Sporadic events happen, we can safely ignore them. diff --git a/pumpkin/src/server.rs b/pumpkin/src/server.rs index c13c1b3e..61066f86 100644 --- a/pumpkin/src/server.rs +++ b/pumpkin/src/server.rs @@ -56,7 +56,7 @@ pub struct Server { pub advanced_config: AdvancedConfiguration, /// Used for Authentication, None is Online mode is disabled - pub auth_client: Option, + pub auth_client: Option, } impl Server { @@ -75,7 +75,7 @@ impl Server { ) .into_boxed_slice(); let auth_client = if config.0.online_mode { - Some(reqwest::blocking::Client::new()) + Some(reqwest::Client::new()) } else { None }; @@ -99,9 +99,9 @@ impl Server { } // Returns Tokens to remove - pub fn poll(&mut self, client: &mut Client, _poll: &Poll, event: &Event) { + pub async fn poll(&mut self, client: &mut Client, _poll: &Poll, event: &Event) { // TODO: Poll players in every world - client.poll(self, event) + client.poll(self, event).await } pub fn add_client(&mut self, token: Rc, client: Rc>) {