static void buddy_add_input(PurpleConnection *gc, guint32 uid, gchar *reason) { PurpleAccount *account = purple_connection_get_account(gc); qq_buddy_opt_req *opt_req; gchar *who; g_return_if_fail(uid != 0 && reason != NULL); purple_debug_info("QQ", "Buddy %u request adding, msg: %s\n", uid, reason); /* free it in qq_process_add_buddy_post */ opt_req = g_new0(qq_buddy_opt_req, 1); opt_req->gc = gc; opt_req->uid = uid; if (purple_prefs_get_bool("/plugins/prpl/qq/auto_get_authorize_info")) { qq_request_get_buddy_info(gc, opt_req->uid, 0, QQ_BUDDY_INFO_DISPLAY); } who = uid_to_purple_name(opt_req->uid); purple_account_request_authorization(account, who, NULL, NULL, reason, purple_find_buddy(account, who) != NULL, buddy_add_authorize_cb, buddy_add_deny_cb, opt_req); g_free(who); }
/* who is the nickname of buddy in QQ chat-room (Qun) */ static void qq_get_chat_buddy_info(PurpleConnection *gc, gint channel, const gchar *who) { qq_data *qd; gchar *uid_str; guint32 uid; purple_debug_info("QQ", "Get chat buddy info of %s\n", who); g_return_if_fail(who != NULL); uid_str = chat_name_to_purple_name(who); if (uid_str == NULL) { return; } qd = gc->proto_data; uid = purple_name_to_uid(uid_str); g_free(uid_str); if (uid <= 0) { purple_debug_error("QQ", "Not valid chat name: %s\n", who); purple_notify_error(gc, NULL, _("Invalid name"), NULL); return; } qq_request_get_buddy_info(gc, uid, 0, QQ_BUDDY_INFO_DISPLAY); }
void qq_process_add_buddy_touch( PurpleConnection *gc, guint8 *data, gint data_len, qq_buddy_opt_req *opt_req ) { qq_data *qd; gint bytes; guint32 dest_uid; guint8 reply; g_return_if_fail(data != NULL && data_len >= 5); g_return_if_fail(opt_req && opt_req->uid != 0); qd = (qq_data *) gc->proto_data; purple_debug_info("QQ", "Process buddy add no auth for id [%u]\n", opt_req->uid); qq_show_packet("buddy_add_no_auth_ex", data, data_len); bytes = 0; bytes += qq_get32(&dest_uid, data + bytes); bytes += qq_get8(&reply, data + bytes); g_return_if_fail(dest_uid == opt_req->uid); if (reply == 0x99) { purple_debug_info("QQ", "Successfully added buddy %u\n", opt_req->uid); qq_buddy_find_or_new(gc, opt_req->uid, opt_req->group_id); qq_request_get_buddy_info(gc, opt_req->uid, 0, 0); qq_request_get_level(gc, opt_req->uid); qq_request_get_buddies_online(gc, 0, 0); return; } if (reply != 0) { purple_debug_info("QQ", "Failed adding buddy %u, Unknown reply 0x%02X\n", opt_req->uid, reply); } /* need auth */ g_return_if_fail(data_len > bytes); bytes += qq_get8(&opt_req->auth_type, data + bytes); purple_debug_warning("QQ", "Adding buddy needs authorize 0x%02X\n", opt_req->auth_type); switch (opt_req->auth_type) { case 0x00: /* no authorize */ case 0x01: /* authorize */ qq_request_auth_token(gc, QQ_AUTH_INFO_BUDDY, QQ_AUTH_INFO_ADD_BUDDY, 0, opt_req); break; case 0x02: /* disable */ break; case 0x03: /* answer question */ qq_request_question(gc, QQ_QUESTION_REQUEST, opt_req->uid, NULL, NULL); break; case 0x04: /* deny! */ break; default: g_return_if_reached(); break; } return; }
static void action_modify_info_contact(PurplePluginAction *action) { PurpleConnection *gc = (PurpleConnection *) action->context; qq_data *qd; g_return_if_fail(NULL != gc && NULL != gc->proto_data); qd = (qq_data *) gc->proto_data; qq_request_get_buddy_info(gc, qd->uid, 0, QQ_BUDDY_INFO_MODIFY_CONTACT); }
void qq_process_add_buddy_post( PurpleConnection *gc, guint8 *data, gint data_len, guintptr auth_type ) { guint32 uid; g_return_if_fail(data != NULL && data_len != 0); qq_get32(&uid, data+1); //qq_show_packet("qq_process_add_buddy_post", data, data_len); if (auth_type == 0) { qq_buddy_find_or_new(gc, uid, 0xFF); qq_request_get_buddy_info(gc, uid, 0, 0); qq_request_get_buddies_online(gc, 0, 0); qq_request_get_level(gc, uid); } }
/* send packet to get who's detailed information */ static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who) { guint32 uid; qq_data *qd; qd = gc->proto_data; uid = purple_name_to_uid(who); if (uid <= 0) { purple_debug_error("QQ", "Not valid QQid: %s\n", who); purple_notify_error(gc, NULL, _("Invalid name"), NULL); return; } qq_request_get_level(gc, uid); qq_request_get_buddy_info(gc, uid, 0, QQ_BUDDY_INFO_DISPLAY); }
static void server_buddy_added(PurpleConnection *gc, gchar *from, gchar *to, guint8 *data, gint data_len) { guint32 uid; g_return_if_fail(from != NULL && to != NULL); g_return_if_fail(data != NULL); qq_show_packet("server_buddy_added", data, data_len); purple_debug_info("QQ", "Buddy %s added \n", from); //server_buddy_check_code(gc, from, data + bytes, data_len - bytes); uid = purple_name_to_uid(from); qq_buddy_find_or_new(gc, uid, 0xFF); qq_request_get_buddy_info(gc, uid, 0, 0); qq_request_get_buddies_online(gc, 0, 0); qq_request_get_level(gc, uid); }
void qq_update_all(PurpleConnection *gc, guint16 cmd) { qq_data *qd; g_return_if_fail (gc != NULL && gc->proto_data != NULL); qd = (qq_data *) gc->proto_data; switch (cmd) { case 0: qq_request_get_buddy_info(gc, qd->uid, QQ_CMD_CLASS_UPDATE_ALL, 0); break; case QQ_CMD_GET_BUDDY_INFO: qq_request_change_status(gc, QQ_CMD_CLASS_UPDATE_ALL); break; case QQ_CMD_CHANGE_STATUS: qq_request_get_group_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); break; case QQ_CMD_GET_GROUP_LIST: qq_request_get_buddies_list(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); break; case QQ_CMD_GET_BUDDIES_LIST: qq_request_buddy_memo(gc, 0, QQ_CMD_CLASS_UPDATE_ALL, QQ_BUDDY_MEMO_ALIAS); break; case QQ_CMD_BUDDY_MEMO: qq_request_get_buddies_level(gc, QQ_CMD_CLASS_UPDATE_ALL, 0); break; case QQ_CMD_GET_LEVEL: qq_request_get_buddies_online(gc, 0, QQ_CMD_CLASS_UPDATE_ALL); break; case QQ_CMD_GET_BUDDIES_ONLINE: qq_request_get_buddies_sign(gc, QQ_CMD_CLASS_UPDATE_ALL, 0); break; case QQ_CMD_GET_BUDDIES_SIGN: /* last command */ qq_update_all_rooms(gc, 0, 0); break; default: break; } qd->online_last_update = time(NULL); }
/* the buddy approves your request of adding him/her as your friend */ static void server_buddy_added_me(PurpleConnection *gc, gchar *from, gchar *to, guint8 *data, gint data_len) { PurpleAccount *account = purple_connection_get_account(gc); qq_data *qd; guint32 uid; g_return_if_fail(from != NULL && to != NULL); qd = (qq_data *) gc->proto_data; uid = strtoul(from, NULL, 10); g_return_if_fail(uid > 0); //server_buddy_check_code(gc, from, data, data_len); qq_buddy_find_or_new(gc, uid, 0xFF); qq_request_get_buddy_info(gc, uid, 0, 0); qq_request_get_buddies_online(gc, 0, 0); qq_request_get_level(gc, uid); purple_account_notify_added(account, to, from, NULL, NULL); }
/* someone wants to add you to his buddy list */ static void server_buddy_add_request_deprecated(PurpleConnection *gc, gchar *from, gchar *to, guint8 *data, gint data_len) { guint32 uid; gchar *reason; g_return_if_fail(from != NULL && to != NULL); uid = strtoul(from, NULL, 10); g_return_if_fail(uid != 0); if (purple_prefs_get_bool("/plugins/prpl/qq/auto_get_authorize_info")) { qq_request_get_buddy_info(gc, uid, 0, QQ_BUDDY_INFO_DISPLAY); } if (data_len <= 0) { reason = g_strdup( _("No reason given") ); } else { reason = g_strndup((gchar *)data, data_len); if (reason == NULL) reason = g_strdup( _("Unknown reason") ); } buddy_add_input(gc, uid, reason); g_free(reason); }