use std::net::SocketAddr;
use super::RakPacket;
use crate::register_packets;
use binary_util::interfaces::{Reader, Writer};
use binary_util::io::{ByteReader, ByteWriter};
use binary_util::BinaryIo;
#[derive(BinaryIo, Clone, Debug)]
#[repr(u8)]
pub enum OnlinePacket {
ConnectedPing(ConnectedPing) = 0x00,
ConnectedPong(ConnectedPong) = 0x03,
LostConnection(LostConnection) = 0x04,
ConnectionRequest(ConnectionRequest) = 0x09,
ConnectionAccept(ConnectionAccept) = 0x10,
NewConnection(NewConnection) = 0x13,
Disconnect(Disconnect) = 0x15,
}
register_packets! {
Online is OnlinePacket,
ConnectedPing,
ConnectedPong,
LostConnection,
ConnectionRequest,
ConnectionAccept,
NewConnection,
Disconnect
}
#[derive(Clone, Debug, BinaryIo)]
pub struct ConnectedPing {
pub time: i64,
}
#[derive(Clone, Debug, BinaryIo)]
pub struct ConnectedPong {
pub ping_time: i64,
pub pong_time: i64,
}
#[derive(Clone, Debug, BinaryIo)]
pub struct ConnectionRequest {
pub client_id: i64,
pub time: i64,
pub security: bool,
}
#[derive(Clone, Debug)]
pub struct ConnectionAccept {
pub client_address: SocketAddr,
pub system_index: i16,
pub internal_ids: Vec<SocketAddr>,
pub request_time: i64,
pub timestamp: i64,
}
impl Reader<ConnectionAccept> for ConnectionAccept {
fn read(buf: &mut ByteReader) -> std::io::Result<Self> {
let client_address = buf.read_type::<SocketAddr>()?;
let system_index = buf.read_i16()?;
let mut internal_ids = Vec::<SocketAddr>::new();
for _ in 0..20 {
if buf.as_slice().len() <= 16 {
break;
}
internal_ids.push(buf.read_type::<SocketAddr>()?);
}
let request_time = buf.read_i64()?;
let timestamp = buf.read_i64()?;
Ok(Self {
client_address,
system_index,
internal_ids,
request_time,
timestamp,
})
}
}
impl Writer for ConnectionAccept {
fn write(&self, buf: &mut ByteWriter) -> std::io::Result<()> {
buf.write_type::<SocketAddr>(&self.client_address)?;
buf.write_i16(self.system_index)?;
if self.internal_ids.len() > 20 {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"Too many internal id's",
));
}
for internal_id in &self.internal_ids {
buf.write_type::<SocketAddr>(internal_id)?;
}
buf.write_i64(self.request_time)?;
buf.write_i64(self.timestamp)?;
Ok(())
}
}
#[derive(Clone, Debug)]
pub struct NewConnection {
pub server_address: SocketAddr,
pub system_address: Vec<SocketAddr>,
pub request_time: i64,
pub timestamp: i64,
}
impl Reader<NewConnection> for NewConnection {
fn read(buf: &mut ByteReader) -> std::io::Result<Self> {
let server_address = buf.read_type::<SocketAddr>()?;
let mut system_address = Vec::<SocketAddr>::new();
for _ in 0..20 {
if buf.as_slice().len() < 16 {
break;
}
system_address.push(buf.read_type::<SocketAddr>()?);
}
let request_time = buf.read_i64()?;
let timestamp = buf.read_i64()?;
Ok(Self {
server_address,
system_address,
request_time,
timestamp,
})
}
}
impl Writer for NewConnection {
fn write(&self, buf: &mut ByteWriter) -> std::io::Result<()> {
buf.write_type::<SocketAddr>(&self.server_address)?;
if self.system_address.len() > 20 {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidInput,
"Too many internal id's",
));
}
for system_address in &self.system_address {
buf.write_type::<SocketAddr>(system_address)?;
}
buf.write_i64(self.request_time)?;
buf.write_i64(self.timestamp)?;
Ok(())
}
}
#[derive(Clone, Debug, BinaryIo)]
pub struct Disconnect {}
#[derive(Clone, Debug, BinaryIo)]
pub struct LostConnection {}