use std::collections::BTreeSet; use tokio::{io::BufWriter, net::TcpStream}; use crate::{ error_structs::SenderError, sender::IrcResponseCodes, user::{User, UserUnwrapped}, }; #[derive(Clone, Debug, Hash, Eq, PartialEq)] pub struct Channel { pub name: String, pub joined_users: BTreeSet, } impl Channel { pub fn add_user(&mut self, user: UserUnwrapped) { self.joined_users.insert(user); } pub fn new_channel(name: String, user: UserUnwrapped) -> Self { Channel { name, joined_users: BTreeSet::from([user]), } } pub async fn names_list_send( &self, user: UserUnwrapped, channel: &Channel, writer: &mut BufWriter, hostname: &str, ) -> Result<(), SenderError> { let mut members = Vec::new(); for member in self.clone().joined_users { members.push(member.nickname); } for member in channel.joined_users.clone() { members.push(member.nickname); } members.sort(); members.dedup(); IrcResponseCodes::NameReply .into_irc_response( user.nickname.clone(), format!("= {} :{}", self.name.clone(), members.join(" ")), ) .send(hostname, writer, false) .await?; IrcResponseCodes::EndOfNames .into_irc_response( user.nickname.clone(), format!("{} :End of /NAMES list", self.name.clone()), ) .send(hostname, writer, false) .await?; Ok(()) } pub async fn send_topic( &self, user: UserUnwrapped, writer: &mut BufWriter, hostname: &str, ) -> Result<(), SenderError> { IrcResponseCodes::NoTopic .into_irc_response( user.nickname.clone(), format!("{} :No topic is set", self.name.clone()), ) .send(hostname, writer, false) .await?; Ok(()) } }