comparison 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
comparison
equal deleted inserted replaced
467:73aa14eba3c7 468:644b8bf9ca4d
1015 // There can be multiple <x> tags!! 1015 // There can be multiple <x> tags!!
1016 x = xmlnode_get_firstchild(packet->x); 1016 x = xmlnode_get_firstchild(packet->x);
1017 for ( ; x; x = xmlnode_get_nextsibling(x)) { 1017 for ( ; x; x = xmlnode_get_nextsibling(x)) {
1018 if ((p = xmlnode_get_name(x)) && !strcmp(p, "x")) 1018 if ((p = xmlnode_get_name(x)) && !strcmp(p, "x"))
1019 if ((p = xmlnode_get_attrib(x, "xmlns")) && 1019 if ((p = xmlnode_get_attrib(x, "xmlns")) &&
1020 !strncasecmp(p, "http://jabber.org/protocol/muc", 30)) 1020 !strcasecmp(p, "http://jabber.org/protocol/muc#user"))
1021 break; 1021 break;
1022 } 1022 }
1023 if (x) { // This is a MUC presence message 1023 if (x) { // This is a MUC presence message
1024 roster_add_user(r, NULL, NULL, ROSTER_TYPE_ROOM); 1024 enum imrole mbrole = role_none;
1025 1025 const char *mbrjid = NULL;
1026 const char *mbnewnick = NULL;
1027 GSList *room_elt;
1028
1029 // Add room if it doesn't already exist
1030 room_elt = roster_add_user(r, NULL, NULL, ROSTER_TYPE_ROOM);
1031
1032 // Get room member's information
1033 y = xmlnode_get_tag(x, "item");
1034 if (y) {
1035 p = xmlnode_get_attrib(y, "role");
1036 if (p) {
1037 if (!strcmp(p, "moderator")) mbrole = role_moderator;
1038 else if (!strcmp(p, "participant")) mbrole = role_participant;
1039 else if (!strcmp(p, "visitor")) mbrole = role_visitor;
1040 else if (!strcmp(p, "none")) mbrole = role_none;
1041 else scr_LogPrint(LPRINT_LOGNORM, "<%s>: Unknown role \"%s\"",
1042 from, p);
1043 }
1044 p = xmlnode_get_attrib(y, "jid");
1045 if (p) mbrjid = p;
1046 p = xmlnode_get_attrib(y, "nick");
1047 if (p) mbnewnick = p;
1048 }
1049
1050 // Check for nickname change
1051 y = xmlnode_get_tag(x, "status");
1052 if (y && mbnewnick) {
1053 p = xmlnode_get_attrib(y, "code");
1054 if (p && !strcmp(p, "303")) {
1055 gchar *mbuf;
1056 mbuf = g_strdup_printf("%s is now known as %s", rname, mbnewnick);
1057 scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
1058 g_free(mbuf);
1059 buddy_resource_setname(room_elt->data, rname, mbnewnick);
1060 }
1061 }
1062
1063 // Check for departure/arrival
1064 if (!mbnewnick && mbrole == role_none) {
1065 gchar *mbuf = g_strdup_printf("%s has left", rname);
1066 scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
1067 g_free(mbuf);
1068 } else if (buddy_getstatus(room_elt->data, rname) == offline &&
1069 ust != offline) {
1070 gchar *mbuf = g_strdup_printf("%s has joined", rname);
1071 scr_WriteIncomingMessage(r, mbuf, 0, HBB_PREFIX_INFO);
1072 g_free(mbuf);
1073 }
1074
1075 // Update room member status
1026 if (rname) 1076 if (rname)
1027 roster_setstatus(r, rname, bpprio, ust, NULL); 1077 roster_setstatus(r, rname, bpprio, ust, NULL, mbrole, mbrjid);
1028 else 1078 else
1029 scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */ 1079 scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
1080
1081 g_free(r);
1082 if (s) g_free(s);
1030 1083
1031 buddylist_build(); 1084 buddylist_build();
1032 scr_DrawRoster(); 1085 scr_DrawRoster();
1033 break; 1086 break;
1034 } 1087 }