AcheronSR/gameserver/src/net/session.rs
2024-03-29 09:46:31 +03:00

40 lines
1,001 B
Rust

use anyhow::Result;
use prost::Message;
use tokio::{io::AsyncWriteExt, net::TcpStream};
use super::{packet::CommandHandler, NetPacket};
pub struct PlayerSession {
pub(crate) client_socket: TcpStream,
}
impl PlayerSession {
pub const fn new(client_socket: TcpStream) -> Self {
Self { client_socket }
}
pub async fn run(&mut self) -> Result<()> {
loop {
let net_packet = NetPacket::read(&mut self.client_socket).await?;
Self::on_message(self, net_packet.cmd_type, net_packet.body).await?;
}
}
pub async fn send(&mut self, cmd_type: u16, body: impl Message) -> Result<()> {
let mut buf = Vec::new();
body.encode(&mut buf)?;
let payload: Vec<u8> = NetPacket {
cmd_type,
head: Vec::new(),
body: buf,
}
.into();
self.client_socket.write_all(&payload).await?;
Ok(())
}
}
// Auto implemented
impl CommandHandler for PlayerSession {}