🏡 index : ~doyle/titanirc.git

author Jordan Doyle <jordan@doyle.la> 2024-01-31 2:03:03.0 +00:00:00
committer Jordan Doyle <jordan@doyle.la> 2024-01-31 2:03:03.0 +00:00:00
commit
21ea94dd3e13c65736693e385a20b764579b86af [patch]
tree
8d846d6f872fc7c22dff22186737f3966a02e656
parent
ac26f0571c218739178721f6091074b2bc34f709
download
21ea94dd3e13c65736693e385a20b764579b86af.tar.gz

Extend WHOIS info



Diff

 src/connection.rs      | 19 ++++++++++++++++++-
 src/server/response.rs | 44 +++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/src/connection.rs b/src/connection.rs
index e5c4c7d..c8cf981 100644
--- a/src/connection.rs
+++ b/src/connection.rs
@@ -4,6 +4,7 @@ mod authenticate;
pub mod sasl;

use std::{
    fmt::{Display, Formatter},
    io::{Error, ErrorKind},
    net::SocketAddr,
    str::FromStr,
@@ -98,7 +99,7 @@ impl TryFrom<ConnectionRequest> for InitiatedConnection {

        Ok(Self {
            host,
            cloak: host.ip().to_string(),
            cloak: format!("0{}", host.ip()),
            nick,
            user,
            mode: UserMode::empty(),
@@ -298,6 +299,22 @@ bitflags! {
    }
}

impl Display for UserMode {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "+")?;

        if self.contains(Self::WALLOPS) {
            write!(f, "w")?;
        }

        if self.contains(Self::OPER) {
            write!(f, "o")?;
        }

        Ok(())
    }
}

impl Capability {
    pub const SUPPORTED: &'static [&'static str] = &[
        "userhost-in-names",
diff --git a/src/server/response.rs b/src/server/response.rs
index 8c38ce7..f22bbbb 100644
--- a/src/server/response.rs
+++ b/src/server/response.rs
@@ -25,6 +25,16 @@ impl IntoProtocol for Whois {
                    ),
                }
            };
            ($response:literal, $($payload:expr),*) => {
                Message {
                    tags: None,
                    prefix: Some(Prefix::ServerName(SERVER_NAME.to_string())),
                    command: Command::Raw(
                        format!("{:03}", $response),
                        vec![for_user.to_string(), $($payload),*],
                    ),
                }
            };
        }

        let Some(conn) = self.conn else {
@@ -42,11 +52,16 @@ impl IntoProtocol for Whois {
        // TODO: RPL_WHOISSECURE
        // TODO: fix missing rpl variants
        let mut out = vec![
            // msg!(RPL_WHOISREGNICK, self.conn.nick.to_string(), "has identified for this nick".to_string()),
            msg!(
                307,
                conn.nick.to_string(),
                "has identified for this nick".to_string()
            ), // RPL_WHOISREGNICK
            msg!(
                RPL_WHOISUSER,
                conn.nick.to_string(),
                conn.user,
                conn.user.to_string(),
                conn.cloak,
                "*".to_string(),
                conn.real_name
            ),
@@ -64,11 +79,30 @@ impl IntoProtocol for Whois {
                "seconds idle, signon time".to_string()
            ), // TODO
            msg!(RPL_WHOISCHANNELS, conn.nick.to_string(), channels),
            // msg!(RPL_WHOISACCOUNT, self.conn.nick.to_string(), self.conn.user.to_string(), "is logged in as".to_string()),
            // msg!(RPL_WHOISHOST, self.conn.nick.to_string(), format!("is connecting from {}@{} {}", self.conn.user, self.conn.host, self.conn.host)),
            // msg!(RPL_WHOISMODES, self.conn.nick.to_string(), format!("is using modes {}", self.conn.mode)),
            msg!(
                330,
                conn.nick.to_string(),
                conn.user.to_string(),
                "is logged in as".to_string()
            ), // RPL_WHOISACCOUNT
            msg!(
                378,
                conn.nick.to_string(),
                format!(
                    "is connecting from {}@{} {}",
                    conn.user, conn.host, conn.host
                )
            ), // RPL_WHOISHOST
        ];

        if !conn.mode.is_empty() {
            out.push(msg!(
                379,
                conn.nick.to_string(),
                format!("is using modes {}", conn.mode)
            )); // RPL_WHOISMODES
        }

        if let Some(msg) = conn.away {
            out.push(msg!(RPL_AWAY, conn.nick.to_string(), msg));
        }