chore: use UserUnwrapped in channels
All checks were successful
build / test-alpine (push) Successful in 49s
build / test-debian (push) Successful in 1m27s

This commit is contained in:
user0-07161 2026-02-15 20:31:03 +01:00
parent d32ec1d13c
commit cecd44b170
4 changed files with 23 additions and 18 deletions

View file

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

View file

@ -18,6 +18,7 @@ impl ClientHandler for Join {
) -> Vec<super::ClientAction> { ) -> Vec<super::ClientAction> {
let mut joined_channels = JOINED_CHANNELS.lock().await; let mut joined_channels = JOINED_CHANNELS.lock().await;
let mut channels = Vec::new(); let mut channels = Vec::new();
let user_unwrapped = user_state.clone().unwrap_all();
for channel in arguments[0].clone().split(',') { for channel in arguments[0].clone().split(',') {
let mut maybe_existing_channel: Option<Channel> = None; let mut maybe_existing_channel: Option<Channel> = None;
@ -37,14 +38,14 @@ impl ClientHandler for Join {
} }
if let Some(mut new_channel) = maybe_existing_channel.clone() { if let Some(mut new_channel) = maybe_existing_channel.clone() {
new_channel.joined_users.insert(user_state.clone()); new_channel.joined_users.insert(user_unwrapped.clone());
joined_channels.remove(&maybe_existing_channel.clone().unwrap()); joined_channels.remove(&maybe_existing_channel.clone().unwrap());
joined_channels.insert(new_channel.clone()); joined_channels.insert(new_channel.clone());
channels.push(new_channel.clone()); channels.push(new_channel.clone());
} else { } else {
let new_channel = Channel::new_channel(channel.into(), user_state.clone()); let new_channel = Channel::new_channel(channel.into(), user_unwrapped.clone());
joined_channels.insert(new_channel.clone()); joined_channels.insert(new_channel.clone());

View file

@ -147,7 +147,7 @@ impl Client {
for channel in joined_channels.clone() { for channel in joined_channels.clone() {
if let MsgReceiver::ChannelName(channelname) = message.clone().receiver if let MsgReceiver::ChannelName(channelname) = message.clone().receiver
&& channelname == channel.name && channelname == channel.name
&& channel.joined_users.contains(user_wrapped) && channel.joined_users.contains(&user)
{ {
channel_name = Some(channel.name.clone()); channel_name = Some(channel.name.clone());
} }
@ -194,7 +194,7 @@ impl Client {
} }
Message::ChanJoinMessage(message) => { Message::ChanJoinMessage(message) => {
if message.channel.joined_users.contains(user_wrapped) || message.sender == user { if message.channel.joined_users.contains(&user) || message.sender == user {
let channel = message.channel.clone(); let channel = message.channel.clone();
IrcResponse { IrcResponse {
@ -208,12 +208,12 @@ impl Client {
.await?; .await?;
channel channel
.send_topic(user_wrapped.clone(), writer, hostname) .send_topic(user.clone(), writer, hostname)
.await .await
.unwrap(); .unwrap();
channel channel
.names_list_send(user_wrapped.clone(), &channel, writer, hostname) .names_list_send(user.clone(), &channel, writer, hostname)
.await .await
.unwrap(); .unwrap();
} }

View file

@ -21,7 +21,7 @@ pub struct User {
// pub hostname: Option<String>, // pub hostname: Option<String>,
} }
#[derive(Clone, Debug, Eq, PartialEq, Hash)] #[derive(Clone, Debug, Eq, PartialEq, Hash, PartialOrd, Ord)]
pub struct UserUnwrapped { pub struct UserUnwrapped {
pub nickname: String, pub nickname: String,
pub username: String, pub username: String,