diff --git a/README.md b/README.md index bb9317b..7ee9a3f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ rust_mc_proto = { git = "https://github.com/MeexReay/rust_mc_proto" } # unstable ``` Features: -- `atomic_clone` +- `atomic_clone` - clone MinecraftConnection like TcpStream. with compression and is_alive fields ## How to use @@ -24,40 +24,21 @@ pub type MCConnTcp = MinecraftConnection; Example of receiving motd: ```rust -use rust_mc_proto::{Packet, ProtocolError, MCConnTcp, DataBufferReader, DataBufferWriter}; +use rust_mc_proto::{DataBufferReader, DataBufferWriter, MCConnTcp, Packet, ProtocolError}; + +fn main() -> Result<(), ProtocolError> { + let mut conn = MCConnTcp::connect("mc.hypixel.net:25565")?; // connecting -fn send_handshake( - conn: &mut MCConnTcp, - protocol_version: u16, - server_address: &str, - server_port: u16, - next_state: u8 -) -> Result<(), ProtocolError> { conn.write_packet(&Packet::build(0x00, |packet| { - packet.write_u16_varint(protocol_version)?; - packet.write_string(server_address)?; - packet.write_unsigned_short(server_port)?; - packet.write_u8_varint(next_state) - })?) -} + packet.write_u16_varint(765)?; // protocol_version + packet.write_string("mc.hypixel.net")?; // server_address + packet.write_unsigned_short(25565)?; // server_port + packet.write_u8_varint(1) // next_state + })?)?; // handshake packet -fn send_status_request(conn: &mut MCConnTcp) -> Result<(), ProtocolError> { - conn.write_packet(&Packet::empty(0x00)) -} + conn.write_packet(&Packet::empty(0x00))?; // status request packet -fn read_status_response(conn: &mut MCConnTcp) -> Result { - conn.read_packet()?.read_string() -} - -fn main() { - let mut conn = MCConnTcp::connect("mc.hypixel.net:25565").unwrap(); - - send_handshake(&mut conn, 765, "mc.hypixel.net", 25565, 1).unwrap(); - send_status_request(&mut conn).unwrap(); - - let motd = read_status_response(&mut conn).unwrap(); - - dbg!(motd); + Ok(println!("motd: {}", conn.read_packet()?.read_string()?)) // status response packet } ``` diff --git a/examples/recv_motd_dirty.rs b/examples/recv_motd_dirty.rs new file mode 100644 index 0000000..e1878c0 --- /dev/null +++ b/examples/recv_motd_dirty.rs @@ -0,0 +1,16 @@ +use rust_mc_proto::{DataBufferReader, DataBufferWriter, MCConnTcp, Packet, ProtocolError}; + +fn main() -> Result<(), ProtocolError> { + let mut conn = MCConnTcp::connect("mc.hypixel.net:25565")?; // connecting + + conn.write_packet(&Packet::build(0x00, |packet| { + packet.write_u16_varint(765)?; // protocol_version + packet.write_string("mc.hypixel.net")?; // server_address + packet.write_unsigned_short(25565)?; // server_port + packet.write_u8_varint(1) // next_state + })?)?; // handshake packet + + conn.write_packet(&Packet::empty(0x00))?; // status request packet + + Ok(println!("motd: {}", conn.read_packet()?.read_string()?)) // status response packet +} diff --git a/examples/status_server.rs b/examples/status_server.rs index 77a40f3..eb4c5e2 100644 --- a/examples/status_server.rs +++ b/examples/status_server.rs @@ -1,4 +1,4 @@ -use std::{net::TcpListener, sync::{Arc, Mutex}, thread}; +use std::{net::TcpListener, sync::Arc, thread}; use rust_mc_proto::{DataBufferReader, DataBufferWriter, MCConnTcp, MinecraftConnection, Packet, ProtocolError}; /* @@ -8,6 +8,7 @@ use rust_mc_proto::{DataBufferReader, DataBufferWriter, MCConnTcp, MinecraftConn */ +#[derive(Clone)] struct MinecraftServer { server_ip: String, server_port: u16, @@ -28,19 +29,23 @@ impl MinecraftServer { fn start(self) { let addr = self.server_ip.clone() + ":" + &self.server_port.to_string(); let listener = TcpListener::bind(addr).unwrap(); - let server = Arc::new(Mutex::new(self)); + + let this = Arc::new(self); for stream in listener.incoming() { let stream = stream.unwrap(); - let local_server = server.clone(); - thread::spawn(move || { - Self::accept_client(MinecraftConnection::new(stream), local_server).unwrap(); + thread::spawn({ + let this = this.clone(); + + move || { + Self::accept_client(this, MinecraftConnection::new(stream)).unwrap(); + } }); } } - fn accept_client(mut conn: MCConnTcp, server: Arc>) -> Result<(), ProtocolError> { + fn accept_client(self: Arc, mut conn: MCConnTcp) -> Result<(), ProtocolError> { let mut handshake = false; loop { @@ -48,7 +53,7 @@ impl MinecraftServer { if handshake { if packet.id() == 0x00 { - let motd = server.lock().unwrap().motd.clone(); + let motd = self.motd.clone(); conn.write_packet(&Packet::build(0x00, |status| status.write_string(&motd) @@ -66,11 +71,13 @@ impl MinecraftServer { if next_state != 1 { break; } - println!("Client handshake info:"); - println!(" IP: {}", conn.get_ref().peer_addr().unwrap()); - println!(" Protocol version: {}", protocol_version); - println!(" Server address: {}", server_address); - println!(" Server port: {}", server_port); + println!( + "{} > protocol: {} server: {}:{}", + conn.get_ref().peer_addr().unwrap(), + protocol_version, + server_address, + server_port + ); handshake = true; } else { @@ -111,5 +118,6 @@ fn main() { \"favicon\": \"data:image/png;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=\" }" ); + server.start(); }