aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xCargo.lock45
-rw-r--r--azalea-client/src/client.rs26
-rwxr-xr-xbot/Cargo.toml2
-rw-r--r--bot/src/main.rs14
4 files changed, 82 insertions, 5 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 1e78a8a1..4eb28777 100755
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -32,10 +32,19 @@ dependencies = [
]
[[package]]
+name = "aho-corasick"
+version = "0.7.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
name = "anyhow"
-version = "1.0.59"
+version = "1.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c91f1f46651137be86f3a2b9a8359f9ab421d04d941c62b5982e1ca21113adf9"
+checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602"
[[package]]
name = "async-compression"
@@ -321,10 +330,12 @@ dependencies = [
name = "bot"
version = "0.1.0"
dependencies = [
+ "anyhow",
"azalea-client",
"azalea-core",
"azalea-physics",
"azalea-protocol",
+ "env_logger",
"tokio",
"uuid",
]
@@ -580,6 +591,19 @@ dependencies = [
]
[[package]]
+name = "env_logger"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c90bf5f19754d10198ccb95b70664fc925bd1fc090a0fd9a6ebc54acc8cd6272"
+dependencies = [
+ "atty",
+ "humantime",
+ "log",
+ "regex",
+ "termcolor",
+]
+
+[[package]]
name = "flate2"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -699,6 +723,12 @@ dependencies = [
]
[[package]]
+name = "humantime"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
+
+[[package]]
name = "idna"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1154,6 +1184,8 @@ version = "1.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
dependencies = [
+ "aho-corasick",
+ "memchr",
"regex-syntax",
]
@@ -1335,6 +1367,15 @@ dependencies = [
]
[[package]]
+name = "termcolor"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
name = "textwrap"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/azalea-client/src/client.rs b/azalea-client/src/client.rs
index 60bb324b..f3229e76 100644
--- a/azalea-client/src/client.rs
+++ b/azalea-client/src/client.rs
@@ -36,7 +36,9 @@ use std::{
};
use thiserror::Error;
use tokio::{
+ io::AsyncWriteExt,
sync::mpsc::{self, UnboundedReceiver, UnboundedSender},
+ task::JoinHandle,
time::{self},
};
@@ -46,6 +48,7 @@ pub enum Event {
Chat(ChatPacket),
/// A game tick, happens 20 times per second.
GameTick,
+ Packet(Box<ClientboundGamePacket>),
}
#[derive(Debug, Clone)]
@@ -72,6 +75,7 @@ pub struct Client {
pub player: Arc<Mutex<Player>>,
pub dimension: Arc<Mutex<Dimension>>,
pub physics_state: Arc<Mutex<PhysicsState>>,
+ tasks: Arc<Mutex<Vec<JoinHandle<()>>>>,
}
#[derive(Default)]
@@ -201,6 +205,7 @@ impl Client {
player: Arc::new(Mutex::new(Player::default())),
dimension: Arc::new(Mutex::new(Dimension::default())),
physics_state: Arc::new(Mutex::new(PhysicsState::default())),
+ tasks: Arc::new(Mutex::new(Vec::new())),
};
// just start up the game loop and we're ready!
@@ -208,8 +213,14 @@ impl Client {
// if you get an error right here that means you're doing something with locks wrong
// read the error to see where the issue is
// you might be able to just drop the lock or put it in its own scope to fix
- tokio::spawn(Self::protocol_loop(client.clone(), tx.clone()));
- tokio::spawn(Self::game_tick_loop(client.clone(), tx));
+ {
+ let mut tasks = client.tasks.lock().unwrap();
+ tasks.push(tokio::spawn(Self::protocol_loop(
+ client.clone(),
+ tx.clone(),
+ )));
+ tasks.push(tokio::spawn(Self::game_tick_loop(client.clone(), tx)));
+ }
Ok((client, rx))
}
@@ -219,6 +230,16 @@ impl Client {
self.write_conn.lock().await.write(packet).await
}
+ /// Disconnect from the server, ending all tasks.
+ pub async fn shutdown(self) -> Result<(), std::io::Error> {
+ self.write_conn.lock().await.write_stream.shutdown().await?;
+ let tasks = self.tasks.lock().unwrap();
+ for task in tasks.iter() {
+ task.abort();
+ }
+ Ok(())
+ }
+
async fn protocol_loop(client: Client, tx: UnboundedSender<Event>) {
loop {
let r = client.read_conn.lock().await.read().await;
@@ -254,6 +275,7 @@ impl Client {
client: &Client,
tx: &UnboundedSender<Event>,
) -> Result<(), HandleError> {
+ tx.send(Event::Packet(Box::new(packet.clone()))).unwrap();
match packet {
ClientboundGamePacket::Login(p) => {
debug!("Got login packet {:?}", p);
diff --git a/bot/Cargo.toml b/bot/Cargo.toml
index fa0b0c67..b51e6705 100755
--- a/bot/Cargo.toml
+++ b/bot/Cargo.toml
@@ -6,9 +6,11 @@ version = "0.1.0"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+anyhow = "1.0.65"
azalea-client = {path = "../azalea-client"}
azalea-core = {path = "../azalea-core"}
azalea-physics = {path = "../azalea-physics"}
azalea-protocol = {path = "../azalea-protocol"}
+env_logger = "0.9.1"
tokio = "1.19.2"
uuid = "1.1.2"
diff --git a/bot/src/main.rs b/bot/src/main.rs
index 5423e017..92c1bc91 100644
--- a/bot/src/main.rs
+++ b/bot/src/main.rs
@@ -1,8 +1,11 @@
use azalea_client::{Account, Client, Event, MoveDirection};
+use azalea_protocol::packets::game::ClientboundGamePacket;
use std::convert::TryInto;
#[tokio::main]
async fn main() {
+ env_logger::init();
+
let bot = Account::offline("bot");
let (bot, mut rx) = bot.join(&"localhost".try_into().unwrap()).await.unwrap();
@@ -12,7 +15,7 @@ async fn main() {
}
}
-async fn handle_event(event: Event, mut bot: Client) {
+async fn handle_event(event: Event, mut bot: Client) -> anyhow::Result<()> {
match event {
Event::Login => {
// tokio::time::sleep(std::time::Duration::from_secs(1)).await;
@@ -22,6 +25,15 @@ async fn handle_event(event: Event, mut bot: Client) {
// }
// bot.walk(MoveDirection::None);
}
+ Event::Packet(packet) => {
+ if let ClientboundGamePacket::SetHealth(_) = *packet {
+ println!("got set health");
+ bot.shutdown().await?;
+ panic!();
+ }
+ }
_ => {}
}
+
+ Ok(())
}