forked from lavina/lavina
68 lines
1.9 KiB
Rust
68 lines
1.9 KiB
Rust
|
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<T: AsyncWrite + Unpin> Handler<T> 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(())
|
||
|
}
|