tentacli 15.2.3

Framework for building extensible network protocol clients via modular plugins.
use async_trait::async_trait;
use binrw::BinRead;
use serde::Serialize;
use std::sync::Arc;
use tokio::sync::RwLock;

use crate::client::prelude::*;
use crate::enum_field;

#[derive(Packet, BinRead, Serialize, FieldsMetadata)]
#[br(little)]
struct Incoming {
    message_type: MessageType,
    language: u32,
    sender_guid: u64,
    skip: u32,
    #[br(if(message_type == MessageType::Channel))]
    channel_name: NullTerminated<String>,
    target_guid: u64,
    message_length: u32,
    message: NullTerminated<String>,
}

pub struct Handler;
#[async_trait]
impl PacketHandler for Handler {
    async fn handle(
        &mut self,
        packet: &mut Packet,
        _: Arc<RwLock<CtxMap>>,
    ) -> anyhow::Result<Vec<HandlerOutput>> {
        let _ = Incoming::unpack(packet)?;
        Ok(vec![])
    }
}

enum_field! {
    pub enum MessageType: u8 {
        System            = 0x00,
        Say               = 0x01,
        Party             = 0x02,
        Raid              = 0x03,
        Guild             = 0x04,
        Officer           = 0x05,
        Yell              = 0x06,
        Whisper           = 0x07,
        WhisperForeign    = 0x08,
        WhisperInform     = 0x09,
        Emote             = 0x0A,
        TextEmote         = 0x0B,
        MonsterSay        = 0x0C,
        MonsterParty      = 0x0D,
        MonsterYell       = 0x0E,
        MonsterWhisper    = 0x0F,
        MonsterEmote      = 0x10,
        Channel           = 0x11,
        ChannelJoin       = 0x12,
        ChannelLeave      = 0x13,
        ChannelList       = 0x14,
        ChannelNotice     = 0x15,
        ChannelNoticeUser = 0x16,
        Afk               = 0x17,
        Dnd               = 0x18,
        Ignored           = 0x19,
        Skill             = 0x1A,
        Loot              = 0x1B,
        Money             = 0x1C,
        Opening           = 0x1D
    }
}