diff libpurple/protocols/qq/group_im.c @ 24135:dbc7a9742f8d

2008.09.26 - ccpaging <ccpaging(at)gmail.com> * Added 'Request/Add/Remove Buddy' functions
author SHiNE CsyFeK <csyfek@gmail.com>
date Wed, 22 Oct 2008 14:35:05 +0000
parents bdfcfd71449c
children 619ac2303c46
line wrap: on
line diff
--- a/libpurple/protocols/qq/group_im.c	Wed Oct 22 14:33:20 2008 +0000
+++ b/libpurple/protocols/qq/group_im.c	Wed Oct 22 14:35:05 2008 +0000
@@ -45,18 +45,6 @@
 #include "qq_process.h"
 #include "utils.h"
 
-typedef struct _qq_recv_group_im {
-	guint32 ext_id;
-	guint8 type8;
-	guint32 member_uid;
-	guint16 msg_seq;
-	time_t send_time;
-	guint16 msg_len;
-	gchar *msg;
-	guint8 *font_attr;
-	gint font_attr_len;
-} qq_recv_group_im;
-
 /* send IM to a group */
 void qq_send_packet_group_im(PurpleConnection *gc, qq_group *group, const gchar *msg)
 {
@@ -150,6 +138,41 @@
 	g_free(reason_utf8);
 }
 
+void qq_room_got_chat_in(PurpleConnection *gc,
+		qq_group *group, guint32 uid_from, const gchar *msg, time_t in_time)
+{
+	PurpleAccount *account = purple_connection_get_account(gc);
+	PurpleConversation *conv;
+	qq_buddy *buddy;
+	gchar *from;
+
+	g_return_if_fail(group != NULL);
+
+	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);
+	}
+
+	if (conv == NULL) {
+		return;
+	}
+
+	if (uid_from != 0) {
+		buddy = qq_group_find_member_by_uid(group, uid_from);
+		if (buddy == NULL || buddy->nickname == NULL)
+			from = uid_to_purple_name(uid_from);
+		else
+			from = g_strdup(buddy->nickname);
+	} else {
+		from = g_strdup("");
+	}
+	serv_got_chat_in(gc,
+			purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)),
+				from, 0, msg, in_time);
+	g_free(from);
+}
+
 /* the request to join a group is rejected */
 void qq_process_room_msg_been_rejected(guint8 *data, gint len, guint32 id, PurpleConnection *gc)
 {
@@ -157,12 +180,12 @@
 	guint8 type8;
 	gchar *reason_utf8, *msg, *reason;
 	qq_group *group;
-	gint bytes = 0;
+	gint bytes;
 
 	g_return_if_fail(data != NULL && len > 0);
 
 	/* FIXME: check length here */
-
+	bytes = 0;
 	bytes += qq_get32(&ext_id, data + bytes);
 	bytes += qq_get8(&type8, data + bytes);
 	bytes += qq_get32(&admin_uid, data + bytes);
@@ -183,8 +206,8 @@
 		qq_group_refresh(gc, group);
 	}
 
+	g_free(msg);
 	g_free(reason);
-	g_free(msg);
 	g_free(reason_utf8);
 }
 
@@ -193,26 +216,22 @@
 {
 	guint32 ext_id, admin_uid;
 	guint8 type8;
-	gchar *reason_utf8, *msg;
+	gchar *msg, *reason;
 	qq_group *group;
-	gint bytes = 0;
+	gint bytes;
+	time_t now;
 
 	g_return_if_fail(data != NULL && len > 0);
 
 	/* FIXME: check length here */
-
+	bytes = 0;
 	bytes += qq_get32(&ext_id, data + bytes);
 	bytes += qq_get8(&type8, data + bytes);
 	bytes += qq_get32(&admin_uid, data + bytes);
 
 	g_return_if_fail(ext_id > 0 && admin_uid > 0);
 	/* it is also a "无" here, so do not display */
-	bytes += convert_as_pascal_string(data + bytes, &reason_utf8, QQ_CHARSET_DEFAULT);
-
-	msg = g_strdup_printf
-		(_("Successed to join Qun %d, operated by admin %d"), ext_id, admin_uid);
-
-	purple_notify_warning(gc, _("QQ Qun Operation"), msg, NULL);
+	bytes += convert_as_pascal_string(data + bytes, &reason, QQ_CHARSET_DEFAULT);
 
 	group = qq_room_search_id(gc, id);
 	if (group != NULL) {
@@ -220,8 +239,13 @@
 		qq_group_refresh(gc, group);
 	}
 
+	msg = g_strdup_printf(_("<b>Joinning Qun %d is approved by Admin %d for %s</b>"),
+			ext_id, admin_uid, reason);
+	now = time(NULL);
+	qq_room_got_chat_in(gc, group, 0, msg, now);
+
 	g_free(msg);
-	g_free(reason_utf8);
+	g_free(reason);
 }
 
 /* process the packet when removed from a group */
