osu! bancho packet Reading & Writing library.
docs https://docs.rs/bancho-packets
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
see more: examples, src/tests.rs
Reading packets
```rust use bancho_packets::{PacketReader, PayloadReader};
// 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 mut reader = PacketReader::new(data);
// Read packets
while let Some(packet) = reader.next() {
print!("packet id: {:?}: ", packet.id);
match packet.payload {
Some(payload) => {
// Read payload
let mut payloadreader = PayloadReader::new(payload);
println!("payload: {:?}", payloadreader.read::
/* 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(LoginResult::Failed( LoginFailedResaon::InvalidCredentials, )); let serverside_notification = server::notification("hello");
// Multiple packets with Builder let packets = PacketBuilder::new() .add(server::loginreply(LoginResult::Success(1000))) .add(server::protocolversion(19)) .add(server::notification("Welcome to osu!")) .add(server::mainmenuicon("https://image.png", "https://url.link")) .add(server::silenceend(0)) .add(server::channelinfo_end()) .build();
```
Build your own packet
```rust use bancho_packets::*;
// Build simple packet let numberdata: i32 = 1; let packet = packet!(PacketId::BANCHOMATCHPLAYERSKIPPED, number_data)
// Complex
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
```
cargo test
cargo bench