Mercurial > pidgin
diff libpurple/protocols/qq/group_im.c @ 24148:1bdf7b602684
2008.10.07 - ccpaging <ccpaging(at)gmail.com>
* Update qun conversation
* Drop group_conv.c and group_conv.h
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Wed, 22 Oct 2008 14:58:32 +0000 |
parents | ce94189f15ad |
children | 818ab62006f5 |
line wrap: on
line diff
--- a/libpurple/protocols/qq/group_im.c Wed Oct 22 14:55:09 2008 +0000 +++ b/libpurple/protocols/qq/group_im.c Wed Oct 22 14:58:32 2008 +0000 @@ -37,7 +37,6 @@ #include "group_info.h" #include "group_im.h" #include "group_opt.h" -#include "group_conv.h" #include "im.h" #include "qq_define.h" #include "packet_parse.h" @@ -45,6 +44,118 @@ #include "qq_process.h" #include "utils.h" +/* show group conversation window */ +PurpleConversation *qq_room_conv_new(PurpleConnection *gc, qq_group *group) +{ + PurpleConversation *conv; + qq_data *qd; + gchar *topic_utf8; + + g_return_val_if_fail(group != NULL, NULL); + qd = (qq_data *) gc->proto_data; + + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, + group->title_utf8, purple_connection_get_account(gc)); + if (conv != NULL) { + /* show only one conversation per group */ + return conv; + } + + serv_got_joined_chat(gc, qd->channel++, group->title_utf8); + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->title_utf8, purple_connection_get_account(gc)); + if (conv != NULL) { + topic_utf8 = g_strdup_printf("%d %s", group->ext_id, group->notice_utf8); + purple_debug_info("QQ", "Set chat topic to %s\n", topic_utf8); + purple_conv_chat_set_topic(PURPLE_CONV_CHAT(conv), NULL, topic_utf8); + g_free(topic_utf8); + + if (group->is_got_info) + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_ONLINES, group->id); + else + qq_update_room(gc, 0, group->id); + return conv; + } + return NULL; +} + +/* refresh online member in group conversation window */ +void qq_room_conv_set_onlines(PurpleConnection *gc, qq_group *group) +{ + GList *names, *list, *flags; + qq_buddy *member; + gchar *member_name, *member_uid; + PurpleConversation *conv; + gint flag; + gboolean is_find; + g_return_if_fail(group != NULL); + + conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, + group->title_utf8, purple_connection_get_account(gc)); + if (conv == NULL) { + purple_debug_warning("QQ", "Conversation \"%s\" is not opened\n", group->title_utf8); + return; + } + g_return_if_fail(group->members != NULL); + + names = NULL; + flags = NULL; + + list = group->members; + while (list != NULL) { + member = (qq_buddy *) list->data; + + /* 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 (%u)", member->nickname, member->uid) : + g_strdup_printf("(%u)", member->uid); + member_uid = g_strdup_printf("(%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(1 == (member->role & 1)) flag |= PURPLE_CBFLAGS_OP; + if(member->uid == group->creator_uid) flag |= PURPLE_CBFLAGS_FOUNDER; + + is_find = TRUE; + 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 { + is_find = FALSE; + } + if (!is_find) { + /* always put it even offline */ + names = g_list_append(names, member_name); + flags = g_list_append(flags, GINT_TO_POINTER(flag)); + } else { + g_free(member_name); + } + g_free(member_uid); + list = list->next; + } + + if (names != NULL && flags != NULL) { + purple_conv_chat_add_users(PURPLE_CONV_CHAT(conv), names, NULL, flags, FALSE); + } + + /* clean up names */ + while (names != NULL) { + member_name = (gchar *) names->data; + names = g_list_remove(names, member_name); + g_free(member_name); + } + g_list_free(flags); +} + /* send IM to a group */ void qq_send_packet_group_im(PurpleConnection *gc, qq_group *group, const gchar *msg) { @@ -151,7 +262,7 @@ conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, group->title_utf8, account); if (conv == NULL && purple_prefs_get_bool("/plugins/prpl/qq/show_room_when_newin")) { - conv = qq_room_conv_create(gc, group); + conv = qq_room_conv_new(gc, group); } if (conv == NULL) {