cubic_protocol_server/
handler.rs1use std::marker::PhantomData;
2use std::sync::Arc;
3use cubic_protocol::packet::{InputPacketBytes, PacketReadable, PacketReadableResult, PacketState};
4use crate::connection::Connection;
5
6pub trait ConnectionHandler: Sized + Sync + Send {
7 fn handle_connection(&self, connection: Arc<Connection>);
8
9 fn handle_disconnect(&self, connection: Arc<Connection>);
10}
11
12pub trait PacketHandler<P: PacketReadable + Send + Sync>: Sized + Sync + Send {
13 fn handle_packet(&self, connection: Arc<Connection>, state: &mut PacketState, packet: P);
14}
15
16#[async_trait::async_trait]
17pub trait ReadHandler: Sized + Sync + Send {
18 async fn handle(&self, connection: Arc<Connection>, state: &mut PacketState, input: &mut impl InputPacketBytes) -> PacketReadableResult<()>;
19}
20
21pub struct ContainerReadHandler<
22 H: PacketReadable + Send + Sync,
23 S: PacketReadable + Send + Sync,
24 L: PacketReadable + Send + Sync,
25 P: PacketReadable + Send + Sync,
26 HH: PacketHandler<H>, SH: PacketHandler<S>,
27 LH: PacketHandler<L>, PH: PacketHandler<P>,
28> {
29 handshake: HH,
30 status: SH,
31 login: LH,
32 play: PH,
33 hp: PhantomData<H>,
34 sp: PhantomData<S>,
35 lp: PhantomData<L>,
36 pp: PhantomData<P>,
37}
38
39impl<
40 H: PacketReadable + Send + Sync,
41 S: PacketReadable + Send + Sync,
42 L: PacketReadable + Send + Sync,
43 P: PacketReadable + Send + Sync,
44 HH: PacketHandler<H>, SH: PacketHandler<S>,
45 LH: PacketHandler<L>, PH: PacketHandler<P>,
46> ContainerReadHandler<H, S, L, P, HH, SH, LH, PH> {
47 pub fn new(handshake: HH, status: SH, login: LH, play: PH) -> Self {
48 Self {
49 handshake,
50 status,
51 login,
52 play,
53 hp: PhantomData,
54 sp: PhantomData,
55 lp: PhantomData,
56 pp: PhantomData,
57 }
58 }
59}
60
61#[async_trait::async_trait]
62impl<
63 H: PacketReadable + Send + Sync,
64 S: PacketReadable + Send + Sync,
65 L: PacketReadable + Send + Sync,
66 P: PacketReadable + Send + Sync,
67 HH: PacketHandler<H>, SH: PacketHandler<S>,
68 LH: PacketHandler<L>, PH: PacketHandler<P>,
69> ReadHandler for ContainerReadHandler<H, S, L, P, HH, SH, LH, PH> {
70 async fn handle(&self, connection: Arc<Connection>, state: &mut PacketState, input: &mut impl InputPacketBytes) -> PacketReadableResult<()> {
71 log::debug!("Received packet for state: {:?}", state);
72 Ok(match state {
73 PacketState::Handshake =>
74 self.handshake.handle_packet(connection, state, H::read(input).await?),
75 PacketState::Status =>
76 self.status.handle_packet(connection, state, S::read(input).await?),
77 PacketState::Login =>
78 self.login.handle_packet(connection, state, L::read(input).await?),
79 PacketState::Play =>
80 self.play.handle_packet(connection, state, P::read(input).await?),
81 })
82 }
83}