# HG changeset patch # User Mikael Berthe # Date 1133736947 -3600 # Node ID 0c67755e0fa780630dd16a95322c7a8b524ce831 # Parent b3ab662757a05d43b806b621666e95f5dbba285a Introduce a handle_presence_muc() function diff -r b3ab662757a0 -r 0c67755e0fa7 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sun Dec 04 11:51:47 2005 +0100 +++ b/mcabber/src/jabglue.c Sun Dec 04 23:55:47 2005 +0100 @@ -818,12 +818,140 @@ previous_state = state; } +static void handle_presence_muc(const char *from, xmlnode xmldata, + const char *jid, const char *rname, + enum imstatus ust, char *ustmsg, char bpprio) +{ + xmlnode y; + char *p; + const char *m; + enum imrole mbrole = role_none; + enum imaffiliation mbaffil = affil_none; + const char *mbrjid = NULL; + const char *mbnewnick = NULL; + GSList *room_elt; + //const char *actor = NULL, *reason = NULL; + int log_muc_conf = settings_opt_get_int("log_muc_conf"); + + room_elt = roster_find(jid, jidsearch, 0); + if (!room_elt) { + // Add room if it doesn't already exist + room_elt = roster_add_user(jid, 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); + } + + // Get room member's information + y = xmlnode_get_tag(xmldata, "item"); + if (y) { + p = xmlnode_get_attrib(y, "affiliation"); + if (p) { + if (!strcmp(p, "owner")) mbaffil = affil_owner; + else if (!strcmp(p, "admin")) mbaffil = affil_admin; + else if (!strcmp(p, "member")) mbaffil = affil_member; + else if (!strcmp(p, "outcast")) mbaffil = affil_outcast; + else if (!strcmp(p, "none")) mbaffil = affil_none; + else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown affiliation \"%s\"", + from, p); + } + 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(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); + } + } + } + + // Check for departure/arrival + if (!mbnewnick && 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.) + 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, + HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); + 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, + HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); + if (log_muc_conf) hlog_write_message(jid, 0, FALSE, mbuf); + g_free(mbuf); + } else if (buddy_getstatus(room_elt->data, rname) == offline && + ust != offline) { + gchar *mbuf; + if (buddy_getnickname(room_elt->data) == NULL) { + buddy_setnickname(room_elt->data, rname); + mbuf = g_strdup_printf("You have joined as \"%s\"", rname); + } else { + mbuf = g_strdup_printf("%s has joined", rname); + } + 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); + } + + // Update room member status + if (rname) + roster_setstatus(jid, rname, bpprio, ust, ustmsg, mbrole, mbaffil, mbrjid); + else + scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */ + + buddylist_build(); + scr_DrawRoster(); +} + static void handle_packet_presence(jconn conn, char *type, char *from, xmlnode xmldata) { - char *p, *r, *s; - const char *m; - xmlnode x, y; + char *p, *r; + char *ustmsg; + xmlnode x; const char *rname; enum imstatus ust; char bpprio; @@ -853,11 +981,11 @@ if (type && !strcmp(type, "unavailable")) ust = offline; - s = NULL; + ustmsg = NULL; p = xmlnode_get_tag_data(xmldata, "status"); if (p) { - s = from_utf8(p); - if (!s) + ustmsg = from_utf8(p); + if (!ustmsg) scr_LogPrint(LPRINT_LOG, "Decoding of status message of <%s> has failed: %s", from, p); @@ -875,138 +1003,21 @@ !strcasecmp(p, "http://jabber.org/protocol/muc#user")) break; } - if (x) { // This is a MUC presence message - enum imrole mbrole = role_none; - enum imaffiliation mbaffil = affil_none; - const char *mbrjid = NULL; - const char *mbnewnick = NULL; - GSList *room_elt; - int log_muc_conf = settings_opt_get_int("log_muc_conf"); - - // Add room if it doesn't already exist - room_elt = roster_find(r, jidsearch, 0); - if (!room_elt) - room_elt = roster_add_user(r, 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); - - // Get room member's information - y = xmlnode_get_tag(x, "item"); - if (y) { - p = xmlnode_get_attrib(y, "affiliation"); - if (p) { - if (!strcmp(p, "owner")) mbaffil = affil_owner; - else if (!strcmp(p, "admin")) mbaffil = affil_admin; - else if (!strcmp(p, "member")) mbaffil = affil_member; - else if (!strcmp(p, "outcast")) mbaffil = affil_outcast; - else if (!strcmp(p, "none")) mbaffil = affil_none; - else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown affiliation \"%s\"", - from, p); - } - 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; - 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(r, mbuf, 0, - HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); - if (log_muc_conf) hlog_write_message(r, 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) { - 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.) - buddy_setnickname(room_elt->data, NULL); - buddy_del_all_resources(room_elt->data); - scr_LogPrint(LPRINT_LOGNORM, "You have left %s", r); - scr_WriteIncomingMessage(r, "You have left", 0, - HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); - update_roster = TRUE; - - goto out_packet_presence; - } - - if (s) mbuf = g_strdup_printf("%s has left: %s", rname, s); - else mbuf = g_strdup_printf("%s has left", rname); - scr_WriteIncomingMessage(r, mbuf, 0, - HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); - if (log_muc_conf) hlog_write_message(r, 0, FALSE, mbuf); - g_free(mbuf); - } else if (buddy_getstatus(room_elt->data, rname) == offline && - ust != offline) { - gchar *mbuf; - if (buddy_getnickname(room_elt->data) == NULL) { - buddy_setnickname(room_elt->data, rname); - mbuf = g_strdup_printf("You have joined as \"%s\"", rname); - } else { - mbuf = g_strdup_printf("%s has joined", rname); - } - scr_WriteIncomingMessage(r, mbuf, 0, - HBB_PREFIX_INFO|HBB_PREFIX_NOFLAG); - if (log_muc_conf) hlog_write_message(r, 0, FALSE, mbuf); - g_free(mbuf); - } - - // Update room member status - if (rname) - roster_setstatus(r, rname, bpprio, ust, s, mbrole, mbaffil, mbrjid); - else - scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */ - - buddylist_build(); - scr_DrawRoster(); - - goto out_packet_presence; + if (x) { + // This is a MUC presence message + handle_presence_muc(from, x, r, rname, ust, ustmsg, bpprio); + } else { + // Not a MUC message, so this is a regular buddy... + // Call hk_statuschange() if status has changed or if the + // status message is different + const char *m = roster_getstatusmsg(r, rname); + if ((ust != roster_getstatus(r, rname)) || + (!ustmsg && m && m[0]) || (ustmsg && (!m || strcmp(ustmsg, m)))) + hk_statuschange(r, rname, bpprio, 0, ust, ustmsg); } - // Not a MUC message, so this is a regular buddy... - // Call hk_statuschange() if status has changed or if the - // status message is different - m = roster_getstatusmsg(r, rname); - if ((ust != roster_getstatus(r, rname)) || - (!s && m && m[0]) || (s && (!m || strcmp(s, m)))) - hk_statuschange(r, rname, bpprio, 0, ust, s); - -out_packet_presence: g_free(r); - if (s) g_free(s); + if (ustmsg) g_free(ustmsg); } static void handle_packet_message(jconn conn, char *type, char *from,