tentacli 15.2.0

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::plugins::wow::wotlk::login;

#[derive(Packet, BinRead, Serialize, FieldsMetadata)]
#[br(little)]
pub struct Incoming {
    unknown: u8,
    code: u8,
}

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 mut outputs = vec![];
        let Incoming { code, .. } = Incoming::unpack(packet)?;

        if code != Codes::SUCCESS {
            let text = match code {
                Codes::FAILED_UNKNOWN0
                | Codes::FAILED_UNKNOWN1
                | Codes::FAILED_INVALID_SERVER
                | Codes::FAILED_FAIL_NOACCESS => "Unable to connect".to_string(),
                Codes::FAILED_BANNED => "Account was banned".to_string(),
                Codes::FAILED_SUSPENDED => "Account was temporary suspended".to_string(),
                Codes::FAILED_UNKNOWN_ACCOUNT | Codes::FAILED_INCORRECT_PASSWORD => {
                    "Credentials not valid".to_string()
                }
                Codes::FAILED_ALREADY_ONLINE => "Account already online".to_string(),
                Codes::FAILED_DB_BUSY => "Cannot login at this time, try again later".to_string(),
                _ => {
                    format!("Unknown error with code: \"{code}\"")
                }
            };

            outputs.extend([
                HandlerOutput::Messages(vec![Message {
                    msg_type: MsgType::Error,
                    text,
                }]),
                HandlerOutput::Requests(vec![Request::Drop(login::PLUGIN_LABEL)]),
            ])
        }

        Ok(outputs)
    }
}

#[non_exhaustive]
pub struct Codes;
#[allow(dead_code)]
impl Codes {
    pub const SUCCESS: u8 = 0x00;
    pub const FAILED_UNKNOWN0: u8 = 0x01;
    pub const FAILED_UNKNOWN1: u8 = 0x02;
    pub const FAILED_BANNED: u8 = 0x03;
    pub const FAILED_UNKNOWN_ACCOUNT: u8 = 0x04;
    pub const FAILED_INCORRECT_PASSWORD: u8 = 0x05;
    pub const FAILED_ALREADY_ONLINE: u8 = 0x06;
    pub const FAILED_NO_TIME: u8 = 0x07;
    pub const FAILED_DB_BUSY: u8 = 0x08;
    pub const FAILED_VERSION_INVALID: u8 = 0x09;
    pub const FAILED_VERSION_UPDATE: u8 = 0x0A;
    pub const FAILED_INVALID_SERVER: u8 = 0x0B;
    pub const FAILED_SUSPENDED: u8 = 0x0C;
    pub const FAILED_FAIL_NOACCESS: u8 = 0x0D;
    pub const SUCCESS_SURVEY: u8 = 0x0E;
    pub const FAILED_PARENTCONTROL: u8 = 0x0F;
    pub const FAILED_LOCKED_ENFORCED: u8 = 0x10;
    pub const FAILED_TRIAL_ENDED: u8 = 0x11;
    pub const FAILED_USE_BNET: u8 = 0x12;
}