comparison pidgin-twitter.h @ 300:42cdddf0f747

added preliminary support for friendfeed.
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Mon, 25 May 2009 22:47:44 +0900
parents d68ed289ef69
children 1d3209e7e197
comparison
equal deleted inserted replaced
299:d68ed289ef69 300:42cdddf0f747
32 32
33 /* regp id */ 33 /* regp id */
34 enum { 34 enum {
35 RECIPIENT = 0, 35 RECIPIENT = 0,
36 SENDER, 36 SENDER,
37 SENDER_FFEED,
37 COMMAND, 38 COMMAND,
38 PSEUDO, 39 PSEUDO,
39 USER, 40 USER,
40 CHANNEL_WASSR, 41 CHANNEL_WASSR,
41 TAG_TWITTER, 42 TAG_TWITTER,
43 GROUP_IDENTICA, 44 GROUP_IDENTICA,
44 IMAGE_TWITTER, 45 IMAGE_TWITTER,
45 IMAGE_WASSR, 46 IMAGE_WASSR,
46 IMAGE_IDENTICA, 47 IMAGE_IDENTICA,
47 IMAGE_JISKO, 48 IMAGE_JISKO,
49 IMAGE_FFEED,
48 SIZE_128_WASSR, 50 SIZE_128_WASSR,
49 EXCESS_LF 51 EXCESS_LF,
52 TRAIL_HASH
50 }; 53 };
51 54
52 /* service id */ 55 /* service id */
53 enum { 56 enum {
54 unknown_service = -1, 57 unknown_service = -1,
55 twitter_service, 58 twitter_service,
56 wassr_service, 59 wassr_service,
57 identica_service, 60 identica_service,
58 jisko_service 61 jisko_service,
62 ffeed_service
59 }; 63 };
60 64
61 /* container to hold icon data */ 65 /* container to hold icon data */
62 typedef struct _icon_data { 66 typedef struct _icon_data {
63 GdkPixbuf *pixbuf; /* icon pixmap */ 67 GdkPixbuf *pixbuf; /* icon pixmap */
126 #define OPT_API_BASE_POST OPT_PIDGINTWITTER "/api_base_post" 130 #define OPT_API_BASE_POST OPT_PIDGINTWITTER "/api_base_post"
127 #define OPT_SCREEN_NAME_TWITTER OPT_PIDGINTWITTER "/screen_name_twitter" 131 #define OPT_SCREEN_NAME_TWITTER OPT_PIDGINTWITTER "/screen_name_twitter"
128 #define OPT_SCREEN_NAME_WASSR OPT_PIDGINTWITTER "/screen_name_wassr" 132 #define OPT_SCREEN_NAME_WASSR OPT_PIDGINTWITTER "/screen_name_wassr"
129 #define OPT_SCREEN_NAME_IDENTICA OPT_PIDGINTWITTER "/screen_name_identica" 133 #define OPT_SCREEN_NAME_IDENTICA OPT_PIDGINTWITTER "/screen_name_identica"
130 #define OPT_SCREEN_NAME_JISKO OPT_PIDGINTWITTER "/screen_name_jisko" 134 #define OPT_SCREEN_NAME_JISKO OPT_PIDGINTWITTER "/screen_name_jisko"
135 #define OPT_SCREEN_NAME_FFEED OPT_PIDGINTWITTER "/screen_name_ffeed"
131 #define OPT_PASSWORD_TWITTER OPT_PIDGINTWITTER "/password_twitter" 136 #define OPT_PASSWORD_TWITTER OPT_PIDGINTWITTER "/password_twitter"
132 #define OPT_SHOW_ICON OPT_PIDGINTWITTER "/show_icon" 137 #define OPT_SHOW_ICON OPT_PIDGINTWITTER "/show_icon"
133 #define OPT_ICON_SIZE OPT_PIDGINTWITTER "/icon_size" 138 #define OPT_ICON_SIZE OPT_PIDGINTWITTER "/icon_size"
134 #define OPT_UPDATE_ICON OPT_PIDGINTWITTER "/update_icon" 139 #define OPT_UPDATE_ICON OPT_PIDGINTWITTER "/update_icon"
135 #define OPT_ICON_MAX_COUNT OPT_PIDGINTWITTER "/icon_max_count" 140 #define OPT_ICON_MAX_COUNT OPT_PIDGINTWITTER "/icon_max_count"
140 #define OPT_FILTER_EXCLUDE_REPLY OPT_PIDGINTWITTER "/filter_exclude_reply" 145 #define OPT_FILTER_EXCLUDE_REPLY OPT_PIDGINTWITTER "/filter_exclude_reply"
141 #define OPT_FILTER_TWITTER OPT_PIDGINTWITTER "/filter_twitter" 146 #define OPT_FILTER_TWITTER OPT_PIDGINTWITTER "/filter_twitter"
142 #define OPT_FILTER_WASSR OPT_PIDGINTWITTER "/filter_wassr" 147 #define OPT_FILTER_WASSR OPT_PIDGINTWITTER "/filter_wassr"
143 #define OPT_FILTER_IDENTICA OPT_PIDGINTWITTER "/filter_identica" 148 #define OPT_FILTER_IDENTICA OPT_PIDGINTWITTER "/filter_identica"
144 #define OPT_FILTER_JISKO OPT_PIDGINTWITTER "/filter_jisko" 149 #define OPT_FILTER_JISKO OPT_PIDGINTWITTER "/filter_jisko"
150 #define OPT_FILTER_FFEED OPT_PIDGINTWITTER "/filter_ffeed"
145 #define OPT_STRIP_EXCESS_LF OPT_PIDGINTWITTER "/strip_excess_lf" 151 #define OPT_STRIP_EXCESS_LF OPT_PIDGINTWITTER "/strip_excess_lf"
146 #define OPT_RETRIEVE_COUNT OPT_PIDGINTWITTER "/retrieve_count" 152 #define OPT_RETRIEVE_COUNT OPT_PIDGINTWITTER "/retrieve_count"
147 153
148 #ifdef _WIN32 154 #ifdef _WIN32
149 #define OPT_PIDGIN_BLINK_IM PIDGIN_PREFS_ROOT "/win32/blink_im" 155 #define OPT_PIDGIN_BLINK_IM PIDGIN_PREFS_ROOT "/win32/blink_im"
156 #define SENDER_FORMAT_WASSR "%s<a href='http://wassr.jp/user/%s'>%s</a>: " 162 #define SENDER_FORMAT_WASSR "%s<a href='http://wassr.jp/user/%s'>%s</a>: "
157 #define RECIPIENT_FORMAT_IDENTICA "%s@<a href='http://identi.ca/%s'>%s</a>" 163 #define RECIPIENT_FORMAT_IDENTICA "%s@<a href='http://identi.ca/%s'>%s</a>"
158 #define SENDER_FORMAT_IDENTICA "%s<a href='http://identi.ca/%s'>%s</a>: " 164 #define SENDER_FORMAT_IDENTICA "%s<a href='http://identi.ca/%s'>%s</a>: "
159 #define RECIPIENT_FORMAT_JISKO "%s@<a href='http://jisko.net/%s'>%s</a>" 165 #define RECIPIENT_FORMAT_JISKO "%s@<a href='http://jisko.net/%s'>%s</a>"
160 #define SENDER_FORMAT_JISKO "%s<a href='http://jisko.net/%s'>%s</a>: " 166 #define SENDER_FORMAT_JISKO "%s<a href='http://jisko.net/%s'>%s</a>: "
167 #define RECIPIENT_FORMAT_FFEED "%s@<a href='http://friendfeed.com/%s'>%s</a>"
168 #define SENDER_FORMAT_FFEED "%s<a href='http://friendfeed.com/%s'>%s</a>: "
161 #define CHANNEL_FORMAT_WASSR "%s<a href='http://wassr.jp/channel/%s'>%s</a> " 169 #define CHANNEL_FORMAT_WASSR "%s<a href='http://wassr.jp/channel/%s'>%s</a> "
162 #define CHANNEL_FORMAT_IDENTICA "%s<a href='http://identi.ca/tag/%s'>%s</a> " 170 #define CHANNEL_FORMAT_IDENTICA "%s<a href='http://identi.ca/tag/%s'>%s</a> "
163 #define TAG_FORMAT_TWITTER "%s<a href='http://twitter.com/search?q=%%23%s'>#%s</a>" 171 #define TAG_FORMAT_TWITTER "%s<a href='http://twitter.com/search?q=%%23%s'>#%s</a>"
164 #define TAG_FORMAT_IDENTICA "#<a href='http://identi.ca/tag/%s'>%s</a>" 172 #define TAG_FORMAT_IDENTICA "#<a href='http://identi.ca/tag/%s'>%s</a>"
165 #define GROUP_FORMAT_IDENTICA "!<a href='http://identi.ca/group/%s'>%s</a>" 173 #define GROUP_FORMAT_IDENTICA "!<a href='http://identi.ca/group/%s'>%s</a>"
169 #define EMPTY "" 177 #define EMPTY ""
170 178
171 /* patterns */ 179 /* patterns */
172 #define P_RECIPIENT "(^|\\s+|[.[:^print:]])@([-A-Za-z0-9_]+)" 180 #define P_RECIPIENT "(^|\\s+|[.[:^print:]])@([-A-Za-z0-9_]+)"
173 #define P_SENDER "^(\\r?\\n?)\\s*([-A-Za-z0-9_]+)(?:\\s*\\(.+\\))?: " 181 #define P_SENDER "^(\\r?\\n?)\\s*([-A-Za-z0-9_]+)(?:\\s*\\(.+\\))?: "
182 #define P_SENDER_FFEED "^(\\r?\\n?)\\s*@[0-9]\\s*([-A-Za-z0-9_]+)\\s*(?:posted)"
174 #define P_COMMAND "^(?:\\s*)([dDfFgGlLmMnNtTwW]{1}\\s+[A-Za-z0-9_]+)(?:\\s*\\Z)" 183 #define P_COMMAND "^(?:\\s*)([dDfFgGlLmMnNtTwW]{1}\\s+[A-Za-z0-9_]+)(?:\\s*\\Z)"
175 #define P_PSEUDO "^\\s*(?:[\"#$%&'()*+,\\-./:;<=>?\\[\\\\\\]_`{|}~]|[^\\s\\x21-\\x7E])*([dDfFgGlLmMnNtTwW]{1})(?:\\Z|\\s+|[^\\x21-\\x7E]+\\Z)" 184 #define P_PSEUDO "^\\s*(?:[\"#$%&'()*+,\\-./:;<=>?\\[\\\\\\]_`{|}~]|[^\\s\\x21-\\x7E])*([dDfFgGlLmMnNtTwW]{1})(?:\\Z|\\s+|[^\\x21-\\x7E]+\\Z)"
176 #define P_USER "^.*?(?:<a .+?>)?([-A-Za-z0-9_]+)(?:</a>)?:" 185 #define P_USER "^.*?(?:<a .+?>)?([-A-Za-z0-9_]+)(?:</a>)?:"
177 #define P_CHANNEL "^(.*?(?:<a .+?>)?[-A-Za-z0-9_]+(?:</a>)?: \\r?\\n?#)([A-Za-z0-9_]+) " 186 #define P_CHANNEL "^(.*?(?:<a .+?>)?[-A-Za-z0-9_]+(?:</a>)?: \\r?\\n?#)([A-Za-z0-9_]+) "
178 #define P_TAG_TWITTER "(^|\\s+)#([-A-Za-z0-9_]+)" 187 #define P_TAG_TWITTER "(^|\\s+)#([-A-Za-z0-9_]+)"
180 #define P_GROUP_IDENTICA "!([-A-Za-z0-9_]+)" 189 #define P_GROUP_IDENTICA "!([-A-Za-z0-9_]+)"
181 #define P_IMAGE_TWITTER "<img .*=\"profile-(?:image|img)\".*src=\"(https?://.+?)\".*/>" 190 #define P_IMAGE_TWITTER "<img .*=\"profile-(?:image|img)\".*src=\"(https?://.+?)\".*/>"
182 #define P_IMAGE_WASSR "<div class=\"image\"><a href=\".+\"><img src=\"(.+)\" width=\".+?\" /></a></div>" 191 #define P_IMAGE_WASSR "<div class=\"image\"><a href=\".+\"><img src=\"(.+)\" width=\".+?\" /></a></div>"
183 #define P_IMAGE_IDENTICA "<img src=\"(https?://.+.identi.ca/.+)\" class=\"avatar profile photo\" width=\"96\" height=\"96\" alt=\"[A-Za-z0-9_]+\"/>" 192 #define P_IMAGE_IDENTICA "<img src=\"(https?://.+.identi.ca/.+)\" class=\"avatar profile photo\" width=\"96\" height=\"96\" alt=\"[A-Za-z0-9_]+\"/>"
184 #define P_IMAGE_JISKO "<img src=\"(https?://jisko.net/users/.+/img/avatar/thumb_side\\..+)\" alt=\"Avatar\" />" 193 #define P_IMAGE_JISKO "<img src=\"(https?://jisko.net/users/.+/img/avatar/thumb_side\\..+)\" alt=\"Avatar\" />"
194 #define P_IMAGE_FFEED "<img src=\"(https?://i.friendfeed.com/.+)\" alt=\""
185 #define P_SIZE_128_WASSR "\\.128\\." 195 #define P_SIZE_128_WASSR "\\.128\\."
186 #define P_EXCESS_LF "([\\r|\\n]{2,})" 196 #define P_EXCESS_LF "([\\r|\\n]{2,})"
197 #define P_TRAIL_HASH "( #\\s+$)"
187 198
188 /* twitter API specific macros */ 199 /* twitter API specific macros */
189 #define TWITTER_BASE_URL "http://twitter.com" 200 #define TWITTER_BASE_URL "http://twitter.com"
190 #define TWITTER_STATUS_GET "GET /statuses/friends_timeline.xml?count=%d HTTP/1.1\r\n" \ 201 #define TWITTER_STATUS_GET "GET /statuses/friends_timeline.xml?count=%d HTTP/1.1\r\n" \
191 "Host: twitter.com\r\n" \ 202 "Host: twitter.com\r\n" \
209 #define IDENTICA_DEFAULT_ICON_URL "http://theme.identi.ca/identica/default-avatar-profile.png" 220 #define IDENTICA_DEFAULT_ICON_URL "http://theme.identi.ca/identica/default-avatar-profile.png"
210 221
211 /* jisko specific macro */ 222 /* jisko specific macro */
212 #define JISKO_DEFAULT_ICON_URL "http://jisko.net/static/img/avatar/default_note.png" 223 #define JISKO_DEFAULT_ICON_URL "http://jisko.net/static/img/avatar/default_note.png"
213 224
225 /* ffeed specific macro */
226 #define FFEED_DEFAULT_ICON_URL "http://friendfeed.com/static/images/nomugshot-large.png"
227
214 /* size of substitution buffer */ 228 /* size of substitution buffer */
215 #define SUBST_BUF_SIZE (32 * 1024) 229 #define SUBST_BUF_SIZE (32 * 1024)
216 230
217 /* misc macros */ 231 /* misc macros */
218 #define DEFAULT_ICON_SIZE (48) 232 #define DEFAULT_ICON_SIZE (48)
219 #define DEFAULT_ICON_MAX_COUNT (50) 233 #define DEFAULT_ICON_MAX_COUNT (50)
220 #define DEFAULT_ICON_MAX_DAYS (7) 234 #define DEFAULT_ICON_MAX_DAYS (7)
221 #define DAYS_TO_SECONDS(d) ((d) * 86400) 235 #define DAYS_TO_SECONDS(d) ((d) * 86400)
222 #define NUM_REGPS (15) 236 #define NUM_REGPS (18)
223 #define NUM_SERVICES (4) /* twitter, wassr, identica, jisko. */ 237 #define NUM_SERVICES (5) /* twitter, wassr, identica, jisko, ffeed. */
224 238
225 /* debug macros */ 239 /* debug macros */
226 #define twitter_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s: %s():%4d: " fmt, __FILE__, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); 240 #define twitter_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s: %s():%4d: " fmt, __FILE__, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0);
227 #define twitter_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s: %s():%4d: " fmt, __FILE__, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); 241 #define twitter_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s: %s():%4d: " fmt, __FILE__, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0);
228 242