Event::RoomPrivateMessage for MUC PMs (#85)

xmppftw created

Change summary

xmpp/src/lib.rs | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)

Detailed changes

xmpp/src/lib.rs 🔗

@@ -90,6 +90,9 @@ pub enum Event {
     RoomJoined(BareJid),
     RoomLeft(BareJid),
     RoomMessage(Id, BareJid, RoomNick, Body),
+    /// A private message received from a room, containing the message ID, the room's BareJid,
+    /// the sender's FullJid, the corresponding nickname, and the message body.
+    RoomPrivateMessage(Id, BareJid, FullJid, RoomNick, Body),
     ServiceMessage(Id, BareJid, Body),
     HttpUploadedFile(String),
 }
@@ -359,9 +362,38 @@ impl Agent {
                     events.push(event)
                 }
                 MessageType::Chat | MessageType::Normal => {
-                    let event =
-                        Event::ChatMessage(message.id.clone(), from.clone().into(), body.clone());
-                    events.push(event)
+                    let mut found_special_message = false;
+
+                    for payload in &message.payloads {
+                        if payload.is("x", xmpp_parsers::ns::MUC_USER) {
+                            let event = match from.clone() {
+                                Jid::Bare(bare) => {
+                                    // TODO: Can a service message be of type Chat/Normal and not Groupchat?
+                                    warn!("Received misformed MessageType::Chat in muc#user namespace from a bare JID.");
+                                    Event::ServiceMessage(message.id.clone(), bare, body.clone())
+                                }
+                                Jid::Full(full) => Event::RoomPrivateMessage(
+                                    message.id.clone(),
+                                    full.clone().into(),
+                                    full.clone(),
+                                    full.resource,
+                                    body.clone(),
+                                ),
+                            };
+
+                            found_special_message = true;
+                            events.push(event);
+                        }
+                    }
+
+                    if !found_special_message {
+                        let event = Event::ChatMessage(
+                            message.id.clone(),
+                            from.clone().into(),
+                            body.clone(),
+                        );
+                        events.push(event)
+                    }
                 }
                 _ => (),
             },