| 89 static void server_list_create(PurpleAccount *account) |
89 static void server_list_create(PurpleAccount *account) |
| 90 { |
90 { |
| 91 PurpleConnection *gc; |
91 PurpleConnection *gc; |
| 92 qq_data *qd; |
92 qq_data *qd; |
| 93 PurpleProxyInfo *gpi; |
93 PurpleProxyInfo *gpi; |
| 94 const gchar *user_server; |
94 const gchar *custom_server; |
| 95 |
95 |
| 96 gc = purple_account_get_connection(account); |
96 gc = purple_account_get_connection(account); |
| 97 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
97 g_return_if_fail(gc != NULL && gc->proto_data != NULL); |
| 98 qd = gc->proto_data; |
98 qd = gc->proto_data; |
| 99 |
99 |
| 100 gpi = purple_proxy_get_setup(account); |
100 gpi = purple_proxy_get_setup(account); |
| 101 |
101 |
| 102 qd->use_tcp = purple_account_get_bool(account, "use_tcp", TRUE); |
102 qd->use_tcp = purple_account_get_bool(account, "use_tcp", TRUE); |
| 103 |
103 |
| 104 user_server = purple_account_get_string(account, "server", NULL); |
104 custom_server = purple_account_get_string(account, "server", NULL); |
| 105 purple_debug_info("QQ", "Select server '%s'\n", user_server); |
105 purple_debug_info("QQ", "Select server '%s'\n", custom_server); |
| 106 if ( (user_server != NULL && strlen(user_server) > 0) && strcasecmp(user_server, "auto") != 0) { |
106 if ( (custom_server != NULL && strlen(custom_server) > 0) && strcasecmp(custom_server, "auto") != 0) { |
| 107 qd->servers = g_list_append(qd->servers, g_strdup(user_server)); |
107 qd->servers = g_list_append(qd->servers, g_strdup(custom_server)); |
| 108 return; |
108 return; |
| 109 } |
109 } |
| 110 |
110 |
| 111 if (qd->use_tcp) { |
111 if (qd->use_tcp) { |
| 112 qd->servers = server_list_build('T'); |
112 qd->servers = server_list_build('T'); |
| 435 static void qq_change_status(PurpleAccount *account, PurpleStatus *status) |
435 static void qq_change_status(PurpleAccount *account, PurpleStatus *status) |
| 436 { |
436 { |
| 437 PurpleConnection *gc = purple_account_get_connection(account); |
437 PurpleConnection *gc = purple_account_get_connection(account); |
| 438 |
438 |
| 439 qq_request_change_status(gc, 0); |
439 qq_request_change_status(gc, 0); |
| 440 } |
|
| 441 |
|
| 442 static void qq_add_deny(PurpleConnection *gc, const char *who) |
|
| 443 { |
|
| 444 qq_data *qd; |
|
| 445 g_return_if_fail(NULL != gc && NULL != gc->proto_data); |
|
| 446 |
|
| 447 qd = (qq_data *) gc->proto_data; |
|
| 448 if (!qd->is_login) |
|
| 449 return; |
|
| 450 |
|
| 451 if (!who || who[0] == '\0') |
|
| 452 return; |
|
| 453 |
|
| 454 purple_debug_info("QQ", "Add deny for %s\n", who); |
|
| 455 } |
|
| 456 |
|
| 457 static void qq_rem_deny(PurpleConnection *gc, const char *who) |
|
| 458 { |
|
| 459 qq_data *qd; |
|
| 460 g_return_if_fail(NULL != gc && NULL != gc->proto_data); |
|
| 461 |
|
| 462 qd = (qq_data *) gc->proto_data; |
|
| 463 if (!qd->is_login) |
|
| 464 return; |
|
| 465 |
|
| 466 if (!who || who[0] == '\0') |
|
| 467 return; |
|
| 468 |
|
| 469 purple_debug_info("QQ", "Rem deny for %s\n", who); |
|
| 470 } |
|
| 471 |
|
| 472 static void qq_set_permit_deny(PurpleConnection *gc) |
|
| 473 { |
|
| 474 PurpleAccount *account; |
|
| 475 GSList *deny; |
|
| 476 |
|
| 477 purple_debug_info("QQ", "Set permit deny\n"); |
|
| 478 account = purple_connection_get_account(gc); |
|
| 479 switch (account->perm_deny) |
|
| 480 { |
|
| 481 case PURPLE_PRIVACY_ALLOW_ALL: |
|
| 482 for (deny = account->deny; deny; deny = deny->next) |
|
| 483 qq_rem_deny(gc, deny->data); |
|
| 484 break; |
|
| 485 |
|
| 486 case PURPLE_PRIVACY_ALLOW_BUDDYLIST: |
|
| 487 case PURPLE_PRIVACY_ALLOW_USERS: |
|
| 488 case PURPLE_PRIVACY_DENY_USERS: |
|
| 489 case PURPLE_PRIVACY_DENY_ALL: |
|
| 490 for (deny = account->deny; deny; deny = deny->next) |
|
| 491 qq_add_deny(gc, deny->data); |
|
| 492 break; |
|
| 493 } |
|
| 494 } |
|
| 495 |
|
| 496 /* IMPORTANT: PurpleConvImFlags -> PurpleMessageFlags */ |
|
| 497 /* send an instant msg to a buddy */ |
|
| 498 static gint qq_send_im(PurpleConnection *gc, const gchar *who, const gchar *message, PurpleMessageFlags flags) |
|
| 499 { |
|
| 500 gint type, uid_to; |
|
| 501 gchar *msg, *msg_with_qq_smiley; |
|
| 502 qq_data *qd; |
|
| 503 |
|
| 504 g_return_val_if_fail(who != NULL, -1); |
|
| 505 |
|
| 506 qd = (qq_data *) gc->proto_data; |
|
| 507 |
|
| 508 g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG); |
|
| 509 |
|
| 510 type = (flags == PURPLE_MESSAGE_AUTO_RESP ? QQ_IM_AUTO_REPLY : QQ_IM_TEXT); |
|
| 511 uid_to = purple_name_to_uid(who); |
|
| 512 |
|
| 513 /* if msg is to myself, bypass the network */ |
|
| 514 if (uid_to == qd->uid) { |
|
| 515 serv_got_im(gc, who, message, flags, time(NULL)); |
|
| 516 } else { |
|
| 517 msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT); |
|
| 518 msg_with_qq_smiley = purple_smiley_to_qq(msg); |
|
| 519 qq_request_send_im(gc, uid_to, msg_with_qq_smiley, type); |
|
| 520 g_free(msg); |
|
| 521 g_free(msg_with_qq_smiley); |
|
| 522 } |
|
| 523 |
|
| 524 return 1; |
|
| 525 } |
|
| 526 |
|
| 527 /* send a chat msg to a QQ Qun */ |
|
| 528 static int qq_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags) |
|
| 529 { |
|
| 530 gchar *msg, *msg_with_qq_smiley; |
|
| 531 guint32 room_id = id; |
|
| 532 |
|
| 533 g_return_val_if_fail(message != NULL, -1); |
|
| 534 g_return_val_if_fail(strlen(message) <= QQ_MSG_IM_MAX, -E2BIG); |
|
| 535 |
|
| 536 purple_debug_info("QQ_MESG", "Send qun mesg in utf8: %s\n", message); |
|
| 537 msg = utf8_to_qq(message, QQ_CHARSET_DEFAULT); |
|
| 538 msg_with_qq_smiley = purple_smiley_to_qq(msg); |
|
| 539 qq_request_room_send_im(gc, room_id, msg_with_qq_smiley); |
|
| 540 g_free(msg); |
|
| 541 g_free(msg_with_qq_smiley); |
|
| 542 |
|
| 543 return 1; |
|
| 544 } |
440 } |
| 545 |
441 |
| 546 /* send packet to get who's detailed information */ |
442 /* send packet to get who's detailed information */ |
| 547 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who) |
443 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who) |
| 548 { |
444 { |
| 758 g_string_append(info, "OpenQ Team : http://openq.linuxsir.org<br>\n"); |
654 g_string_append(info, "OpenQ Team : http://openq.linuxsir.org<br>\n"); |
| 759 g_string_append(info, "LumaQQ Team : http://lumaqq.linuxsir.org<br>\n"); |
655 g_string_append(info, "LumaQQ Team : http://lumaqq.linuxsir.org<br>\n"); |
| 760 g_string_append(info, "khc(at)pidgin.im<br>\n"); |
656 g_string_append(info, "khc(at)pidgin.im<br>\n"); |
| 761 g_string_append(info, "qulogic(at)pidgin.im<br>\n"); |
657 g_string_append(info, "qulogic(at)pidgin.im<br>\n"); |
| 762 g_string_append(info, "rlaager(at)pidgin.im<br>\n"); |
658 g_string_append(info, "rlaager(at)pidgin.im<br>\n"); |
| |
659 g_string_append(info, "Huang Guan : http://home.xxsyzx.com<br>\n"); |
| 763 g_string_append(info, "OpenQ Google Group : http://groups.google.com/group/openq<br>\n"); |
660 g_string_append(info, "OpenQ Google Group : http://groups.google.com/group/openq<br>\n"); |
| 764 g_string_append(info, "<br>\n"); |
661 g_string_append(info, "<br>\n"); |
| 765 g_string_append(info, _("<p><i>And, all the boys in the backroom...</i><br>\n")); |
662 g_string_append(info, _("<p><i>And, all the boys in the backroom...</i><br>\n")); |
| 766 g_string_append(info, _("<i>Feel free to join us!</i> :)")); |
663 g_string_append(info, _("<i>Feel free to join us!</i> :)")); |
| 767 g_string_append(info, "</body></html>"); |
664 g_string_append(info, "</body></html>"); |
| 822 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); |
719 g_return_if_fail(PURPLE_BLIST_NODE_IS_CHAT(node)); |
| 823 |
720 |
| 824 g_return_if_fail(components != NULL); |
721 g_return_if_fail(components != NULL); |
| 825 |
722 |
| 826 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); |
723 num_str = g_hash_table_lookup(components, QQ_ROOM_KEY_INTERNAL_ID); |
| 827 room_id = strtol(num_str, NULL, 10); |
724 room_id = strtoul(num_str, NULL, 10); |
| 828 g_return_if_fail(room_id != 0); |
725 g_return_if_fail(room_id != 0); |
| 829 |
726 |
| 830 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0, |
727 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_GET_INFO, room_id, NULL, 0, |
| 831 0, QQ_ROOM_INFO_DISPLAY); |
728 0, QQ_ROOM_INFO_DISPLAY); |
| 832 } |
729 } |
| 1035 qq_status_text, /* status_text */ |
932 qq_status_text, /* status_text */ |
| 1036 qq_tooltip_text, /* tooltip_text */ |
933 qq_tooltip_text, /* tooltip_text */ |
| 1037 qq_status_types, /* away_states */ |
934 qq_status_types, /* away_states */ |
| 1038 qq_blist_node_menu, /* blist_node_menu */ |
935 qq_blist_node_menu, /* blist_node_menu */ |
| 1039 qq_chat_info, /* chat_info */ |
936 qq_chat_info, /* chat_info */ |
| 1040 qq_chat_info_defaults, /* chat_info_defaults */ |
937 qq_chat_info_defaults, /* chat_info_defaults */ |
| 1041 qq_login, /* open */ |
938 qq_login, /* open */ |
| 1042 qq_close, /* close */ |
939 qq_close, /* close */ |
| 1043 qq_send_im, /* send_im */ |
940 qq_send_im, /* send_im */ |
| 1044 NULL, /* set_info */ |
941 NULL, /* set_info */ |
| 1045 NULL, /* send_typing */ |
942 NULL, /* send_typing */ |
| 1046 qq_show_buddy_info, /* get_info */ |
943 qq_show_buddy_info, /* get_info */ |
| 1047 qq_change_status, /* change status */ |
944 qq_change_status, /* change status */ |
| 1048 NULL, /* set_idle */ |
945 NULL, /* set_idle */ |
| 1049 NULL, /* change_passwd */ |
946 NULL, /* change_passwd */ |
| 1050 qq_add_buddy, /* add_buddy */ |
947 qq_add_buddy, /* add_buddy */ |
| 1051 NULL, /* add_buddies */ |
948 NULL, /* add_buddies */ |
| 1052 qq_remove_buddy, /* remove_buddy */ |
949 qq_remove_buddy, /* remove_buddy */ |
| 1053 NULL, /* remove_buddies */ |
950 NULL, /* remove_buddies */ |
| 1054 NULL, /* add_permit */ |
951 NULL, /* add_permit */ |
| 1055 qq_add_deny, /* add_deny */ |
952 NULL, /* add_deny */ |
| 1056 NULL, /* rem_permit */ |
953 NULL, /* rem_permit */ |
| 1057 NULL, /* rem_deny */ |
954 NULL, /* rem_deny */ |
| 1058 qq_set_permit_deny, /* set_permit_deny */ |
955 NULL, /* set_permit_deny */ |
| 1059 qq_group_join, /* join_chat */ |
956 qq_group_join, /* join_chat */ |
| 1060 NULL, /* reject chat invite */ |
957 NULL, /* reject chat invite */ |
| 1061 NULL, /* get_chat_name */ |
958 NULL, /* get_chat_name */ |
| 1062 NULL, /* chat_invite */ |
959 NULL, /* chat_invite */ |
| 1063 NULL, /* chat_leave */ |
960 NULL, /* chat_leave */ |
| 1064 NULL, /* chat_whisper */ |
961 NULL, /* chat_whisper */ |
| 1073 NULL, /* buddy_free */ |
970 NULL, /* buddy_free */ |
| 1074 NULL, /* convo_closed */ |
971 NULL, /* convo_closed */ |
| 1075 NULL, /* normalize */ |
972 NULL, /* normalize */ |
| 1076 qq_set_custom_icon, |
973 qq_set_custom_icon, |
| 1077 NULL, /* remove_group */ |
974 NULL, /* remove_group */ |
| 1078 qq_get_chat_buddy_real_name, /* get_cb_real_name */ |
975 qq_get_chat_buddy_real_name, /* get_cb_real_name */ |
| 1079 NULL, /* set_chat_topic */ |
976 NULL, /* set_chat_topic */ |
| 1080 NULL, /* find_blist_chat */ |
977 NULL, /* find_blist_chat */ |
| 1081 qq_roomlist_get_list, /* roomlist_get_list */ |
978 qq_roomlist_get_list, /* roomlist_get_list */ |
| 1082 qq_roomlist_cancel, /* roomlist_cancel */ |
979 qq_roomlist_cancel, /* roomlist_cancel */ |
| 1083 NULL, /* roomlist_expand_category */ |
980 NULL, /* roomlist_expand_category */ |
| 1084 NULL, /* can_receive_file */ |
981 NULL, /* can_receive_file */ |
| 1085 NULL, /* qq_send_file send_file */ |
982 NULL, /* qq_send_file send_file */ |
| 1086 NULL, /* new xfer */ |
983 NULL, /* new xfer */ |
| 1087 NULL, /* offline_message */ |
984 NULL, /* offline_message */ |
| 1168 g_list_free(server_list); |
1065 g_list_free(server_list); |
| 1169 |
1066 |
| 1170 option = purple_account_option_list_new(_("Select Server"), "server", server_kv_list); |
1067 option = purple_account_option_list_new(_("Select Server"), "server", server_kv_list); |
| 1171 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1068 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
| 1172 |
1069 |
| 1173 //#ifdef DEBUG |
|
| 1174 kvp = g_new0(PurpleKeyValuePair, 1); |
1070 kvp = g_new0(PurpleKeyValuePair, 1); |
| 1175 kvp->key = g_strdup(_("QQ2005")); |
1071 kvp->key = g_strdup(_("QQ2005")); |
| 1176 kvp->value = g_strdup("qq2005"); |
1072 kvp->value = g_strdup("qq2005"); |
| 1177 version_kv_list = g_list_append(version_kv_list, kvp); |
1073 version_kv_list = g_list_append(version_kv_list, kvp); |
| 1178 |
1074 |
| 1186 kvp->value = g_strdup("qq2008"); |
1082 kvp->value = g_strdup("qq2008"); |
| 1187 version_kv_list = g_list_append(version_kv_list, kvp); |
1083 version_kv_list = g_list_append(version_kv_list, kvp); |
| 1188 |
1084 |
| 1189 option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list); |
1085 option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list); |
| 1190 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1086 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
| 1191 //#endif |
|
| 1192 |
1087 |
| 1193 option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE); |
1088 option = purple_account_option_bool_new(_("Connect by TCP"), "use_tcp", TRUE); |
| 1194 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1089 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
| 1195 |
1090 |
| 1196 option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); |
1091 option = purple_account_option_bool_new(_("Show server notice"), "show_notice", TRUE); |
| 1206 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
1101 prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option); |
| 1207 |
1102 |
| 1208 purple_prefs_add_none("/plugins/prpl/qq"); |
1103 purple_prefs_add_none("/plugins/prpl/qq"); |
| 1209 purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); |
1104 purple_prefs_add_bool("/plugins/prpl/qq/show_status_by_icon", TRUE); |
| 1210 purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); |
1105 purple_prefs_add_bool("/plugins/prpl/qq/show_fake_video", FALSE); |
| 1211 purple_prefs_add_bool("/plugins/prpl/qq/auto_popup_conversation", FALSE); |
1106 purple_prefs_add_bool("/plugins/prpl/qq/auto_popup_conversation", TRUE); |
| 1212 purple_prefs_add_bool("/plugins/prpl/qq/auto_get_authorize_info", TRUE); |
1107 purple_prefs_add_bool("/plugins/prpl/qq/auto_get_authorize_info", TRUE); |
| 1213 purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3); |
1108 purple_prefs_add_int("/plugins/prpl/qq/resend_interval", 3); |
| 1214 purple_prefs_add_int("/plugins/prpl/qq/resend_times", 10); |
1109 purple_prefs_add_int("/plugins/prpl/qq/resend_times", 10); |
| 1215 } |
1110 } |
| 1216 |
1111 |