use lavina_core::{ player::{GetInfoResult, PlayerId}, prelude::Str, }; use proto_irc::{ client::command_args::Whois, commands::whois::{ error::{ErrNoNicknameGiven431, ErrNoSuchNick401}, response::RplEndOfWhois318, }, response::{IrcResponseMessage, WriteResponse}, }; use tokio::io::AsyncWrite; use crate::handler::{Handler, IrcConnection}; impl Handler for Whois { async fn handle(&self, body: IrcConnection<'_, T>) -> anyhow::Result<()> { match self { Whois::Nick(nick) => handle_nick_target(nick.clone(), body).await?, Whois::TargetNick(_, nick) => handle_nick_target(nick.clone(), body).await?, Whois::EmptyArgs => { let IrcConnection { server_name, mut writer, .. } = body; IrcResponseMessage::empty_tags( Some(server_name.clone()), ErrNoNicknameGiven431::new(server_name.clone()), ) .write_response(&mut writer) .await? } } Ok(()) } } async fn handle_nick_target(nick: Str, body: IrcConnection<'_, impl AsyncWrite + Unpin>) -> anyhow::Result<()> { let IrcConnection { server_name, mut writer, client, player_connection, } = body; if let GetInfoResult::UserDoesntExist = player_connection.check_user_existence(PlayerId::from(nick.clone())?).await? { IrcResponseMessage::empty_tags( Some(server_name.clone()), ErrNoSuchNick401::new(client.clone(), nick.clone()), ) .write_response(&mut writer) .await? } IrcResponseMessage::empty_tags( Some(server_name.clone()), RplEndOfWhois318::new(client.clone(), nick.clone()), ) .write_response(&mut writer) .await?; Ok(()) }