aboutsummaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/event.rs2
-rw-r--r--src/client/handler.rs39
-rw-r--r--src/client/mod.rs21
-rw-r--r--src/client/state.rs20
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>,