changeset 581:ad07c868ff43

Tell the user when he or she has been kicked/banned
author Mikael Berthe <mikael@lilotux.net>
date Mon, 05 Dec 2005 23:54:27 +0100
parents fed6d1e4d7a9
children bd176d6f34af
files mcabber/src/jabglue.c
diffstat 1 files changed, 74 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/jabglue.c	Mon Dec 05 00:01:16 2005 +0100
+++ b/mcabber/src/jabglue.c	Mon Dec 05 23:54:27 2005 +0100
@@ -819,7 +819,7 @@
 }
 
 static void handle_presence_muc(const char *from, xmlnode xmldata,
-                                const char *jid, const char *rname,
+                                const char *roomjid, const char *rname,
                                 enum imstatus ust, char *ustmsg, char bpprio)
 {
   xmlnode y;
@@ -827,16 +827,18 @@
   const char *m;
   enum imrole mbrole = role_none;
   enum imaffiliation mbaffil = affil_none;
-  const char *mbrjid = NULL;
-  const char *mbnewnick = NULL;
+  const char *mbjid = NULL, *mbnick = NULL;
+  const char *actorjid = NULL, *reason = NULL;
+  unsigned int statuscode = 0;
   GSList *room_elt;
-  //const char *actor = NULL, *reason = NULL;
-  int log_muc_conf = settings_opt_get_int("log_muc_conf");
+  int log_muc_conf;
 
-  room_elt = roster_find(jid, jidsearch, 0);
+  log_muc_conf = settings_opt_get_int("log_muc_conf");
+
+  room_elt = roster_find(roomjid, jidsearch, 0);
   if (!room_elt) {
     // Add room if it doesn't already exist
-    room_elt = roster_add_user(jid, NULL, NULL, ROSTER_TYPE_ROOM);
+    room_elt = roster_add_user(roomjid, NULL, NULL, ROSTER_TYPE_ROOM);
   } else {
     // Make sure this is a room (it can be a conversion user->room)
     buddy_settype(room_elt->data, ROSTER_TYPE_ROOM);
@@ -845,6 +847,7 @@
   // Get room member's information
   y = xmlnode_get_tag(xmldata, "item");
   if (y) {
+    xmlnode z;
     p = xmlnode_get_attrib(y, "affiliation");
     if (p) {
       if (!strcmp(p, "owner"))        mbaffil = affil_owner;
@@ -864,62 +867,91 @@
       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;
+    mbjid = xmlnode_get_attrib(y, "jid");
+    mbnick = xmlnode_get_attrib(y, "nick");
+    // For kick/ban, there can be actor and reason tags
+    reason = xmlnode_get_tag_data(y, "reason");
+    z = xmlnode_get_tag(y, "actor");
+    if (z)
+      actorjid = xmlnode_get_attrib(z, "jid");
   }
 
-  // Check for nickname change
+  // Get the status code
+  // 201: a room has been created
+  // 301: the user has been banned from the room
+  // 303: new room nickname
+  // 307: the user has been kicked from the room
+  // 321,322,332: the user has been removed from the room
   y = xmlnode_get_tag(xmldata, "status");
   if (y) {
     p = xmlnode_get_attrib(y, "code");
-    if (p && !strcmp(p, "303") && mbnewnick) {
-      gchar *mbuf;
-      gchar *newname_noutf8 = from_utf8(mbnewnick);
-      if (!newname_noutf8)
-        scr_LogPrint(LPRINT_LOG,
-                     "Decoding of new nickname has failed: %s",
-                     mbnewnick);
-      mbuf = g_strdup_printf("%s is now known as %s", rname,
-                             (newname_noutf8 ? newname_noutf8 : "(?)"));
-      scr_WriteIncomingMessage(jid, mbuf, 0,
-                               HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
-      if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf);
-      g_free(mbuf);
-      if (newname_noutf8) {
-        buddy_resource_setname(room_elt->data, rname, newname_noutf8);
-        m = buddy_getnickname(room_elt->data);
-        if (m && !strcmp(rname, m))
-          buddy_setnickname(room_elt->data, newname_noutf8);
-        g_free(newname_noutf8);
-      }
+    if (p)
+      statuscode = atoi(p);
+  }
+
+  // Check for nickname change
+  if (statuscode == 303 && mbnick) {
+    gchar *mbuf;
+    gchar *newname_noutf8 = from_utf8(mbnick);
+    if (!newname_noutf8)
+      scr_LogPrint(LPRINT_LOG, "Decoding of new nickname has failed: %s",
+                   mbnick);
+    mbuf = g_strdup_printf("%s is now known as %s", rname,
+                           (newname_noutf8 ? newname_noutf8 : "(?)"));
+    scr_WriteIncomingMessage(roomjid, mbuf, 0,
+                             HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
+    if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf);
+    g_free(mbuf);
+    if (newname_noutf8) {
+      buddy_resource_setname(room_elt->data, rname, newname_noutf8);
+      m = buddy_getnickname(room_elt->data);
+      if (m && !strcmp(rname, m))
+        buddy_setnickname(room_elt->data, newname_noutf8);
+      g_free(newname_noutf8);
     }
   }
 
   // Check for departure/arrival
-  if (!mbnewnick && mbrole == role_none) {
+  if (!mbnick && mbrole == role_none) {
     gchar *mbuf;
 
     // If this is a leave, check if it is ourself
     m = buddy_getnickname(room_elt->data);
     if (m && !strcmp(rname, m)) {
       // _We_ have left! (kicked, banned, etc.)
+      gchar *mbuf;
+
       buddy_setnickname(room_elt->data, NULL);
       buddy_del_all_resources(room_elt->data);
-      scr_LogPrint(LPRINT_LOGNORM, "You have left %s", jid);
-      scr_WriteIncomingMessage(jid, "You have left", 0,
+
+      if (statuscode == 307) {
+        if (actorjid)
+          mbuf = g_strdup_printf("You have been kicked from %s by <%s>."
+                                 "\nReason: %s", roomjid, actorjid, reason);
+        else
+          mbuf = g_strdup_printf("You have been kicked from %s.", roomjid);
+      } else if (statuscode == 301) {
+        if (actorjid)
+          mbuf = g_strdup_printf("You have been banned from %s by <%s>."
+                                 "\nReason: %s", roomjid, actorjid, reason);
+        else
+          mbuf = g_strdup_printf("You have been banned from %s.", roomjid);
+      } else {
+        mbuf = g_strdup_printf("You have left %s", roomjid);
+      }
+      scr_LogPrint(LPRINT_LOGNORM, "%s", mbuf);
+      scr_WriteIncomingMessage(roomjid, mbuf, 0,
                                HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
+      g_free(mbuf);
       update_roster = TRUE;
-
       return;
     }
 
     if (ustmsg)  mbuf = g_strdup_printf("%s has left: %s", rname, ustmsg);
     else         mbuf = g_strdup_printf("%s has left", rname);
-    scr_WriteIncomingMessage(jid, mbuf, 0,
+    scr_WriteIncomingMessage(roomjid, mbuf, 0,
                              HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
-    if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf);
+    if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf);
     g_free(mbuf);
   } else if (buddy_getstatus(room_elt->data, rname) == offline &&
              ust != offline) {
@@ -930,15 +962,16 @@
     } else {
       mbuf = g_strdup_printf("%s has joined", rname);
     }
-    scr_WriteIncomingMessage(jid, mbuf, 0,
+    scr_WriteIncomingMessage(roomjid, mbuf, 0,
                              HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG);
-    if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf);
+    if (log_muc_conf) hlog_write_message(roomjid, 0, FALSE, mbuf);
     g_free(mbuf);
   }
 
   // Update room member status
   if (rname)
-    roster_setstatus(jid, rname, bpprio, ust, ustmsg, mbrole, mbaffil, mbrjid);
+    roster_setstatus(roomjid, rname, bpprio, ust, ustmsg,
+                     mbrole, mbaffil, mbjid);
   else
     scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */