tentacli 15.2.2

Framework for building extensible network protocol clients via modular plugins.
use std::sync::{Arc, Mutex};

mod account_data_times;
mod addon_info;
mod auth_challenge;
mod init_world_states;
mod join_channels;
mod motd;
mod player_login;
mod request_characters;
mod select_character;
mod set_time_speed;
mod set_weather;
mod verify_world;

use crate::client::prelude::*;
use crate::plugins::wow::wotlk::opcodes::Opcode;

#[derive(Default)]
pub struct InitProcessor {
    guid: Arc<Mutex<u64>>,
    is_logged_in: Arc<Mutex<bool>>,
}

impl Processor for InitProcessor {
    fn get_handlers(
        &mut self,
        opcode: &PacketOpcode,
        _: &CtxMap,
    ) -> anyhow::Result<Vec<Box<dyn PacketHandler>>> {
        let opcode: u16 = opcode.try_into()?;

        Ok(match opcode {
            Opcode::SMSG_AUTH_CHALLENGE => vec![Box::new(auth_challenge::Handler)],
            Opcode::SMSG_AUTH_RESPONSE => vec![
                Box::new(account_data_times::Handler),
                Box::new(request_characters::Handler {
                    guid: self.guid.clone(),
                    is_logged_in: self.is_logged_in.clone(),
                }),
            ],
            Opcode::SMSG_LOGIN_VERIFY_WORLD => vec![
                Box::new(verify_world::Handler),
                Box::new(join_channels::Handler),
            ],
            Opcode::SMSG_MOTD => vec![Box::new(motd::Handler)],
            Opcode::SMSG_LOGIN_SETTIMESPEED => vec![Box::new(set_time_speed::Handler)],
            Opcode::SMSG_WEATHER => vec![Box::new(set_weather::Handler)],
            Opcode::SMSG_INIT_WORLD_STATES => vec![Box::new(init_world_states::Handler)],
            Opcode::SMSG_CHAR_ENUM => vec![
                Box::new(select_character::Handler {
                    guid: self.guid.clone(),
                }),
                Box::new(player_login::Handler {
                    guid: self.guid.clone(),
                    is_logged_in: self.is_logged_in.clone(),
                }),
            ],
            Opcode::SMSG_ADDON_INFO => vec![Box::new(addon_info::Handler)],
            _ => vec![],
        })
    }
}