diff options
Diffstat (limited to 'minecraft-client/src')
| -rw-r--r-- | minecraft-client/src/connect.rs | 49 | ||||
| -rw-r--r-- | minecraft-client/src/lib.rs | 3 | ||||
| -rw-r--r-- | minecraft-client/src/listeners/handshake.rs | 0 | ||||
| -rw-r--r-- | minecraft-client/src/listeners/mod.rs | 3 | ||||
| -rw-r--r-- | minecraft-client/src/ping.rs | 7 |
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, |
