0
|
1 /*
|
|
2 * Pidgin-Twitter plugin.
|
|
3 *
|
|
4 * This program is free software; you can redistribute it and/or
|
|
5 * modify it under the terms of the GNU General Public License as
|
|
6 * published by the Free Software Foundation; either version 2 of the
|
|
7 * License, or (at your option) any later version.
|
|
8 *
|
|
9 * This program is distributed in the hope that it will be useful, but
|
|
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
12 * General Public License for more details.
|
|
13 *
|
|
14 * You should have received a copy of the GNU General Public License
|
|
15 * along with this program; if not, write to the Free Software
|
|
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
17 * 02111-1307, USA.
|
|
18 */
|
|
19 #define PURPLE_PLUGINS 1
|
|
20
|
|
21 #include <stdio.h>
|
|
22 #include <stdlib.h>
|
|
23 #include <string.h>
|
|
24 #include <glib.h>
|
|
25
|
|
26 #include "gtkplugin.h"
|
|
27 #include "util.h"
|
|
28 #include "debug.h"
|
|
29 #include "connection.h"
|
|
30 #include "version.h"
|
|
31
|
|
32 extern gchar *botch_utf(const gchar *msg, gsize len, gsize *newlen) __attribute__ ((weak));
|
|
33
|
|
34 #define PIDGINTWITTER_PLUGIN_ID "pidgin_twitter"
|
|
35 #define OPT_PIDGINTWITTER "/plugins/pidgin_twitter"
|
|
36 #define OPT_TRANSLATE OPT_PIDGINTWITTER "/translate"
|
|
37
|
|
38 #define twitter_debug(fmt, ...) purple_debug(PURPLE_DEBUG_INFO, "Pidgin-Twitter", \
|
|
39 fmt, ## __VA_ARGS__);
|
|
40 #define twitter_error(fmt, ...) purple_debug(PURPLE_DEBUG_ERROR, "Pidgin-Twitter", \
|
|
41 fmt, ## __VA_ARGS__);
|
|
42
|
|
43 /* globals */
|
|
44 static GRegex *preg;
|
|
45
|
|
46
|
|
47 static void
|
|
48 do_translate(char *str)
|
|
49 {
|
|
50 int i;
|
|
51 int rc;
|
|
52 int ovector[30];
|
|
53 int soffset = 0; //start offset in str
|
|
54 int boffset = 0; //tail of buf
|
|
55 int len = strlen(str);
|
|
56 char *buf = calloc(1, strlen(str) + 1024); /* XXX should be reasonable size */
|
|
57
|
|
58 do {
|
|
59 rc = pcre_exec(
|
|
60 re, /* result of pcre_compile() */
|
|
61 NULL, /* we didn't study the pattern */
|
|
62 str, /* the subject string */
|
|
63 len, /* the length of the subject string */
|
|
64 soffset, /* start at offset 0 in the subject */
|
|
65 0, /* default options */
|
|
66 ovector, /* vector of integers for substring information */
|
|
67 30); /* number of elements (NOT size in bytes) */
|
|
68
|
|
69 printf("rc=%d\n",rc);
|
|
70 if(rc <= 0) {
|
|
71 printf("no match\n");
|
|
72 break;
|
|
73 } else {
|
|
74 char *sub;
|
|
75
|
|
76 /* copy until precedings */
|
|
77 strncpy(buf+boffset, str+soffset, ovector[0]-soffset);
|
|
78 boffset = boffset + ovector[0]-soffset;
|
|
79
|
|
80 sub = (char *)malloc(128);
|
|
81 /* concatenate replacement substr */
|
|
82 snprintf(sub, 128, "<a href=\"http://twitter.com/%s\"</a>", str+ovector[0]+1); //+1 is to strip preceding @.
|
|
83 strncat(buf, sub, strlen(sub));
|
|
84 boffset += strlen(sub);
|
|
85 free(sub);
|
|
86
|
|
87 soffset = ovector[1];
|
|
88 }
|
|
89 } while(soffset < len);
|
|
90 }
|
|
91
|
|
92
|
|
93 static void
|
|
94 translate(PurpleAccount *account, char *sender, char *buffer,
|
|
95 PurpleConversation *conv, PurpleMessageFlags flags, void *data)
|
|
96 {
|
|
97 const gchar *proto;
|
|
98
|
|
99 /* check if the message is from twitter? */
|
|
100 proto = purple_account_get_protocol_id(account);
|
|
101 if (!g_utf8_collate(proto, "xmpp") &&
|
|
102 !g_utf8_collate(sender, "twitter@twitter.com") &&
|
|
103 purple_prefs_get_bool(OPT_TRANSLATE)) {
|
|
104
|
|
105 /* translate */
|
|
106 do_translate(buffer);
|
|
107
|
|
108 }
|
|
109
|
|
110 }
|
|
111
|
|
112 static gboolean
|
|
113 load_plugin(PurplePlugin *plugin)
|
|
114 {
|
|
115
|
|
116 /* connect to signing-off signal */
|
|
117 purple_signal_connect(purple_connections_get_handle(), "received-im-msg",
|
|
118 plugin, PURPLE_CALLBACK(translate), NULL);
|
|
119
|
|
120 return TRUE;
|
|
121 }
|
|
122
|
|
123 static gboolean
|
|
124 unload_plugin(PurplePlugin *plugin)
|
|
125 {
|
|
126 aud_debug("pidgin-twitter unload called\n");
|
|
127
|
|
128 g_regex_unref(preg);
|
|
129 preg = NULL;
|
|
130 return TRUE;
|
|
131 }
|
|
132
|
|
133 static PurplePluginPrefFrame *
|
|
134 get_plugin_pref_frame(PurplePlugin *plugin)
|
|
135 {
|
|
136 PurplePluginPref *pref;
|
|
137 PurplePluginPrefFrame *frame = purple_plugin_pref_frame_new();
|
|
138
|
|
139 /* create gtk elements for the plugin preferences */
|
|
140 pref = purple_plugin_pref_new_with_label("Pidgin-Twitter Configuration");
|
|
141 purple_plugin_pref_frame_add(frame, pref);
|
|
142
|
|
143 pref = purple_plugin_pref_new_with_name_and_label(OPT_TRANSLATE,
|
|
144 "Translate @username to link");
|
|
145 purple_plugin_pref_frame_add(frame, pref);
|
|
146
|
|
147 return frame;
|
|
148 }
|
|
149
|
|
150 static PurplePluginUiInfo pref_info =
|
|
151 {
|
|
152 get_plugin_pref_frame
|
|
153 };
|
|
154
|
|
155 static PurplePluginInfo info =
|
|
156 {
|
|
157 PURPLE_PLUGIN_MAGIC,
|
|
158 PURPLE_MAJOR_VERSION,
|
|
159 PURPLE_MINOR_VERSION,
|
|
160 PURPLE_PLUGIN_STANDARD, /**< type */
|
|
161 NULL, /**< ui_req */
|
|
162 0, /**< flags */
|
|
163 NULL, /**< deps */
|
|
164 PURPLE_PRIORITY_DEFAULT, /**< priority */
|
|
165 PIDGINAUD_PLUGIN_ID, /**< id */
|
|
166 "Pidgin-Twitter", /**< name */
|
|
167 "0.1.0", /**< version */
|
|
168 "replaces @someone in incoming message with link to someone", /** summary */
|
|
169 "replaces @someone in incoming message with link to someone", /** desc */
|
|
170 "Yoshiki Yazawa (yaz@honeyplanet.jp)", /**< author */
|
|
171 "http://www.honeyplanet.jp/", /**< homepage */
|
|
172 load_plugin, /**< load */
|
|
173 unload_plugin, /**< unload */
|
|
174 NULL, /**< destroy */
|
|
175 NULL, /**< ui_info */
|
|
176 NULL, /**< extra_info */
|
|
177 &pref_info, /**< pref info */
|
|
178 NULL
|
|
179 };
|
|
180
|
|
181 static void
|
|
182 init_plugin(PurplePlugin *plugin)
|
|
183 {
|
|
184 g_type_init();
|
|
185
|
|
186 /* add plugin preferences */
|
|
187 purple_prefs_add_none(OPT_PIDGINTWITTER);
|
|
188 purple_prefs_add_bool(OPT_TRANSLATE, TRUE);
|
|
189
|
|
190 preg = g_regex_new("@[A-Za-z0-9-_]+", 0, 0, NULL);
|
|
191 }
|
|
192
|
|
193 PURPLE_INIT_PLUGIN(pidgin_twitter, init_plugin, info)
|