@@ -232,26 +256,26 @@
 	gchar *msg;
 	qq_group *group;
 	gint bytes = 0;
+	time_t now = time(NULL);
 
 	g_return_if_fail(data != NULL && len > 0);
 
 	/* FIXME: check length here */
-
+	bytes = 0;
 	bytes += qq_get32(&ext_id, data + bytes);
 	bytes += qq_get8(&type8, data + bytes);
 	bytes += qq_get32(&uid, data + bytes);
 
 	g_return_if_fail(ext_id > 0 && uid > 0);
 
-	msg = g_strdup_printf(_("[%d] removed from Qun \"%d\""), uid, ext_id);
-	purple_notify_info(gc, _("QQ Qun Operation"), _("Notice:"), msg);
-
 	group = qq_room_search_id(gc, id);
 	if (group != NULL) {
 		group->my_role = QQ_ROOM_ROLE_NO;
 		qq_group_refresh(gc, group);
 	}
 
+	msg = g_strdup_printf(_("<b>Removed buddy %d.</b>"), uid);
+	qq_room_got_chat_in(gc, group, 0, msg, now);
 	g_free(msg);
 }
 
@@ -262,21 +286,19 @@
 	guint8 type8;
 	qq_group *group;
 	gchar *msg;
-	gint bytes = 0;
+	gint bytes;
+	time_t now = time(NULL);
 
 	g_return_if_fail(data != NULL && len > 0);
 
 	/* FIXME: check length here */
-
+	bytes = 0;
 	bytes += qq_get32(&ext_id, data + bytes);
 	bytes += qq_get8(&type8, data + bytes);
 	bytes += qq_get32(&uid, data + bytes);
 
 	g_return_if_fail(ext_id > 0 && uid > 0);
 
-	msg = g_strdup_printf(_("[%d] added to Qun \"%d\""), uid, ext_id);
-	purple_notify_info(gc, _("QQ Qun Operation"), _("Notice:"), msg);
-
 	group = qq_room_search_id(gc, id);
 	if (group != NULL) {
 		group->my_role = QQ_ROOM_ROLE_YES;
@@ -289,22 +311,33 @@
 		/* the return of this cmd will automatically update the group in blist */
 	}
 
