diff mcabber/src/jabglue.c @ 468:644b8bf9ca4d

Improve MUC presence messages handling - Display messages when someone joins, leaves, or changes his nickname - Update occupants roles and real jid (if available) - Fix some memory leaks
author Mikael Berthe <mikael@lilotux.net>
date Sat, 01 Oct 2005 18:53:14 +0200
parents 1d8f5b3a5f2b
children a926523d2392
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Sat Oct 01 16:00:17 2005 +0200
+++ b/mcabber/src/jabglue.c	Sat Oct 01 18:53:14 2005 +0200
@@ -1017,17 +1017,70 @@
         for ( ; x; x = xmlnode_get_nextsibling(x)) {
           if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
             if ((p = xmlnode_get_attrib(x, "xmlns")) &&
-                !strncasecmp(p, "http://jabber.org/protocol/muc", 30))
+                !strcasecmp(p, "http://jabber.org/protocol/muc#user"))
               break;
         }
         if (x) {    // This is a MUC presence message
-          roster_add_user(r, NULL, NULL, ROSTER_TYPE_ROOM);
+          enum imrole mbrole = role_none;
+          const char *mbrjid = NULL;
+          const char *mbnewnick = NULL;
+          GSList *room_elt;
+
+          // Add room if it doesn't already exist
+          room_elt = roster_add_user(r, NULL, NULL, ROSTER_TYPE_ROOM);
+
+          // Get room member's information
+          y = xmlnode_get_tag(x, "item");
+          if (y) {
+            p = xmlnode_get_attrib(y, "role");
+            if (p) {
+              if (!strcmp(p, "moderator"))        mbrole = role_moderator;
+              else if (!strcmp(p, "participant")) mbrole = role_participant;
+              else if (!strcmp(p, "visitor"))     mbrole = role_visitor;
+              else if (!strcmp(p, "none"))        mbrole = role_none;
+              else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"",
+                                from, p);
+            }
+            p = xmlnode_get_attrib(y, "jid");
+            if (p) mbrjid = p;
+            p = xmlnode_get_attrib(y, "nick");
+            if (p) mbnewnick = p;
+          }
 
+          // Check for nickname change
+          y = xmlnode_get_tag(x, "status");
+          if (y && mbnewnick) {
+            p = xmlnode_get_attrib(y, "code");
+            if (p && !strcmp(p, "303")) {
+              gchar *mbuf;
+              mbuf = g_strdup_printf("%s is now known as %s", rname, mbnewnick);
+              scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
+              g_free(mbuf);
+              buddy_resource_setname(room_elt->data, rname, mbnewnick);
+            }
+          }
+
+          // Check for departure/arrival
+          if (!mbnewnick && mbrole == role_none) {
+            gchar *mbuf = g_strdup_printf("%s has left", rname);
+            scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
+            g_free(mbuf);
+          } else if (buddy_getstatus(room_elt->data, rname) == offline &&
+                     ust != offline) {
+            gchar *mbuf = g_strdup_printf("%s has joined", rname);
+            scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
+            g_free(mbuf);
+          }
+
+          // Update room member status
           if (rname)
-            roster_setstatus(r, rname, bpprio, ust, NULL);
+            roster_setstatus(r, rname, bpprio, ust, NULL, mbrole, mbrjid);
           else
             scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
 
+          g_free(r);
+          if (s) g_free(s);
+
           buddylist_build();
           scr_DrawRoster();
           break;