use std::sync::Arc;
use tokio::sync::RwLock;
use crate::protocol::{Message, Reply};
use crate::state::ServerState;
pub async fn handle_query(
server_state: Arc<RwLock<ServerState>>,
connection_id: u64,
target: String,
) -> Result<Vec<Message>, Box<dyn std::error::Error>> {
let mut responses = Vec::new();
let connection_info = {
let state = server_state.read().await;
state.connections.get(&connection_id).map(|conn| {
(conn.nickname.clone().unwrap_or_else(|| "*".to_string()))
})
};
let nick = match connection_info {
Some(nick) => nick,
None => return Ok(responses),
};
let target_exists = {
let state = server_state.read().await;
state.nicknames.contains_key(&target.to_lowercase())
};
if target_exists {
responses.push(Message::new("NOTICE")
.with_params(vec![nick.clone(), format!("Query window opened for {}", target)])
.with_prefix("*.Query".to_string()));
} else {
responses.push(Reply::NoSuchNick {
nick: nick.clone(),
target: target
}.to_message("*"));
}
Ok(responses)
}