# HG changeset patch # User Mikael Berthe # Date 1133823267 -3600 # Node ID ad07c868ff43a0f66ba1677047de18f12388bedd # Parent fed6d1e4d7a93abde9ebefa45c123c168538ca04 Tell the user when he or she has been kicked/banned diff -r fed6d1e4d7a9 -r ad07c868ff43 mcabber/src/jabglue.c --- 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 */