bancho-packets

Bancho packet reading and writing utilities.

Test

cargo test

Benchmark

cargo bench

Reading from osu

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

// Data packets from osu! let data = vec![ 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 mut reader = PacketReader::new(data);

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

Results

bash OSU_PING: Non-payload BANCHO_NOTIFICATION: Some("Hello, World!💖") OSU_PING: Non-payload BANCHO_NOTIFICATION: Some("哈哈【😃】") BANCHO_ACCOUNT_RESTRICTED: Non-payload BANCHO_NOTIFICATION: Some("读取完了!!✨")

Writing to osu

```rust use bancho_packets::{LoginFailed, PacketBuilder, self};

// Single packet let data = banchopackets::loginreply(LoginFailed::InvalidCredentials); let data1 = bancho_packets::notification("hello");

// Multiple packets with Builder let data3 = PacketBuilder::new() .add(banchopackets::loginreply( banchopackets::LoginSuccess::Verified(1009), )) .add(banchopackets::protocolversion(19)) .add(banchopackets::notification("Welcome to Peace!")) .add(banchopackets::mainmenuicon( "https://xxx.png|https://example.com", )) .add(banchopackets::silenceend(0)) .add(banchopackets::channelinfoend()) .write_out();

```

Raw (Build your own packet)

```rust use banchopackets::{PacketId, build, data, outpacket, traits::writing::*};

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

// Complex pub fn userstats( userid: i32, action: u8, info: &str, beatmapmd5: &str, mods: u32, mode: u8, beatmapid: i32, rankedscore: i64, accuracy: f32, playcount: i32, totalscore: i64, rank: i32, pp: i16, ) -> Vec { build!( PacketId::BANCHOUSERSTATS, data!( { 60 }; // initial data size userid, action, info, beatmapmd5, mods, mode, beatmapid, rankedscore, accuracy / 100f32, playcount, total_score, rank, pp ) ) }

```