+	msg = g_strdup_printf(_("<b>Added new buddy %d.</b>"), uid);
+	qq_room_got_chat_in(gc, group, 0, msg, now);
 	g_free(msg);
 }
 
 /* recv an IM from a group chat */
 void qq_process_room_msg_normal(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 im_type)
 {
-	gchar *msg_with_purple_smiley, *msg_utf8_encoded, *im_src_name;
-	guint16 unknown;
-	guint32 unknown4;
-	PurpleConversation *conv;
+	gchar *msg_with_purple_smiley, *msg_utf8_encoded;
 	qq_data *qd;
-	qq_buddy *member;
 	qq_group *group;
-	qq_recv_group_im *im_group;
 	gint skip_len;
-	gint bytes = 0;
+	gint bytes ;
+	struct {
+		guint32 ext_id;
+		guint8 type8;
+		guint32 member_uid;
+		guint16 unknown;
+		guint16 msg_seq;
+		time_t send_time;
+		guint32 unknown4;
+		guint16 msg_len;
+		gchar *msg;
+		guint8 *font_attr;
+		gint font_attr_len;
+	} packet;
+
 
 	g_return_if_fail(data != NULL && data_len > 0);
 
@@ -315,21 +348,20 @@
 #if 0
 	qq_hex_dump(PURPLE_DEBUG_INFO, "QQ", data, data_len, "group im hex dump");
 #endif
-
-	im_group = g_newa(qq_recv_group_im, 1);
-
-	bytes += qq_get32(&(im_group->ext_id), data + bytes);
-	bytes += qq_get8(&(im_group->type8), data + bytes);
+	memset(&packet, 0, sizeof(packet));
+	bytes = 0;
+	bytes += qq_get32(&(packet.ext_id), data + bytes);
+	bytes += qq_get8(&(packet.type8), data + bytes);
 
 	if(QQ_RECV_IM_TEMP_QUN_IM == im_type) {
 		bytes += qq_get32(&(id), data + bytes);
 	}
 
-	bytes += qq_get32(&(im_group->member_uid), bytes + data);
-	bytes += qq_get16(&unknown, data + bytes);	/* 0x0001? */
-	bytes += qq_get16(&(im_group->msg_seq), data + bytes);
-	bytes += qq_getime(&im_group->send_time, data + bytes);
-	bytes += qq_get32(&unknown4, data + bytes);	/* versionID */
+	bytes += qq_get32(&(packet.member_uid), bytes + data);
+	bytes += qq_get16(&packet.unknown, data + bytes);	/* 0x0001? */
+	bytes += qq_get16(&(packet.msg_seq), data + bytes);
+	bytes += qq_getime(&packet.send_time, data + bytes);
+	bytes += qq_get32(&packet.unknown4, data + bytes);	/* versionID */
 	/*
 	 * length includes font_attr
 	 * this msg_len includes msg and font_attr
@@ -340,8 +372,8 @@
 	 * 3. font_attr
 	 */
 
-	bytes += qq_get16(&(im_group->msg_len), data + bytes);
-	g_return_if_fail(im_group->msg_len > 0);
+	bytes += qq_get16(&(packet.msg_len), data + bytes);
+	g_return_if_fail(packet.msg_len > 0);
 
 	/*
 	 * 10 bytes from lumaqq
@@ -358,44 +390,28 @@
 		skip_len = 0;
 	bytes += skip_len;
 
-	im_group->msg = g_strdup((gchar *) data + bytes);
-	bytes += strlen(im_group->msg) + 1;
+	packet.msg = g_strdup((gchar *) data + bytes);
+	bytes += strlen(packet.msg) + 1;
 	/* there might not be any font_attr, check it */
-	im_group->font_attr_len = im_group->msg_len - strlen(im_group->msg) - 1 - skip_len;
-	if (im_group->font_attr_len > 0)
-		im_group->font_attr = g_memdup(data + bytes, im_group->font_attr_len);
+	packet.font_attr_len = packet.msg_len - strlen(packet.msg) - 1 - skip_len;
+	if (packet.font_attr_len > 0)
+		packet.font_attr = g_memdup(data + bytes, packet.font_attr_len);
 	else
-		im_group->font_attr = NULL;
+		packet.font_attr = NULL;
 
 	/* group im_group has no flag to indicate whether it has font_attr or not */
-	msg_with_purple_smiley = qq_smiley_to_purple(im_group->msg);
-	if (im_group->font_attr_len > 0)
-		msg_utf8_encoded = qq_encode_to_purple(im_group->font_attr,
-				im_group->font_attr_len, msg_with_purple_smiley);
+	msg_with_purple_smiley = qq_smiley_to_purple(packet.msg);
+	if (packet.font_attr_len > 0)
+		msg_utf8_encoded = qq_encode_to_purple(packet.font_attr,
+				packet.font_attr_len, msg_with_purple_smiley);
 	else
 		msg_utf8_encoded = qq_to_utf8(msg_with_purple_smiley, QQ_CHARSET_DEFAULT);
 
 	group = qq_room_search_id(gc, id);
-	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_prefs_get_bool("/plugins/prpl/qq/show_room_when_newin")) {
-		conv = qq_room_conv_create(gc, group);
-	}
+ 	qq_room_got_chat_in(gc, group, packet.member_uid, msg_utf8_encoded, packet.send_time);
 
-	if (conv != NULL) {
-		member = qq_group_find_member_by_uid(group, im_group->member_uid);
-		if (member == NULL || member->nickname == NULL)
-			im_src_name = uid_to_purple_name(im_group->member_uid);
-		else
-			im_src_name = g_strdup(member->nickname);
-		serv_got_chat_in(gc,
-				purple_conv_chat_get_id(PURPLE_CONV_CHAT
-					(conv)), im_src_name, 0, msg_utf8_encoded, im_group->send_time);
-		g_free(im_src_name);
-	}
 	g_free(msg_with_purple_smiley);
 	g_free(msg_utf8_encoded);
-	g_free(im_group->msg);
-	g_free(im_group->font_attr);
+	g_free(packet.msg);
+	g_free(packet.font_attr);
 }