00001
00023
00024
00025 #include "debug.h"
00026 #include "conversation.h"
00027
00028 #include "utils.h"
00029 #include "group_find.h"
00030 #include "group_network.h"
00031 #include "qq.h"
00032
00033
00034
00035 gchar *qq_group_find_member_by_channel_and_nickname(GaimConnection * gc, gint channel, const gchar * who) {
00036 qq_group *group;
00037 qq_buddy *member;
00038 GList *list;
00039
00040 g_return_val_if_fail(gc != NULL && who != NULL, NULL);
00041
00042
00043
00044 if (g_str_has_prefix(who, QQ_NAME_PREFIX) && gaim_name_to_uid(who) > 0)
00045 return (gchar *) who;
00046
00047 group = qq_group_find_by_channel(gc, channel);
00048 g_return_val_if_fail(group != NULL, NULL);
00049
00050 list = group->members;
00051 member = NULL;
00052 while (list != NULL) {
00053 member = (qq_buddy *) list->data;
00054 if (member->nickname != NULL && !g_ascii_strcasecmp(member->nickname, who))
00055 break;
00056 list = list->next;
00057 }
00058
00059 return (member == NULL) ? NULL : uid_to_gaim_name(member->uid);
00060
00061 }
00062
00063
00064
00065
00066 gboolean qq_group_find_internal_group_id_by_seq(GaimConnection * gc, guint16 seq, guint32 * internal_group_id) {
00067 GList *list;
00068 qq_data *qd;
00069 group_packet *p;
00070
00071 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && internal_group_id != NULL, FALSE);
00072 qd = (qq_data *) gc->proto_data;
00073
00074 list = qd->group_packets;
00075 while (list != NULL) {
00076 p = (group_packet *) (list->data);
00077 if (p->send_seq == seq) {
00078 *internal_group_id = p->internal_group_id;
00079 qd->group_packets = g_list_remove(qd->group_packets, p);
00080 g_free(p);
00081 return TRUE;
00082 }
00083 list = list->next;
00084 }
00085
00086 return FALSE;
00087 }
00088
00089
00090
00091 qq_buddy *qq_group_find_member_by_uid(qq_group * group, guint32 uid)
00092 {
00093 GList *list;
00094 qq_buddy *member;
00095 g_return_val_if_fail(group != NULL && uid > 0, NULL);
00096
00097 list = group->members;
00098 while (list != NULL) {
00099 member = (qq_buddy *) list->data;
00100 if (member->uid == uid)
00101 return member;
00102 else
00103 list = list->next;
00104 }
00105
00106 return NULL;
00107 }
00108
00109
00110
00111 void qq_group_remove_member_by_uid(qq_group * group, guint32 uid)
00112 {
00113 GList *list;
00114 qq_buddy *member;
00115 g_return_if_fail(group != NULL && uid > 0);
00116
00117 list = group->members;
00118 while (list != NULL) {
00119 member = (qq_buddy *) list->data;
00120 if (member->uid == uid) {
00121 group->members = g_list_remove(group->members, member);
00122 return;
00123 } else
00124 list = list->next;
00125 }
00126
00127 }
00128
00129
00130 qq_buddy *qq_group_find_or_add_member(GaimConnection * gc, qq_group * group, guint32 member_uid) {
00131 qq_buddy *member, *q_bud;
00132 GaimBuddy *buddy;
00133 g_return_val_if_fail(gc != NULL && group != NULL && member_uid > 0, NULL);
00134
00135 member = qq_group_find_member_by_uid(group, member_uid);
00136 if (member == NULL) {
00137 member = g_new0(qq_buddy, 1);
00138 member->uid = member_uid;
00139 buddy = gaim_find_buddy(gaim_connection_get_account(gc), uid_to_gaim_name(member_uid));
00140 if (buddy != NULL) {
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 }
00151 group->members = g_list_append(group->members, member);
00152 }
00153
00154 return member;
00155 }
00156
00157
00158
00159 qq_group *qq_group_find_by_channel(GaimConnection * gc, gint channel)
00160 {
00161 GaimConversation *conv;
00162 qq_data *qd;
00163 qq_group *group;
00164 GList *list;
00165
00166 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL, NULL);
00167 qd = (qq_data *) gc->proto_data;
00168
00169 conv = gaim_find_chat(gc, channel);
00170 g_return_val_if_fail(conv != NULL, NULL);
00171
00172 list = qd->groups;
00173 group = NULL;
00174 while (list != NULL) {
00175 group = (qq_group *) list->data;
00176 if (!g_ascii_strcasecmp(gaim_conversation_get_name(conv), group->group_name_utf8))
00177 break;
00178 list = list->next;
00179 }
00180
00181 return group;
00182
00183 }
00184
00185
00186
00187 qq_group *qq_group_find_by_internal_group_id(GaimConnection * gc, guint32 internal_group_id) {
00188
00189 GList *list;
00190 qq_group *group;
00191 qq_data *qd;
00192
00193 g_return_val_if_fail(gc != NULL && gc->proto_data != NULL && internal_group_id > 0, NULL);
00194
00195 qd = (qq_data *) gc->proto_data;
00196 if (qd->groups == NULL)
00197 return NULL;
00198
00199 list = qd->groups;
00200 while (list != NULL) {
00201 group = (qq_group *) list->data;
00202 if (group->internal_group_id == internal_group_id)
00203 return group;
00204 list = list->next;
00205 }
00206
00207 return NULL;
00208 }
00209
00210
00211