sermo/src/channels.rs
user0-07161 cecd44b170
All checks were successful
build / test-alpine (push) Successful in 49s
build / test-debian (push) Successful in 1m27s
chore: use UserUnwrapped in channels
2026-02-15 20:31:03 +01:00

83 lines
2.1 KiB
Rust

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<UserUnwrapped>,
}
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<TcpStream>,
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<TcpStream>,
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(())
}
}