tentacli 15.2.0

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

mod check_proof_error;
pub mod login_challenge;
pub mod login_proof;
mod request_realmlist;
pub mod select_realm;
pub mod validate_proof;

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

#[derive(Default)]
pub struct AuthProcessor {
    srp: Arc<Mutex<Srp>>,
}

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

        Ok(match opcode {
            Opcode::LOGIN_CHALLENGE => vec![
                Box::new(check_proof_error::Handler),
                Box::new(login_proof::Handler {
                    srp: self.srp.clone(),
                }),
            ],
            Opcode::LOGIN_PROOF => vec![
                Box::new(validate_proof::Handler {
                    srp: self.srp.clone(),
                }),
                Box::new(request_realmlist::Handler),
            ],
            Opcode::REALM_LIST => vec![Box::new(select_realm::Handler)],
            _ => vec![],
        })
    }
}