xmpp: Agent::send_room_private_message takes RoomPrivateMessageSettings

xmppftw created

Change summary

xmpp/ChangeLog                  |  1 
xmpp/src/agent.rs               | 11 ++----
xmpp/src/muc/private_message.rs | 53 ++++++++++++++++++++++++++--------
3 files changed, 45 insertions(+), 20 deletions(-)

Detailed changes

xmpp/ChangeLog 🔗

@@ -11,6 +11,7 @@ XXXX-YY-ZZ [ RELEASER <admin@localhost> ]
       - 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:

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.

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();
 }