cubic_protocol_server/
handler.rs

1use 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}