diff --git a/xmpp/ChangeLog b/xmpp/ChangeLog index de89d49a1e41e127cef1a4c4dd09d21efd84938c..586fbf8404235b62ba5bfead80c417cbb98de31e 100644 --- a/xmpp/ChangeLog +++ b/xmpp/ChangeLog @@ -15,6 +15,7 @@ XXXX-YY-ZZ [ RELEASER ] - Agent::send_room_private_message now takes RoomPrivateMessageSettings (!487) * Added: - Agent::send_room_message takes RoomMessageSettings argument (!483) + - Agent::send_raw_message takes RawMessageSettings for any message type (!487) * Fixes: - Use tokio::sync::RwLock not std::sync::RwLock (!432) - Agent::wait_for_events now return Vec and sets inner tokio_xmpp Client diff --git a/xmpp/src/agent.rs b/xmpp/src/agent.rs index 6a7f117df5f199ae3a5dc18d9c9f2ba4e602992f..fa2a043e5ec07b6e42f28605a82fa09c1c6c5b72 100644 --- a/xmpp/src/agent.rs +++ b/xmpp/src/agent.rs @@ -49,6 +49,10 @@ impl Agent { muc::room::leave_room(self, settings).await } + pub async fn send_raw_message<'a>(&mut self, settings: message::send::RawMessageSettings<'a>) { + message::send::send_raw_message(self, settings).await + } + pub async fn send_message<'a>(&mut self, settings: message::send::MessageSettings<'a>) { message::send::send_message(self, settings).await } diff --git a/xmpp/src/message/send.rs b/xmpp/src/message/send.rs index d8f612adc0eb59208c17d2b5ad593a8dc16b1d58..36866855eb953524f4a7e7cb10f34b391927b004 100644 --- a/xmpp/src/message/send.rs +++ b/xmpp/src/message/send.rs @@ -4,13 +4,67 @@ // 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, - parsers::message::{Body, Message, MessageType}, +use crate::{ + minidom::Element, + parsers::message::{Body, Message, MessagePayload, MessageType}, + tokio_xmpp::jid::{BareJid, Jid}, }; use crate::Agent; +#[derive(Clone, Debug)] +pub struct RawMessageSettings<'a> { + pub recipient: Jid, + pub message_type: MessageType, + pub message: &'a str, + pub lang: Option<&'a str>, + pub payloads: Vec, +} + +impl<'a> RawMessageSettings<'a> { + pub fn new(recipient: Jid, message_type: MessageType, message: &'a str) -> Self { + Self { + recipient, + message_type, + message, + lang: None, + payloads: Vec::new(), + } + } + + pub fn with_lang(mut self, lang: &'a str) -> Self { + self.lang = Some(lang); + self + } + + pub fn with_payload(mut self, payload: impl MessagePayload) -> Self { + self.payloads.push(payload.into()); + self + } +} + +pub async fn send_raw_message<'a>(agent: &mut Agent, settings: RawMessageSettings<'a>) { + let RawMessageSettings { + recipient, + message_type, + message, + lang, + payloads, + } = settings; + + let mut stanza = Message::new(Some(recipient)); + + for payload in payloads { + stanza.payloads.push(payload); + } + + stanza.type_ = message_type; + stanza + .bodies + .insert(lang.unwrap_or("").to_string(), Body(String::from(message))); + agent.client.send_stanza(stanza.into()).await.unwrap(); +} + #[derive(Clone, Debug)] pub struct MessageSettings<'a> { pub recipient: BareJid,