comparison pidgin-twitter.c @ 211:e13103257b33

implemented filtering functionality.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 25 Aug 2008 21:17:02 +0900
parents 00e26402de03
children 8670e1572be8
comparison
equal deleted inserted replaced
210:00e26402de03 211:e13103257b33
516 for(stp = statuseslist; stp; stp=stp->next) { 516 for(stp = statuseslist; stp; stp=stp->next) {
517 status_t *st = (status_t *)stp->data; 517 status_t *st = (status_t *)stp->data;
518 518
519 if(st->id > lastid && !is_posted_message(st, lastid)) { 519 if(st->id > lastid && !is_posted_message(st, lastid)) {
520 gchar *msg = NULL; 520 gchar *msg = NULL;
521 gchar *sender = NULL;
522
523 sender = g_strdup("twitter@twitter.com");
524
525 PurpleMessageFlags flag = PURPLE_MESSAGE_RECV;
521 526
522 msg = g_strdup_printf("%s: %s", st->screen_name, st->text); 527 msg = g_strdup_printf("%s: %s", st->screen_name, st->text);
523 purple_conv_im_write(conv->u.im, 528
524 "twitter@twitter.com", 529 /* apply filter*/
525 msg, 530 if(purple_prefs_get_bool(OPT_FILTER)) {
526 PURPLE_MESSAGE_RECV, 531 apply_filter(&sender, &msg, &flag, twitter_service);
527 st->time); 532 }
533 if(sender && msg) {
534 purple_conv_im_write(conv->u.im,
535 sender,
536 msg,
537 flag,
538 st->time);
539 }
528 lastid = st->id; 540 lastid = st->id;
529 541
530 g_free(msg); 542 g_free(msg);
531 } 543 }
532 544
949 961
950 static void 962 static void
951 playsound(gchar **str, gint which) 963 playsound(gchar **str, gint which)
952 { 964 {
953 GMatchInfo *match_info; 965 GMatchInfo *match_info;
954 const gchar *list; 966 const gchar *list = NULL;
955 gchar **candidates = NULL, **candidate = NULL; 967 gchar **candidates = NULL, **candidate = NULL;
956 968
957 list = purple_prefs_get_string(which ? OPT_USERLIST_SENDER : 969 list = purple_prefs_get_string(which ? OPT_USERLIST_SENDER :
958 OPT_USERLIST_RECIPIENT); 970 OPT_USERLIST_RECIPIENT);
959 g_return_if_fail(list != NULL); 971 g_return_if_fail(list != NULL);
960 if(!strcmp(list, DEFAULT_LIST)) 972 if(strstr(list, DEFAULT_LIST))
961 return; 973 return;
962 974
963 candidates = g_strsplit_set(list, " ,:;", 0); 975 candidates = g_strsplit_set(list, " ,:;", 0);
964 g_return_if_fail(candidates != NULL); 976 g_return_if_fail(candidates != NULL);
965 977
1001 1013
1002 /* check if the conversation is between twitter */ 1014 /* check if the conversation is between twitter */
1003 if(service == unknown_service) 1015 if(service == unknown_service)
1004 return FALSE; 1016 return FALSE;
1005 1017
1006 /* Add screen_name if the current message is posted by owner */ 1018 /* add screen_name if the current message is posted by myself */
1007 if (flags & PURPLE_MESSAGE_SEND) { 1019 if (flags & PURPLE_MESSAGE_SEND) {
1008 gchar *m = NULL; 1020 gchar *m = NULL;
1009 const char *screen_name = NULL; 1021 const char *screen_name = NULL;
1010 1022
1011 switch(service) { 1023 switch(service) {
1052 if(service == identica_service && 1064 if(service == identica_service &&
1053 purple_prefs_get_bool(OPT_TRANSLATE_CHANNEL)) { 1065 purple_prefs_get_bool(OPT_TRANSLATE_CHANNEL)) {
1054 translate(buffer, TAG_IDENTICA, service); 1066 translate(buffer, TAG_IDENTICA, service);
1055 } 1067 }
1056 1068
1057 /* escape pseudo command (to show same result to sending message) */ 1069 /* escape pseudo command (to show the same result as sending message) */
1058 if(service == twitter_service && 1070 if(service == twitter_service &&
1059 purple_prefs_get_bool(OPT_ESCAPE_PSEUDO)) { 1071 purple_prefs_get_bool(OPT_ESCAPE_PSEUDO)) {
1060 escape(buffer); 1072 escape(buffer);
1061 } 1073 }
1062 1074
1495 1507
1496 if(hash) 1508 if(hash)
1497 delete_requested_icon_marks(gtkconv, hash); 1509 delete_requested_icon_marks(gtkconv, hash);
1498 } 1510 }
1499 1511
1512 static void
1513 apply_filter(gchar **sender, gchar **buffer, PurpleMessageFlags *flags, int service)
1514 {
1515 GMatchInfo *match_info;
1516 const gchar *list = NULL;
1517 gchar **candidates = NULL, **candidate = NULL;
1518
1519 gchar *plain = strip_html_markup(*buffer);
1520
1521 switch(service) {
1522 case twitter_service:
1523 list = purple_prefs_get_string(OPT_FILTER_TWITTER);
1524 break;
1525 case wassr_service:
1526 list = purple_prefs_get_string(OPT_FILTER_WASSR);
1527 break;
1528 case identica_service:
1529 list = purple_prefs_get_string(OPT_FILTER_IDENTICA);
1530 break;
1531 }
1532 g_return_if_fail(list != NULL);
1533 if(strstr(list, DEFAULT_LIST))
1534 return;
1535
1536 candidates = g_strsplit_set(list, " ,:;", 0);
1537 g_return_if_fail(candidates != NULL);
1538
1539 g_regex_match(regp[SENDER], plain, 0, &match_info);
1540 while(g_match_info_matches(match_info)) {
1541 gchar *user = NULL;
1542 user = g_match_info_fetch(match_info, 2);
1543 twitter_debug("user = %s\n", user);
1544
1545 for(candidate = candidates; *candidate; candidate++) {
1546 if(!strcmp(*candidate, ""))
1547 continue;
1548 twitter_debug("candidate = %s\n", *candidate);
1549 if(!strcmp(user, *candidate)) {
1550 twitter_debug("match. filter %s\n", user);
1551 *flags |= PURPLE_MESSAGE_INVISIBLE; /* pidgin should handle this flag properly --yaz */
1552 #if 1
1553 /* temporal workaround */
1554 g_free(*sender); *sender = NULL;
1555 g_free(*buffer); *buffer = NULL;
1556 #endif
1557 break;
1558 }
1559 }
1560 g_free(user);
1561 g_match_info_next(match_info, NULL);
1562 }
1563 g_free(plain);
1564 g_strfreev(candidates);
1565 g_match_info_free(match_info);
1566 }
1567
1568
1500 static gboolean 1569 static gboolean
1501 receiving_im_cb(PurpleAccount *account, char **sender, char **buffer, 1570 receiving_im_cb(PurpleAccount *account, char **sender, char **buffer,
1502 PurpleConversation *conv, PurpleMessageFlags *flags, void *data) 1571 PurpleConversation *conv, PurpleMessageFlags *flags, void *data)
1503 { 1572 {
1504 twitter_debug("called\n"); 1573 twitter_debug("called\n");
1505 twitter_debug("buffer = %s suppress_oops = %d\n", *buffer, suppress_oops); 1574 twitter_debug("buffer = %s suppress_oops = %d\n", *buffer, suppress_oops);
1506 1575
1507 gint service = get_service_type(conv); 1576 gint service = get_service_type(conv);
1508 1577
1509 if(service != unknown_service) { 1578 /* suppress notification of incoming messages. */
1510 /* suppress notification of incoming messages. */ 1579 if(service != unknown_service &&
1511 if(purple_prefs_get_bool(OPT_PREVENT_NOTIFICATION)) 1580 purple_prefs_get_bool(OPT_PREVENT_NOTIFICATION))
1512 *flags |= PURPLE_MESSAGE_SYSTEM; 1581 *flags |= PURPLE_MESSAGE_SYSTEM;
1513 } 1582
1514
1515 /* quick hack to suppress annoying completion message from wassr */
1516 if(service == wassr_service) { 1583 if(service == wassr_service) {
1584 /* suppress annoying completion message from wassr */
1517 if(strstr(*buffer, "<body>投稿完了:") || 1585 if(strstr(*buffer, "<body>投稿完了:") ||
1518 strstr(*buffer, "<body>チャンネル投稿完了:")) { 1586 strstr(*buffer, "<body>チャンネル投稿完了:")) {
1519 twitter_debug("clearing sender and buffer\n"); 1587 twitter_debug("clearing sender and buffer\n");
1520 g_free(*sender); *sender = NULL; 1588 g_free(*sender); *sender = NULL;
1521 g_free(*buffer); *buffer = NULL; 1589 g_free(*buffer); *buffer = NULL;
1522 } 1590 }
1523 /* fix for parrot problem during post to a channel */ 1591 /* discard parrot message */
1524 else if(wassr_post && 1592 else if(wassr_post &&
1525 strlen(wassr_post) && 1593 strlen(wassr_post) &&
1526 strstr(*buffer, wassr_post)) { 1594 strstr(*buffer, wassr_post)) {
1527 twitter_debug("parrot clearing: buf = %s post = %s\n", *buffer, wassr_post); 1595 twitter_debug("parrot clearing: buf = %s post = %s\n", *buffer, wassr_post);
1528 g_free(*sender); *sender = NULL; 1596 g_free(*sender); *sender = NULL;
1529 g_free(*buffer); *buffer = NULL; 1597 g_free(*buffer); *buffer = NULL;
1530 } 1598 }
1531 } 1599 }
1532 1600
1533 if(service == identica_service) { 1601 if(service == identica_service) {
1602 /* discard parrot message */
1534 gchar *stripped = strip_html_markup(*buffer); 1603 gchar *stripped = strip_html_markup(*buffer);
1535 if(identica_post && 1604 if(identica_post &&
1536 strlen(identica_post) && 1605 strlen(identica_post) &&
1537 strstr(stripped, identica_post)) { 1606 strstr(stripped, identica_post)) {
1538 twitter_debug("identica parrot clearing: buf = %s post = %s\n", 1607 twitter_debug("identica parrot clearing: buf = %s post = %s\n",
1541 g_free(*buffer); *buffer = NULL; 1610 g_free(*buffer); *buffer = NULL;
1542 } 1611 }
1543 g_free(stripped); 1612 g_free(stripped);
1544 } 1613 }
1545 1614
1615 /* filtering */
1616 if(purple_prefs_get_bool(OPT_FILTER)) {
1617 apply_filter(sender, buffer, flags, service);
1618 }
1619
1620 /* return here if it is not twitter */
1546 if(service != twitter_service) { 1621 if(service != twitter_service) {
1547 return FALSE; 1622 return FALSE;
1548 } 1623 }
1549 1624
1550 /* if we use api, discard all incoming IM messages. */ 1625 /* if we use api, discard all incoming IM messages. */
2762 g_signal_connect(e, "toggled", 2837 g_signal_connect(e, "toggled",
2763 G_CALLBACK(bool_toggled_cb), &e); 2838 G_CALLBACK(bool_toggled_cb), &e);
2764 2839
2765 2840
2766 2841
2842 /***************/
2843 /* filter page */
2844 /***************/
2845 e = GTK_WIDGET(gtk_builder_get_object (builder, "filter_check"));
2846 g_object_set_data(G_OBJECT(e), "pref", OPT_FILTER);
2847 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(e),
2848 purple_prefs_get_bool(OPT_FILTER));
2849 g_signal_connect(e, "toggled",
2850 G_CALLBACK(bool_toggled_cb), &e);
2851
2852 e = GTK_WIDGET(gtk_builder_get_object (builder, "filter_twitter"));
2853 g_object_set_data(G_OBJECT(e), "pref", OPT_FILTER_TWITTER);
2854 text = purple_prefs_get_string(OPT_FILTER_TWITTER);
2855 gtk_entry_set_text(GTK_ENTRY(e), text);
2856 g_signal_connect(e, "changed",
2857 G_CALLBACK(text_changed_cb), &e);
2858
2859 e = GTK_WIDGET(gtk_builder_get_object (builder, "filter_wassr"));
2860 g_object_set_data(G_OBJECT(e), "pref", OPT_FILTER_WASSR);
2861 text = purple_prefs_get_string(OPT_FILTER_WASSR);
2862 gtk_entry_set_text(GTK_ENTRY(e), text);
2863 g_signal_connect(e, "changed",
2864 G_CALLBACK(text_changed_cb), &e);
2865
2866 e = GTK_WIDGET(gtk_builder_get_object (builder, "filter_identica"));
2867 g_object_set_data(G_OBJECT(e), "pref", OPT_FILTER_IDENTICA);
2868 text = purple_prefs_get_string(OPT_FILTER_IDENTICA);
2869 gtk_entry_set_text(GTK_ENTRY(e), text);
2870 g_signal_connect(e, "changed",
2871 G_CALLBACK(text_changed_cb), &e);
2872
2873
2874
2767 /*************/ 2875 /*************/
2768 /* icon page */ 2876 /* icon page */
2769 /*************/ 2877 /*************/
2770 e = GTK_WIDGET(gtk_builder_get_object (builder, "icon_show_icon")); 2878 e = GTK_WIDGET(gtk_builder_get_object (builder, "icon_show_icon"));
2771 g_object_set_data(G_OBJECT(e), "pref", OPT_SHOW_ICON); 2879 g_object_set_data(G_OBJECT(e), "pref", OPT_SHOW_ICON);
2966 0, /**< flags */ 3074 0, /**< flags */
2967 NULL, /**< deps */ 3075 NULL, /**< deps */
2968 PURPLE_PRIORITY_DEFAULT, /**< priority */ 3076 PURPLE_PRIORITY_DEFAULT, /**< priority */
2969 PLUGIN_ID, /**< id */ 3077 PLUGIN_ID, /**< id */
2970 "Pidgin-Twitter", /**< name */ 3078 "Pidgin-Twitter", /**< name */
2971 "0.7.0", /**< version */ 3079 "0.8.0d1", /**< version */
2972 "provides useful features for twitter", /** summary */ 3080 "provides useful features for twitter", /** summary */
2973 "provides useful features for twitter", /** desc */ 3081 "provides useful features for twitter", /** desc */
2974 "Yoshiki Yazawa, mikanbako, \nKonosuke Watanabe, IWATA Ray, \nmojin, umq, \nthe pidging-twitter team", /**< author */ 3082 "Yoshiki Yazawa, mikanbako, \nKonosuke Watanabe, IWATA Ray, \nmojin, umq, \nthe pidging-twitter team", /**< author */
2975 "http://www.honeyplanet.jp/pidgin-twitter/", /**< homepage */ 3083 "http://www.honeyplanet.jp/pidgin-twitter/", /**< homepage */
2976 load_plugin, /**< load */ 3084 load_plugin, /**< load */
3022 purple_prefs_add_int(OPT_ICON_SIZE, DEFAULT_ICON_SIZE); 3130 purple_prefs_add_int(OPT_ICON_SIZE, DEFAULT_ICON_SIZE);
3023 purple_prefs_add_bool(OPT_UPDATE_ICON, TRUE); 3131 purple_prefs_add_bool(OPT_UPDATE_ICON, TRUE);
3024 purple_prefs_add_int(OPT_ICON_MAX_COUNT, DEFAULT_ICON_MAX_COUNT); 3132 purple_prefs_add_int(OPT_ICON_MAX_COUNT, DEFAULT_ICON_MAX_COUNT);
3025 purple_prefs_add_int(OPT_ICON_MAX_DAYS, DEFAULT_ICON_MAX_DAYS); 3133 purple_prefs_add_int(OPT_ICON_MAX_DAYS, DEFAULT_ICON_MAX_DAYS);
3026 purple_prefs_add_bool(OPT_LOG_OUTPUT, FALSE); 3134 purple_prefs_add_bool(OPT_LOG_OUTPUT, FALSE);
3135
3136 purple_prefs_add_bool(OPT_FILTER, TRUE);
3137 purple_prefs_add_string(OPT_FILTER_TWITTER, DEFAULT_LIST);
3138 purple_prefs_add_string(OPT_FILTER_WASSR, DEFAULT_LIST);
3139 purple_prefs_add_string(OPT_FILTER_IDENTICA, DEFAULT_LIST);
3027 } 3140 }
3028 3141
3029 PURPLE_INIT_PLUGIN(pidgin_twitter, init_plugin, info) 3142 PURPLE_INIT_PLUGIN(pidgin_twitter, init_plugin, info)