comparison 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
comparison
equal deleted inserted replaced
24147:0a92aa673a33 24148:1bdf7b602684
35 #include "group_find.h" 35 #include "group_find.h"
36 #include "group_internal.h" 36 #include "group_internal.h"
37 #include "group_info.h" 37 #include "group_info.h"
38 #include "group_im.h" 38 #include "group_im.h"
39 #include "group_opt.h" 39 #include "group_opt.h"
40 #include "group_conv.h"
41 #include "im.h" 40 #include "im.h"
42 #include "qq_define.h" 41 #include "qq_define.h"
43 #include "packet_parse.h" 42 #include "packet_parse.h"
44 #include "qq_network.h" 43 #include "qq_network.h"
45 #include "qq_process.h" 44 #include "qq_process.h"
46 #include "utils.h" 45 #include "utils.h"
46
47 /* show group conversation window */
48 PurpleConversation *qq_room_conv_new(PurpleConnection *gc, qq_group *group)
49 {
50 PurpleConversation *conv;
51 qq_data *qd;
52 gchar *topic_utf8;
53
54 g_return_val_if_fail(group != NULL, NULL);
55 qd = (qq_data *) gc->proto_data;
56
57 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,
58 group->title_utf8, purple_connection_get_account(gc));
59 if (conv != NULL) {
60 /* show only one conversation per group */
61 return conv;
62 }
63
64 serv_got_joined_chat(gc, qd->channel++, group->title_utf8);
65 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, group->title_utf8, purple_connection_get_account(gc));
66 if (conv != NULL) {
67 topic_utf8 = g_strdup_printf("%d %s", group->ext_id, group->notice_utf8);
68 purple_debug_info("QQ", "Set chat topic to %s\n", topic_utf8);
69 purple_conv_chat_set_topic(PURPLE_CONV_CHAT(conv), NULL, topic_utf8);
70 g_free(topic_utf8);
71
72 if (group->is_got_info)
73 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_ONLINES, group->id);
74 else
75 qq_update_room(gc, 0, group->id);
76 return conv;
77 }
78 return NULL;
79 }
80
81 /* refresh online member in group conversation window */
82 void qq_room_conv_set_onlines(PurpleConnection *gc, qq_group *group)
83 {
84 GList *names, *list, *flags;
85 qq_buddy *member;
86 gchar *member_name, *member_uid;
87 PurpleConversation *conv;
88 gint flag;
89 gboolean is_find;
90 g_return_if_fail(group != NULL);
91
92 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,
93 group->title_utf8, purple_connection_get_account(gc));
94 if (conv == NULL) {
95 purple_debug_warning("QQ", "Conversation \"%s\" is not opened\n", group->title_utf8);
96 return;
97 }
98 g_return_if_fail(group->members != NULL);
99
100 names = NULL;
101 flags = NULL;
102
103 list = group->members;
104 while (list != NULL) {
105 member = (qq_buddy *) list->data;
106
107 /* we need unique identifiers for everyone in the chat or else we'll
108 * run into problems with functions like get_cb_real_name from qq.c */
109 member_name = (member->nickname != NULL && *(member->nickname) != '\0') ?
110 g_strdup_printf("%s (%u)", member->nickname, member->uid) :
111 g_strdup_printf("(%u)", member->uid);
112 member_uid = g_strdup_printf("(%u)", member->uid);
113
114 flag = 0;
115 /* TYPING to put online above OP and FOUNDER */
116 if (is_online(member->status)) flag |= (PURPLE_CBFLAGS_TYPING | PURPLE_CBFLAGS_VOICE);
117 if(1 == (member->role & 1)) flag |= PURPLE_CBFLAGS_OP;
118 if(member->uid == group->creator_uid) flag |= PURPLE_CBFLAGS_FOUNDER;
119
120 is_find = TRUE;
121 if (purple_conv_chat_find_user(PURPLE_CONV_CHAT(conv), member_name))
122 {
123 purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(conv),
124 member_name,
125 flag);
126 } else if (purple_conv_chat_find_user(PURPLE_CONV_CHAT(conv), member_uid))
127 {
128 purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(conv),
129 member_uid,
130 flag);
131 purple_conv_chat_rename_user(PURPLE_CONV_CHAT(conv), member_uid, member_name);
132 } else {
133 is_find = FALSE;
134 }
135 if (!is_find) {
136 /* always put it even offline */
137 names = g_list_append(names, member_name);
138 flags = g_list_append(flags, GINT_TO_POINTER(flag));
139 } else {
140 g_free(member_name);
141 }
142 g_free(member_uid);
143 list = list->next;
144 }
145
146 if (names != NULL && flags != NULL) {
147 purple_conv_chat_add_users(PURPLE_CONV_CHAT(conv), names, NULL, flags, FALSE);
148 }
149
150 /* clean up names */
151 while (names != NULL) {
152 member_name = (gchar *) names->data;
153 names = g_list_remove(names, member_name);
154 g_free(member_name);
155 }
156 g_list_free(flags);
157 }
47 158
48 /* send IM to a group */ 159 /* send IM to a group */
49 void qq_send_packet_group_im(PurpleConnection *gc, qq_group *group, const gchar *msg) 160 void qq_send_packet_group_im(PurpleConnection *gc, qq_group *group, const gchar *msg)
50 { 161 {
51 gint data_len, bytes; 162 gint data_len, bytes;
149 g_return_if_fail(group != NULL); 260 g_return_if_fail(group != NULL);
150 261
151 conv = purple_find_conversation_with_account( 262 conv = purple_find_conversation_with_account(
152 PURPLE_CONV_TYPE_CHAT, group->title_utf8, account); 263 PURPLE_CONV_TYPE_CHAT, group->title_utf8, account);
153 if (conv == NULL && purple_prefs_get_bool("/plugins/prpl/qq/show_room_when_newin")) { 264 if (conv == NULL && purple_prefs_get_bool("/plugins/prpl/qq/show_room_when_newin")) {
154 conv = qq_room_conv_create(gc, group); 265 conv = qq_room_conv_new(gc, group);
155 } 266 }
156 267
157 if (conv == NULL) { 268 if (conv == NULL) {
158 return; 269 return;
159 } 270 }