aboutsummaryrefslogtreecommitdiff
path: root/minecraft-client/src
diff options
context:
space:
mode:
Diffstat (limited to 'minecraft-client/src')
-rw-r--r--minecraft-client/src/connect.rs49
-rw-r--r--minecraft-client/src/lib.rs3
-rw-r--r--minecraft-client/src/listeners/handshake.rs0
-rw-r--r--minecraft-client/src/listeners/mod.rs3
-rw-r--r--minecraft-client/src/ping.rs7
5 files changed, 58 insertions, 4 deletions
diff --git a/minecraft-client/src/connect.rs b/minecraft-client/src/connect.rs
new file mode 100644
index 00000000..1d49fb89
--- /dev/null
+++ b/minecraft-client/src/connect.rs
@@ -0,0 +1,49 @@
+///! Connect to Minecraft servers.
+use minecraft_protocol::{
+ connect::Connection,
+ packets::{
+ handshake::client_intention_packet::ClientIntentionPacket,
+ login::serverbound_hello_packet::ServerboundHelloPacket,
+ status::clientbound_status_response_packet::ClientboundStatusResponsePacket,
+ ConnectionProtocol, Packet, PacketTrait, PROTOCOL_VERSION,
+ },
+ resolver, ServerAddress,
+};
+
+pub async fn join_server(address: &ServerAddress) -> Result<(), String> {
+ let username = "bot".to_string();
+
+ let resolved_address = resolver::resolve_address(address).await?;
+
+ let mut conn = Connection::new(&resolved_address).await?;
+
+ // handshake
+ conn.send_packet(
+ ClientIntentionPacket {
+ protocol_version: PROTOCOL_VERSION,
+ hostname: address.host.clone(),
+ port: address.port,
+ intention: ConnectionProtocol::Login,
+ }
+ .get(),
+ )
+ .await;
+ conn.switch_state(ConnectionProtocol::Login);
+
+ // login start
+ conn.send_packet(ServerboundHelloPacket { username }.get())
+ .await;
+
+ // encryption request
+ let packet = conn.read_packet().await.unwrap();
+ let encryption_request_packet = match packet {
+ Packet::ClientboundHelloPacket(p) => p,
+ _ => Err(format!("Invalid packet type: {:?}", packet))?,
+ };
+
+ // TODO: client auth
+
+ // TODO: encryption response
+
+ Ok(())
+}
diff --git a/minecraft-client/src/lib.rs b/minecraft-client/src/lib.rs
index 1fc97709..d4ceebde 100644
--- a/minecraft-client/src/lib.rs
+++ b/minecraft-client/src/lib.rs
@@ -1,3 +1,6 @@
+//! Significantly abstract minecraft-protocol so it's actually useable for bots.
+
+pub mod connect;
pub mod ping;
#[cfg(test)]
diff --git a/minecraft-client/src/listeners/handshake.rs b/minecraft-client/src/listeners/handshake.rs
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/minecraft-client/src/listeners/handshake.rs
diff --git a/minecraft-client/src/listeners/mod.rs b/minecraft-client/src/listeners/mod.rs
new file mode 100644
index 00000000..1f174453
--- /dev/null
+++ b/minecraft-client/src/listeners/mod.rs
@@ -0,0 +1,3 @@
+trait PacketListener {
+ handle(Packet)
+} \ No newline at end of file
diff --git a/minecraft-client/src/ping.rs b/minecraft-client/src/ping.rs
index 05aa84be..a7a01786 100644
--- a/minecraft-client/src/ping.rs
+++ b/minecraft-client/src/ping.rs
@@ -1,14 +1,13 @@
///! Ping Minecraft servers.
-
use minecraft_protocol::{
- connection::Connection,
+ connect::Connection,
packets::{
handshake::client_intention_packet::ClientIntentionPacket,
status::{
clientbound_status_response_packet::ClientboundStatusResponsePacket,
serverbound_status_request_packet::ServerboundStatusRequestPacket,
},
- ConnectionProtocol, Packet, PacketTrait,
+ ConnectionProtocol, Packet, PacketTrait, PROTOCOL_VERSION,
},
resolver, ServerAddress,
};
@@ -23,7 +22,7 @@ pub async fn ping_server(
// send the client intention packet and switch to the status state
conn.send_packet(
ClientIntentionPacket {
- protocol_version: 757,
+ protocol_version: PROTOCOL_VERSION,
hostname: address.host.clone(),
port: address.port,
intention: ConnectionProtocol::Status,