diff options
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/event.rs | 2 | ||||
| -rw-r--r-- | src/client/handler.rs | 39 | ||||
| -rw-r--r-- | src/client/mod.rs | 21 | ||||
| -rw-r--r-- | src/client/state.rs | 20 |
4 files changed, 18 insertions, 64 deletions
diff --git a/src/client/event.rs b/src/client/event.rs index d34908d..26e3f86 100644 --- a/src/client/event.rs +++ b/src/client/event.rs @@ -14,7 +14,7 @@ pub enum Event { }, /// We joined a channel - Joined { channel: String }, + Joined { channel: String, nick: String }, /// We or someone else left a channel Parted { diff --git a/src/client/handler.rs b/src/client/handler.rs index 91aa5ea..6b61fed 100644 --- a/src/client/handler.rs +++ b/src/client/handler.rs @@ -61,8 +61,7 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< }) .collect(); - let ch = state.channel_mut(channel); - ch.members.extend(members.clone()); + state.channel.members.extend(members.clone()); events.push(Event::Names { channel: channel.clone(), @@ -74,7 +73,7 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< // --- 332: topic on join --- Command::Numeric(332) => { if let (Some(channel), Some(topic)) = (msg.params.get(1), msg.params.get(2)) { - state.channel_mut(channel).topic = Some(topic.clone()); + state.channel.topic = Some(topic.clone()); events.push(Event::Topic { channel: channel.clone(), topic: topic.clone(), @@ -86,15 +85,12 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< Command::Join => { let nick = nick_from_prefix(&msg.prefix); if let Some(channel) = msg.params.first() { - if nick == state.nick { - // We joined - state.channel_mut(channel); - events.push(Event::Joined { - channel: channel.clone(), - }); - } else { - // Someone else joined - state.channel_mut(channel).members.insert(nick); + events.push(Event::Joined { + channel: channel.clone(), + nick: nick.clone(), + }); + if nick != state.nick { + state.channel.members.insert(nick); } } } @@ -105,10 +101,8 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< let channel = msg.params.first().cloned().unwrap_or_default(); let reason = msg.params.get(1).cloned(); - if nick == state.nick { - state.remove_channel(&channel); - } else { - state.channel_mut(&channel).members.remove(&nick); + if nick != state.nick { + state.channel.members.remove(&nick); } events.push(Event::Parted { @@ -123,10 +117,7 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< let nick = nick_from_prefix(&msg.prefix); let reason = msg.params.first().cloned(); - // Remove them from all channels - for ch in state.channels.values_mut() { - ch.members.remove(&nick); - } + state.channel.members.remove(&nick); events.push(Event::Quit { nick, reason }); } @@ -141,10 +132,8 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< } // Update in all channels - for ch in state.channels.values_mut() { - if ch.members.remove(&old_nick) { - ch.members.insert(new_nick.clone()); - } + if state.channel.members.remove(&old_nick) { + state.channel.members.insert(new_nick.clone()); } events.push(Event::NickChanged { old_nick, new_nick }); @@ -168,7 +157,7 @@ pub fn handle(msg: IrcMessage, state: &mut ClientState, sender: &Sender) -> Vec< // --- TOPIC (live change) --- Command::Topic => { if let (Some(channel), Some(topic)) = (msg.params.first(), msg.params.get(1)) { - state.channel_mut(channel).topic = Some(topic.clone()); + state.channel.topic = Some(topic.clone()); events.push(Event::Topic { channel: channel.clone(), topic: topic.clone(), diff --git a/src/client/mod.rs b/src/client/mod.rs index 6d32017..f02f8e5 100644 --- a/src/client/mod.rs +++ b/src/client/mod.rs @@ -1,5 +1,4 @@ use tokio::sync::mpsc; -use tracing::info; use crate::client::event::Event; use crate::client::handler::handle; @@ -23,8 +22,6 @@ pub struct Config { pub realname: String, /// Optional server password pub password: Option<String>, - /// Channels to auto-join after registration - pub autojoin: Vec<String>, } /// The main IRC client. @@ -100,16 +97,6 @@ impl Client { let msg = self.inbox.recv().await?; let events = handle(msg, &mut self.state, &self.sender); - // Handle auto-join after registration - for event in &events { - if let Event::Connected { .. } = event { - for channel in &self.config.autojoin.clone() { - info!("Auto-joining {}", channel); - self.join(channel); - } - } - } - // Return the first event; re-queue the rest // (simple approach: process one at a time via recursive buffering) if let Some(first) = events.into_iter().next() { @@ -160,14 +147,6 @@ impl Client { let msg = self.inbox.try_recv().ok()?; let mut events = handle(msg, &mut self.state, &self.sender); - for event in &events { - if let Event::Connected { .. } = event { - for channel in &self.config.autojoin.clone() { - self.join(channel); - } - } - } - if !events.is_empty() { return Some(events.remove(0)); } diff --git a/src/client/state.rs b/src/client/state.rs index b987509..6945d4e 100644 --- a/src/client/state.rs +++ b/src/client/state.rs @@ -1,10 +1,10 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::HashSet; /// The full state of a connected IRC client. #[derive(Debug, Default)] pub struct ClientState { pub nick: String, - pub channels: HashMap<String, Channel>, + pub channel: Channel, pub caps: HashSet<String>, pub server_name: Option<String>, pub reg: RegistrationState, @@ -17,20 +17,6 @@ impl ClientState { ..Default::default() } } - - pub fn channel(&self, name: &str) -> Option<&Channel> { - self.channels.get(&name.to_lowercase()) - } - - pub fn channel_mut(&mut self, name: &str) -> &mut Channel { - self.channels - .entry(name.to_lowercase()) - .or_insert_with(|| Channel::new(name)) - } - - pub fn remove_channel(&mut self, name: &str) { - self.channels.remove(&name.to_lowercase()); - } } /// State of the registration handshake. @@ -44,7 +30,7 @@ pub enum RegistrationState { } /// A joined channel and its current state. -#[derive(Debug)] +#[derive(Debug, Default)] pub struct Channel { pub name: String, pub members: HashSet<String>, |
