bancho-packets

osu! bancho packet Reading & Writing library.

docs https://docs.rs/bancho-packets

Usage

Add to your cargo.toml toml [dependencies] bancho-packets = "4"

Or run the following Cargo command in your project directory: bash cargo add bancho-packets

Examples

see more: examples, src/tests.rs

Reading packets

```rust use bancho_packets::*;

// Packets from osu! bancho let data = &[ 4, 0, 0, 0, 0, 0, 0, 24, 0, 0, 19, 0, 0, 0, 11, 17, 72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33, 240, 159, 146, 150, 4, 0, 0, 0, 0, 0, 0, 24, 0, 0, 18, 0, 0, 0, 11, 16, 229, 147, 136, 229, 147, 136, 227, 128, 144, 240, 159, 152, 131, 227, 128, 145, 104, 0, 0, 0, 0, 0, 0, 24, 0, 0, 23, 0, 0, 0, 11, 21, 232, 175, 187, 229, 143, 150, 229, 174, 140, 228, 186, 134, 239, 188, 129, 239, 188, 129, 226, 156, 168, ];

// Create reader let reader = PacketReader::new(data);

// Read packets for packet in reader { print!("{:?}: ", packet.id); match packet.payload { Some(payload) => { // Read payload let mut payloadreader = PayloadReader::new(payload); println!("{:?}", payloadreader.read::()); }, None => println!("Non-payload"), } }

/* Results packet id: OSUPING: Non-payload packet id: BANCHONOTIFICATION: payload: Some("Hello, World!💖") packet id: OSUPING: Non-payload packet id: BANCHONOTIFICATION: payload: Some("哈哈【😃】") packet id: BANCHOACCOUNTRESTRICTED: Non-payload packet id: BANCHO_NOTIFICATION: payload: Some("读取完了!!✨") */ ```

Writing packets

```rust use bancho_packets::*;

// Single packet let loginreplyfromserver = server::LoginReply::pack(LoginResult::Failed( LoginFailedReason::InvalidCredentials, )); let serversidenotification = server::Notification::pack("hello".into());

// Multiple packets with Builder let packets = PacketBuilder::new() .add(server::LoginReply::pack(LoginResult::Success(1000))) .add(server::ProtocolVersion::pack(19)) .add(server::Notification::pack("Welcome to osu!".into())) .add(server::MainMenuIcon::pack( "https://image.png".into(), "https://url.link".into(), )) .add(server::SilenceEnd::pack(0)) .add(server::ChannelInfoEnd::pack()) .build();

```

Build your own packet

```rust use bancho_packets::*;

// Build simple packet let numberdata: i32 = 1; let packet = packet!(PacketId::BANCHOMATCHPLAYERSKIPPED, number_data)

// Complex (old) pub fn userstats( userid: i32, action: u8, info: String, beatmapmd5: String, mods: u32, mode: u8, beatmapid: i32, rankedscore: i64, accuracy: f32, playcount: i32, totalscore: i64, rank: i32, pp: i16, ) -> Vec { packet!( PacketId::BANCHOUSERSTATS, data!( userid, action, info, beatmapmd5, mods, mode, beatmapid, rankedscore, accuracy / 100f32, playcount, total_score, rank, pp ) ) }

// Complex (new) packetstruct!( PacketId::BANCHOSPECTATORJOINED, /// #13: BANCHOSPECTATORJOINED SpectatorJoined { userid: i32 } );

// Complex (new) packetstruct!( PacketId::BANCHOUSERSTATS, /// #11: BANCHOUSERSTATS UserStats<'a> { userid: i32, onlinestatus: u8, description: CowStr<'a>, beatmapmd5: CowStr<'a>, mods: u32, mode: u8, beatmapid: i32, rankedscore: i64, accuracy: f32, playcount: i32, totalscore: i64, rank: i32, pp: i16, }, fn intopacketdata(self) -> Vec { packet!( Self::ID, self.userid, self.onlinestatus, self.description, self.beatmapmd5, self.mods, self.mode, self.beatmapid, self.rankedscore, self.accuracy / 100f32, self.playcount, self.total_score, self.rank, self.pp ) } );

```

Available attributies

example

```rust use bancho_packets::{ReadPacket, PacketReader, PayloadReader};

[derive(Debug, Clone, ReadPacket)]

/// [BanchoMessage] is the message structure of the bancho client. pub struct BanchoMessage { pub sender: String, pub content: String, pub target: String, pub sender_id: i32, }

// Now we can use [PayloadReader] to read the [BanchoMessage] from bytes. let mut reader = PacketReader::new(&[ 1, 0, 0, 20, 0, 0, 0, 11, 0, 11, 6, 228, 189, 160, 229, 165, 189, 11, 4, 35, 111, 115, 117, 0, 0, 0, 0, ]); let packet = reader.next().unwrap();

let mut payloadreader = PayloadReader::new(packet.payload.unwrap()); let message = payloadreader.read::();

println!("{:?}: {:?}", packet.id, message); ```

Run Test

cargo test

Run Benchmark

cargo bench