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