From ae0464b742b81b8ca91cebe0cd427dba4daf62bf Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 30 May 2024 20:12:50 +0200 Subject: [PATCH] Handle non-negotiated cap --- crates/projection-irc/src/lib.rs | 63 ++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/crates/projection-irc/src/lib.rs b/crates/projection-irc/src/lib.rs index 5a7e6f4..f79e6b0 100644 --- a/crates/projection-irc/src/lib.rs +++ b/crates/projection-irc/src/lib.rs @@ -27,8 +27,11 @@ use proto_irc::server::{AwayStatus, ServerMessage, ServerMessageBody}; use proto_irc::user::PrefixedNick; use proto_irc::{Chan, Recipient, Tag}; use sasl::AuthBody; + mod cap; + use handler::Handler; + mod whois; use crate::cap::Capabilities; @@ -861,35 +864,41 @@ async fn handle_incoming_message( return Ok(HandleResult::Leave); } ClientMessage::ChatHistory { chan, limit } => { - let channel_name = match chan.clone() { - Chan::Global(chan) => chan, - Chan::Local(chan) => chan, - }; - let room = core.get_room(&RoomId::try_from(channel_name.clone())?).await; - if let Some(room) = room { - let room_info = room.get_room_info().await; - let messages = user_handle.get_room_message_history(&room_info.id, limit).await?; - for message in messages { - let mut tags = vec![]; - if user.enabled_capabilities.contains(Capabilities::ServerTime) { - let tag = Tag { - key: "time".into(), - value: Some(message.created_at.to_rfc3339_opts(SecondsFormat::Millis, true).into()), - }; - tags.push(tag); + if user.enabled_capabilities.contains(Capabilities::ChatHistory) { + let channel_name = match chan.clone() { + Chan::Global(chan) => chan, + Chan::Local(chan) => chan, + }; + let room = core.get_room(&RoomId::try_from(channel_name.clone())?).await; + if let Some(room) = room { + let room_info = room.get_room_info().await; + let messages = user_handle.get_room_message_history(&room_info.id, limit).await?; + for message in messages { + let mut tags = vec![]; + if user.enabled_capabilities.contains(Capabilities::ServerTime) { + let tag = Tag { + key: "time".into(), + value: Some(message.created_at.to_rfc3339_opts(SecondsFormat::Millis, true).into()), + }; + tags.push(tag); + } + ServerMessage { + tags, + sender: Some(message.author_name.into()), + body: ServerMessageBody::PrivateMessage { + target: Recipient::Chan(chan.clone()), + body: message.content.into(), + }, + } + .write_async(writer) + .await?; } - ServerMessage { - tags, - sender: Some(message.author_name.into()), - body: ServerMessageBody::PrivateMessage { - target: Recipient::Chan(chan.clone()), - body: message.content.into(), - }, - } - .write_async(writer) - .await?; + writer.flush().await?; + } else { + log::warn!( + "Requested chat history for user {user:?} even though the capability was not negotiated" + ); } - writer.flush().await?; } } cmd => {