tentacli 15.2.1

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

use crate::client::prelude::*;
use crate::plugins::wow::wotlk::realm::object::types::packed_guid::PackedGuid;

#[derive(Packet, BinRead, Serialize, FieldsMetadata)]
#[br(little)]
struct Incoming {
    target_guid: PackedGuid,
    #[br(parse_with = binrw::helpers::until_eof)]
    aura_info: Vec<AuraInfo>,
}

#[derive(BinRead, Serialize, Default, Clone, PartialEq, FieldsMetadata)]
struct AuraInfo {
    aura_slot: u8,
    aura_id: u32,
    aura_flags: AuraFlags,
    aura_level: u8,
    #[br(if(!aura_flags.contains(AuraFlags::NOT_CASTER)))]
    caster_guid: PackedGuid,
    #[br(if(aura_flags.contains(AuraFlags::DURATION)))]
    aura_max_duration: u32,
    #[br(if(aura_flags.contains(AuraFlags::DURATION)))]
    aura_duration: u32,
}

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![])
    }
}

bitflags! {
    #[derive(Copy, Clone, Debug, PartialEq, Default, BitflagExtras)]
    #[bitflags_repr(u8)]
    pub struct AuraFlags: u8 {
        const NONE = 0x00;
        const EFF_INDEX_0 = 0x01;
        const EFF_INDEX_1 = 0x02;
        const EFF_INDEX_2 = 0x04;
        const NOT_CASTER = 0x08;
        const POSITIVE = 0x10;
        const DURATION = 0x20;
        const UNK2 = 0x40;
        const NEGATIVE = 0x80;
    }
}