use std::sync::Arc;
use tokio::sync::RwLock;
use crate::protocol::{Message, Reply};
use crate::state::ServerState;
pub async fn handle_whois(
server_state: Arc<RwLock<ServerState>>,
connection_id: u64,
params: Vec<String>,
) -> Result<Vec<Message>, Box<dyn std::error::Error>> {
let state = server_state.read().await;
let mut messages = Vec::new();
let requesting_connection = state.connections.get(&connection_id);
if requesting_connection.is_none() {
return Ok(messages);
}
let req_conn = requesting_connection.unwrap();
let requester_nick = req_conn.nickname.as_deref().unwrap_or("*");
for target_nick in ¶ms {
if let Some(target_id_ref) = state.nicknames.get(&target_nick.to_lowercase()) {
let target_id = *target_id_ref;
if let Some(target_conn) = state.connections.get(&target_id) {
messages.push(Message::from(Reply::WhoisUser {
nick: requester_nick.to_string(),
target: target_nick.clone(),
username: target_conn.username.as_deref().unwrap_or("*").to_string(),
host: target_conn.hostname.clone(),
realname: target_conn.realname.as_deref().unwrap_or("Unknown").to_string(),
}));
messages.push(Message::from(Reply::WhoisServer {
nick: requester_nick.to_string(),
target: target_nick.clone(),
server: state.server_name.clone(),
info: "IronChat IRC Server".to_string(),
}));
} else {
messages.push(Message::from(Reply::NoSuchNick {
nick: requester_nick.to_string(),
target: target_nick.clone(),
}));
}
} else {
messages.push(Message::from(Reply::NoSuchNick {
nick: requester_nick.to_string(),
target: target_nick.clone(),
}));
}
messages.push(Message::from(Reply::EndOfWhois {
nick: requester_nick.to_string(),
target: target_nick.clone(),
}));
}
Ok(messages)
}