Mercurial > ~mikael > mcabber > hg
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 } |