From 79f869c727f97626472c17c1c9079fcef60a2dbd Mon Sep 17 00:00:00 2001 From: Dastan-glitch Date: Tue, 28 Jun 2022 01:23:57 +0000 Subject: [PATCH] bin/ircd: add End of NAMES list --- bin/ircd/src/server.rs | 69 ++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/bin/ircd/src/server.rs b/bin/ircd/src/server.rs index 1e5d62e2c..36086b53e 100644 --- a/bin/ircd/src/server.rs +++ b/bin/ircd/src/server.rs @@ -18,6 +18,7 @@ use crate::{ const RPL_NOTOPIC: u32 = 331; const RPL_TOPIC: u32 = 332; const RPL_NAMEREPLY: u32 = 353; +const RPL_ENDOFNAMES: u32 = 366; pub struct IrcServerConnection { // server stream @@ -94,23 +95,7 @@ impl IrcServerConnection { continue } - if self.configured_chans.contains_key(chan) { - let chan_info = self.configured_chans.get(chan).unwrap(); - - if chan_info.names.is_empty() { - continue - } - - let names_reply = format!( - ":{}!anon@dark.fi {} = {} : {}\r\n", - self.nickname, - RPL_NAMEREPLY, - chan, - chan_info.names.join(" ") - ); - - self.reply(&names_reply).await?; - } + self.names(chan).await?; } } "NICK" => { @@ -255,6 +240,40 @@ impl IrcServerConnection { Ok(()) } + async fn names(&mut self, chan: &str) -> Result<()> { + if self.configured_chans.contains_key(chan) { + let chan_info = self.configured_chans.get(chan).unwrap(); + + if chan_info.names.is_empty() { + self.end_of_names(chan).await?; + return Ok(()) + } + let names_reply = format!( + ":{}!anon@dark.fi {} = {} : {}\r\n", + self.nickname, + RPL_NAMEREPLY, + chan, + chan_info.names.join(" ") + ); + + self.reply(&names_reply).await?; + + self.end_of_names(chan).await?; + } + + Ok(()) + } + + async fn end_of_names(&mut self, chan: &str) -> Result<()> { + let end_of_names = format!( + ":DarkFi {:03} {} {} :End of NAMES list\r\n", + RPL_ENDOFNAMES, self.nickname, chan + ); + + self.reply(&end_of_names).await?; + Ok(()) + } + async fn on_join(&mut self, chan: &str) -> Result<()> { if !self.configured_chans.contains_key(chan) { let mut chan_info = ChannelInfo::new()?; @@ -282,21 +301,7 @@ impl IrcServerConnection { } } - let chan_info = self.configured_chans.get_mut(chan).unwrap(); - - if chan_info.names.is_empty() { - return Ok(()) - } - - let names_reply = format!( - ":{}!anon@dark.fi {} = {} : {}\r\n", - self.nickname, - RPL_NAMEREPLY, - chan, - chan_info.names.join(" ") - ); - - self.reply(&names_reply).await?; + self.names(chan).await?; Ok(()) }