Mercurial > pidgin
diff libpurple/protocols/qq/group_conv.c @ 16208:85d5942e80e9
Port SVN revisions 18230 to 18232 from Mark Huetsch from sf SVN to
Pidgin Monotone. Original commit messages:
Bug 1671638 fixed bhpan.
Bug 1658961 fixed by gnap.
Fixed a bug where gaim was playing n x n times user leaving chat room sound when opening a QQ
protocol chat room, n equaling the number of users in the chat room. Patch by gnap.
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 16 Apr 2007 06:37:20 +0000 |
parents | 32c366eeeb99 |
children | b8572b937c09 |
line wrap: on
line diff
--- a/libpurple/protocols/qq/group_conv.c Mon Apr 16 05:37:44 2007 +0000 +++ b/libpurple/protocols/qq/group_conv.c Mon Apr 16 06:37:20 2007 +0000 @@ -50,36 +50,54 @@ { GList *names, *list, *flags; qq_buddy *member; - gchar *member_name; + gchar *member_name, *member_uid; PurpleConversation *conv; gint flag; g_return_if_fail(group != NULL); names = NULL; flags = NULL; - conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->group_name_utf8, purple_connection_get_account(gc)); if (conv != NULL && group->members != NULL) { list = group->members; while (list != NULL) { member = (qq_buddy *) list->data; - /* always put it even offline */ - names = g_list_append(names, - /* we need unique identifiers for everyone in the chat or else we'll - * run into problems with functions like get_cb_real_name from qq.c */ - (member->nickname != NULL && *(member->nickname) != '\0') ? + + /* we need unique identifiers for everyone in the chat or else we'll + * run into problems with functions like get_cb_real_name from qq.c */ + member_name = (member->nickname != NULL && *(member->nickname) != '\0') ? g_strdup_printf("%s (qq-%u)", member->nickname, member->uid) : - g_strdup_printf("(qq-%u)", member->uid)); + g_strdup_printf("(qq-%u)", member->uid); + member_uid = g_strdup_printf("(qq-%u)", member->uid); + flag = 0; /* TYPING to put online above OP and FOUNDER */ - if (is_online(member->status)) flag |= (PURPLE_CBFLAGS_TYPING | PURPLE_CBFLAGS_VOICE); + if (is_online(member->status)) + flag |= (PURPLE_CBFLAGS_TYPING | PURPLE_CBFLAGS_VOICE); if(1 == (member->role & 1)) flag |= PURPLE_CBFLAGS_OP; if(member->uid == group->creator_uid) flag |= PURPLE_CBFLAGS_FOUNDER; - flags = g_list_append(flags, GINT_TO_POINTER(flag)); + + if (purple_conv_chat_find_user(PURPLE_CONV_CHAT(conv), member_name)) + { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(conv), + member_name, + flag); + } else if (purple_conv_chat_find_user(PURPLE_CONV_CHAT(conv), member_uid)) + { + purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(conv), + member_uid, + flag); + purple_conv_chat_rename_user(PURPLE_CONV_CHAT(conv), member_uid, member_name); + } else { + /* always put it even offline */ + names = g_list_append(names, member_name); + flags = g_list_append(flags, GINT_TO_POINTER(flag)); + } + g_free(member_uid); list = list->next; } - - purple_conv_chat_clear_users(PURPLE_CONV_CHAT(conv)); + purple_conv_chat_add_users(PURPLE_CONV_CHAT(conv), names, NULL, flags, FALSE); } /* clean up names */ @@ -88,5 +106,5 @@ names = g_list_remove(names, member_name); g_free(member_name); } - g_list_free(flags); + g_list_free(flags); }