Hi,

Direct (private) messages to other occupants of a chat room aren't currently
handled by the MUC code. The below patch fixes this. The relevant sections
of xep-0045 are 7.8 and 7.9.

Thanks,
Hans

Index: DJabberd-MUC/lib/DJabberd/Plugin/MUC/Room.pm
===================================================================
--- DJabberd-MUC/lib/DJabberd/Plugin/MUC/Room.pm        (revision 867)
+++ DJabberd-MUC/lib/DJabberd/Plugin/MUC/Room.pm        (working copy)
@@ -92,11 +92,30 @@
         $logger->error("User @{[$stanza->from]} is not a member of room
$self->{name}; dropping message.");
         return;
     }
+

$message_template->set_from("$self->{nam...@$self->{domain}/$nickname");
-    foreach my $member (keys %{$self->{members}}) {
-        my $message = $message_template->clone;
-        $message->set_to($self->{members}->{$member});
-        $message->deliver($self->{vhost});
+    my $message_type = $stanza->attr( '{}type' );
+    # if message type = chat then it's to an individual. if type =
groupchat
+    # it's in the main room.
+    if ( $message_type eq 'groupchat' ) {
+        foreach my $member (keys %{$self->{members}}) {
+            my $message = $message_template->clone;
+            $message->set_to($self->{members}->{$member});
+            $message->deliver($self->{vhost});
+        }
+    } elsif ( $message_type eq 'chat' ) {
+        if ( $stanza->to =~ m/\/(.*)?$/ ) {
+            my $message = $message_template->clone;
+            my $to_jid = $self->{members}->{$1};
+            $message->set_to($to_jid);
+            $message->deliver($self->{vhost});
+        } else {
+            $logger->error("Direct message received without recipient
nick.");
+            return;
+        }
+    } else {
+        $logger->error("Unknown message type $message_type for MUC
message");
+        return;
     }
 }

Reply via email to