Mercurial > pidgin-twitter
view pidgin-twitter.c @ 9:c6b80f47d4df
added capability to translate sender name into link
author | Yoshiki Yazawa <yaz@cc.rim.or.jp> |
---|---|
date | Thu, 01 May 2008 05:50:48 +0900 |
parents | 2c7c9eb4cdda |
children | 4bd8c89b4749 |
line wrap: on
line source
/* * Pidgin-Twitter plugin. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #define PURPLE_PLUGINS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <glib.h> #include "gtkplugin.h" #include "util.h" #include "debug.h" #include "connection.h" #include "version.h" #include "sound.h" #define PIDGINTWITTER_PLUGIN_ID "pidgin_twitter" #define OPT_PIDGINTWITTER "/plugins/pidgin_twitter" #define OPT_TRANSLATE_RECIPIENT OPT_PIDGINTWITTER "/translate_recipient" #define OPT_TRANSLATE_SENDER OPT_PIDGINTWITTER "/translate_sender" #define OPT_PLAYSOUND OPT_PIDGINTWITTER "/playsound" #define OPT_SOUNDID OPT_PIDGINTWITTER "/soundid" #define OPT_USERLIST OPT_PIDGINTWITTER "/userlist" #define RECIPIENT_FORMAT "@<a href='http://twitter.com/%s'>%s</a>" #define SENDER_FORMAT "<a href='http://twitter.com/%s'>%s</a> :" #define DEFAULT_LIST "(list of users: separated with ' ,:;')" #define twitter_debug(fmt, ...) purple_debug(PURPLE_DEBUG_INFO, PIDGINTWITTER_PLUGIN_ID, \ fmt, ## __VA_ARGS__); #define twitter_error(fmt, ...) purple_debug(PURPLE_DEBUG_ERROR, PIDGINTWITTER_PLUGIN_ID, \ fmt, ## __VA_ARGS__); /* globals */ static GRegex *regrcpt; static GRegex *regsndr; static gboolean eval_sender(const GMatchInfo * match_info, GString * result, gpointer user_data) { gchar sub[128]; gchar *match = g_match_info_fetch(match_info, 1); snprintf(sub, 128, SENDER_FORMAT, match, match); twitter_debug("sub = %s\n", sub); g_string_append(result, sub); g_free(match); return FALSE; } static void translate_sender(gchar **str) { gchar *newstr; twitter_debug("*str = %s\n", *str); newstr = g_regex_replace_eval(regsndr, // compiled regex *str, // subject string -1, // length of the subject string 0, // start position 0, // match options eval_sender, // function to call for each match NULL, // user data (not used) NULL); // error handler twitter_debug("newstr = %s\n", newstr); g_free(*str); *str = newstr; } static gboolean eval_recipient(const GMatchInfo * match_info, GString * result, gpointer user_data) { gchar sub[128]; gchar *match = g_match_info_fetch(match_info, 1); snprintf(sub, 128, RECIPIENT_FORMAT, match, match); twitter_debug("sub = %s\n", sub); g_string_append(result, sub); g_free(match); return FALSE; } static void translate_recipient(gchar **str) { gchar *newstr; twitter_debug("*str = %s\n", *str); newstr = g_regex_replace_eval(regrcpt, // compiled regex *str, // subject string -1, // length of the subject string 0, // start position 0, // match options eval_recipient, // function to call for each match NULL, // user data (not used) NULL); // error handler twitter_debug("newstr = %s\n", newstr); g_free(*str); *str = newstr; } static void playsound(gchar **str) { GMatchInfo *match_info; const gchar *list; gchar **candidates = NULL, **candidate = NULL; list = purple_prefs_get_string(OPT_USERLIST); g_return_if_fail(list != NULL); if(!strcmp(list, DEFAULT_LIST)) return; candidates = g_strsplit_set(list, " ,:;", 0); if(!candidates) return; g_regex_match(regrcpt, *str, 0, &match_info); while(g_match_info_matches(match_info)) { gchar *user = g_match_info_fetch(match_info, 1); twitter_debug("user = %s\n", user); for(candidate = candidates; *candidate ; candidate++) { if(!strcmp(*candidate, "")) continue; twitter_debug("candidate = %s\n", *candidate); if(!strcmp(user, *candidate)) { twitter_debug("match. play sound\n"); purple_sound_play_event( purple_prefs_get_int(OPT_SOUNDID), NULL); break; } } g_free(user); g_match_info_next(match_info, NULL); } g_strfreev(candidates); g_match_info_free(match_info); } static gboolean process_im_cb(PurpleAccount * account, char *sender, char **buffer, PurpleConversation * conv, int *flags, void *data) { const gchar *proto; /* check if the message is from twitter */ proto = purple_account_get_protocol_id(account); twitter_debug("proto = %s\n", proto); twitter_debug("sender = %s\n", sender); if(!strcmp(proto, "prpl-jabber") && !strcmp(sender, "twitter@twitter.com")) { if(purple_prefs_get_bool(OPT_PLAYSOUND)) { /* playsound */ playsound(buffer); } if(purple_prefs_get_bool(OPT_TRANSLATE_SENDER)) { /* translate */ translate_sender(buffer); } if(purple_prefs_get_bool(OPT_TRANSLATE_RECIPIENT)) { /* translate */ translate_recipient(buffer); } } return FALSE; } static gboolean load_plugin(PurplePlugin * plugin) { /* connect to signal */ purple_signal_connect(purple_conversations_get_handle(), "writing-im-msg", plugin, PURPLE_CALLBACK(process_im_cb), NULL); return TRUE; } static gboolean unload_plugin(PurplePlugin * plugin) { twitter_debug("pidgin-twitter unload called\n"); g_regex_unref(regrcpt); g_regex_unref(regsndr); return TRUE; } static PurplePluginPrefFrame * get_plugin_pref_frame(PurplePlugin * plugin) { PurplePluginPref *pref; PurplePluginPrefFrame *frame = purple_plugin_pref_frame_new(); /* create gtk elements for the plugin preferences */ pref = purple_plugin_pref_new_with_label("Pidgin-Twitter Configuration"); purple_plugin_pref_frame_add(frame, pref); pref = purple_plugin_pref_new_with_name_and_label( OPT_TRANSLATE_RECIPIENT, "Translate @username to the link to the user"); purple_plugin_pref_frame_add(frame, pref); pref = purple_plugin_pref_new_with_name_and_label( OPT_TRANSLATE_SENDER, "Translate sender name to the link"); purple_plugin_pref_frame_add(frame, pref); pref = purple_plugin_pref_new_with_name_and_label( OPT_PLAYSOUND, "Play a sound on a reply to the user in the Userlist"); purple_plugin_pref_frame_add(frame, pref); /* sound id selector */ pref = purple_plugin_pref_new_with_name_and_label(OPT_SOUNDID, "Sound"); purple_plugin_pref_set_type(pref, PURPLE_PLUGIN_PREF_CHOICE); purple_plugin_pref_add_choice(pref, "Arrive", GINT_TO_POINTER(0)); purple_plugin_pref_add_choice(pref, "Leave", GINT_TO_POINTER(1)); purple_plugin_pref_add_choice(pref, "Receive", GINT_TO_POINTER(2)); purple_plugin_pref_add_choice(pref, "Fist Receive", GINT_TO_POINTER(3)); purple_plugin_pref_add_choice(pref, "Send", GINT_TO_POINTER(4)); purple_plugin_pref_add_choice(pref, "Chat Join", GINT_TO_POINTER(5)); purple_plugin_pref_add_choice(pref, "Chat Leave", GINT_TO_POINTER(6)); purple_plugin_pref_add_choice(pref, "Chat You Say", GINT_TO_POINTER(7)); purple_plugin_pref_add_choice(pref, "Chat Someone Say", GINT_TO_POINTER(8)); purple_plugin_pref_add_choice(pref, "Pounce Default", GINT_TO_POINTER(9)); purple_plugin_pref_add_choice(pref, "Chat Nick Said", GINT_TO_POINTER(10)); purple_plugin_pref_frame_add(frame, pref); /* user list */ pref = purple_plugin_pref_new_with_name_and_label( OPT_USERLIST, "Userlist"); purple_plugin_pref_frame_add(frame, pref); return frame; } static PurplePluginUiInfo pref_info = { get_plugin_pref_frame }; static PurplePluginInfo info = { PURPLE_PLUGIN_MAGIC, PURPLE_MAJOR_VERSION, PURPLE_MINOR_VERSION, PURPLE_PLUGIN_STANDARD, /**< type */ NULL, /**< ui_req */ 0, /**< flags */ NULL, /**< deps */ PURPLE_PRIORITY_DEFAULT, /**< priority */ PIDGINTWITTER_PLUGIN_ID, /**< id */ "Pidgin-Twitter", /**< name */ "0.3.0", /**< version */ "replaces @username in a message with link to the user", /** summary */ "replaces @username in a message with link to the user", /** desc */ "Yoshiki Yazawa (yaz@honeyplanet.jp)", /**< author */ "http://www.honeyplanet.jp/", /**< homepage */ load_plugin, /**< load */ unload_plugin, /**< unload */ NULL, /**< destroy */ NULL, /**< ui_info */ NULL, /**< extra_info */ &pref_info, /**< pref info */ NULL }; static void init_plugin(PurplePlugin * plugin) { g_type_init(); /* add plugin preferences */ purple_prefs_add_none(OPT_PIDGINTWITTER); purple_prefs_add_bool(OPT_TRANSLATE_RECIPIENT, TRUE); purple_prefs_add_bool(OPT_TRANSLATE_SENDER, TRUE); purple_prefs_add_bool(OPT_PLAYSOUND, TRUE); purple_prefs_add_int(OPT_SOUNDID, PURPLE_SOUND_POUNCE_DEFAULT); purple_prefs_add_string(OPT_USERLIST, DEFAULT_LIST); /* compile regex */ regrcpt = g_regex_new("@([A-Za-z0-9_]+)", 0, 0, NULL); regsndr = g_regex_new("^<body>([A-Za-z0-9_]+): ", 0, 0, NULL); } PURPLE_INIT_PLUGIN(pidgin_twitter, init_plugin, info)