Mercurial > pidgin-twitter
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) |