From d98ed615a5513093155ef17d13e6e1f28dd407e3 Mon Sep 17 00:00:00 2001 From: xmppftw Date: Tue, 17 Dec 2024 18:51:19 +0100 Subject: [PATCH] xmpp: Agent::send_room_private_message takes RoomPrivateMessageSettings --- xmpp/ChangeLog | 1 + xmpp/src/agent.rs | 11 +++---- xmpp/src/muc/private_message.rs | 53 +++++++++++++++++++++++++-------- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/xmpp/ChangeLog b/xmpp/ChangeLog index 16033f2413155554c8d3616a7341af31bf1cfe45..9602bd07d986c756a1fbfe631a1d8f78729d2d75 100644 --- a/xmpp/ChangeLog +++ b/xmpp/ChangeLog @@ -11,6 +11,7 @@ XXXX-YY-ZZ [ RELEASER ] - Event::RoomMessage, Event::RoomPrivateMessage, and Event::RoomSubject now use RoomNick as sender nickname; previously RoomNick was an alias for String now it's a newtype wrapper around ResourcePart (!485) + - Agent::send_room_private_message now takes RoomPrivateMessageSettings (!487) * Added: - Agent::send_room_message takes RoomMessageSettings argument (!483) * Fixes: diff --git a/xmpp/src/agent.rs b/xmpp/src/agent.rs index 3036facfa72179d226674f66357fd41451cabc59..23862fa1e9661542ac58b665132aca2ce7364f1e 100644 --- a/xmpp/src/agent.rs +++ b/xmpp/src/agent.rs @@ -16,7 +16,7 @@ pub use tokio_xmpp::{ Client as TokioXmppClient, }; -use crate::{event_loop, message, muc, upload, Error, Event, RoomNick}; +use crate::{event_loop, message, muc, upload, Error, Event}; pub struct Agent { pub(crate) client: TokioXmppClient, @@ -63,14 +63,11 @@ impl Agent { muc::room::send_room_message(self, settings).await } - pub async fn send_room_private_message( + pub async fn send_room_private_message<'a>( &mut self, - room: BareJid, - recipient: RoomNick, - lang: &str, - text: &str, + settings: muc::private_message::RoomPrivateMessageSettings<'a>, ) { - muc::private_message::send_room_private_message(self, room, recipient, lang, text).await + muc::private_message::send_room_private_message(self, settings).await } /// Wait for new events, or Error::Disconnected when connection is closed and will not reconnect. diff --git a/xmpp/src/muc/private_message.rs b/xmpp/src/muc/private_message.rs index e0a57ce823a99cf758a71a04186ad8539abbe5fd..2c150df6f8bf6b33687169467d336d56bfacb8dc 100644 --- a/xmpp/src/muc/private_message.rs +++ b/xmpp/src/muc/private_message.rs @@ -4,28 +4,55 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -use tokio_xmpp::{ - jid::{BareJid, Jid}, +use crate::{ parsers::{ message::{Body, Message, MessageType}, muc::user::MucUser, }, + tokio_xmpp::jid::{BareJid, Jid}, + Agent, RoomNick, }; -use crate::{Agent, RoomNick}; +#[derive(Clone, Debug)] +pub struct RoomPrivateMessageSettings<'a> { + pub room: BareJid, + pub recipient: RoomNick, + pub message: &'a str, + pub lang: Option<&'a str>, +} + +impl<'a> RoomPrivateMessageSettings<'a> { + pub fn new(room: BareJid, recipient: RoomNick, message: &'a str) -> Self { + Self { + room, + recipient, + message, + lang: None, + } + } -pub async fn send_room_private_message( + pub fn with_lang(mut self, lang: &'a str) -> Self { + self.lang = Some(lang); + self + } +} + +pub async fn send_room_private_message<'a>( agent: &mut Agent, - room: BareJid, - recipient: RoomNick, - lang: &str, - text: &str, + settings: RoomPrivateMessageSettings<'a>, ) { + let RoomPrivateMessageSettings { + room, + recipient, + message, + lang, + } = settings; + let recipient: Jid = room.with_resource(recipient.as_ref()).into(); - let mut message = Message::new(recipient).with_payload(MucUser::new()); - message.type_ = MessageType::Chat; - message + let mut stanza = Message::new(recipient).with_payload(MucUser::new()); + stanza.type_ = MessageType::Chat; + stanza .bodies - .insert(String::from(lang), Body(String::from(text))); - let _ = agent.client.send_stanza(message.into()).await; + .insert(lang.unwrap_or("").to_string(), Body(String::from(message))); + agent.client.send_stanza(stanza.into()).await.unwrap(); }