2009-04-20 07:52:06 +00:00
|
|
|
// vim:foldmethod=marker:syntax=lpc:noexpandtab
|
|
|
|
//
|
|
|
|
// http://localhost:33333/net/twitter/listing shows a list of friends
|
|
|
|
|
|
|
|
#include <net.h>
|
|
|
|
#include <ht/http.h>
|
|
|
|
#include <text.h>
|
|
|
|
|
|
|
|
volatile object fetcha;
|
|
|
|
volatile mixed wurst;
|
|
|
|
|
|
|
|
parse(string body) {
|
2009-04-26 11:53:18 +00:00
|
|
|
#ifndef _flag_disable_fetch_twitter_friends
|
2009-04-20 07:52:06 +00:00
|
|
|
if (!body || body == "") {
|
|
|
|
P1(("%O failed to get its listing.\n", ME))
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
rm(DATA_PATH "twitter/friends.json");
|
|
|
|
write_file(DATA_PATH "twitter/friends.json", body);
|
|
|
|
P4((body))
|
2009-04-26 11:53:18 +00:00
|
|
|
#endif
|
2009-04-20 07:52:06 +00:00
|
|
|
unless (pointerp(wurst = parse_json(body))) {
|
|
|
|
P1(("%O failed to parse its listing.\n", ME))
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#ifdef DEVELOPMENT
|
2009-04-26 11:53:18 +00:00
|
|
|
// haha.. (s)printf(): BUFF_SIZE overflowed...
|
|
|
|
//ite_file(DATA_PATH "twitter/friends.parsed", sprintf("%O\n", wurst));
|
2009-04-20 07:52:06 +00:00
|
|
|
#endif
|
|
|
|
P1(("%O sorting %O subscription names ", ME, sizeof(wurst)))
|
|
|
|
wurst = sort_array(wurst, (:
|
|
|
|
unless (mappingp($1)) return 0;
|
|
|
|
unless (mappingp($2)) return 1;
|
|
|
|
// PT(("%O got %O vs %O\n", ME, $1, $2))
|
|
|
|
P1(("."))
|
|
|
|
return lower_case($2["screen_name"] || "") >
|
|
|
|
lower_case($1["screen_name"] || "");
|
|
|
|
:) );
|
|
|
|
P1((" done!\n"))
|
|
|
|
}
|
|
|
|
|
|
|
|
htget(prot, query, headers, qs, data, noprocess) {
|
|
|
|
string nick;
|
|
|
|
mapping d; //, s;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
//sTextPath(query["layout"] || "twitter", query["lang"], "html");
|
|
|
|
localize(query["lang"], "html");
|
|
|
|
|
|
|
|
unless (pointerp(wurst)) {
|
2009-04-26 11:53:18 +00:00
|
|
|
hterror(prot, R_TEMPOVERL,
|
2009-04-20 07:52:06 +00:00
|
|
|
"Haven't successfully retrieved data yet.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
htok(prot); // outputs utf-8 header, but..
|
|
|
|
w("_HTML_listing_head_twitter");
|
|
|
|
for (i=sizeof(wurst)-1; i>=0; i--) {
|
|
|
|
d = wurst[i];
|
|
|
|
unless (mappingp(d)) {
|
|
|
|
P1(("%O got a broken entry: %O.\n", ME, d))
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
// user "foebud" has no updates ;)
|
|
|
|
//
|
|
|
|
// s = d["status"];
|
|
|
|
// unless (mappingp(s)) {
|
|
|
|
// P1(("%O got a statusless entry: %O.\n", ME, d))
|
|
|
|
// continue;
|
|
|
|
// }
|
|
|
|
unless (nick = d["screen_name"]) {
|
|
|
|
P1(("%O got a nickless tweeter.\n", ME))
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
w("_HTML_listing_item_twitter", 0, ([
|
|
|
|
// should i send text as _action?
|
|
|
|
"_nick": nick,
|
|
|
|
"_amount_updates": d["statuses_count"],
|
|
|
|
// _count_subscribers seems to be better for this
|
|
|
|
// or should it be _recipients? _targets?
|
|
|
|
"_amount_followers": d["followers_count"],
|
|
|
|
"_amount_sources": d["friends_count"],
|
|
|
|
// shows how old listing is.. hmm
|
|
|
|
//"_description_update": s["text"] || "",
|
|
|
|
"_color": "#"+ d["profile_sidebar_fill_color"],
|
|
|
|
"_description": d["description"] || "",
|
|
|
|
"_uniform_context": SERVER_UNIFORM +"@"+ nick,
|
|
|
|
"_page": d["url"] || "",
|
|
|
|
"_name": d["name"] || "",
|
|
|
|
// "_contact_twitter": d["id"],
|
|
|
|
"_reference_reply": d["in_reply_to_screen_name"],
|
|
|
|
// "_twit": d["id"],
|
|
|
|
"_uniform_photo": d["profile_image_url"] || "",
|
|
|
|
"_uniform_photo_background":
|
|
|
|
d["profile_background_image_url"] || ""
|
|
|
|
]));
|
|
|
|
}
|
|
|
|
w("_HTML_listing_tail_twitter");
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-04-26 11:53:18 +00:00
|
|
|
#ifndef _flag_disable_fetch_twitter_friends
|
2009-04-20 07:52:06 +00:00
|
|
|
fetch() {
|
|
|
|
fetcha -> content( #'parse, 0, 1 );
|
|
|
|
fetcha -> fetch("http://twitter.com/statuses/friends.json?count=200");
|
|
|
|
}
|
2009-04-26 11:53:18 +00:00
|
|
|
#endif
|
2009-04-20 07:52:06 +00:00
|
|
|
|
|
|
|
create() {
|
2009-04-26 11:53:18 +00:00
|
|
|
#ifdef _flag_disable_fetch_twitter_friends
|
|
|
|
string body = read_file(DATA_PATH "twitter/friends.json");
|
|
|
|
if (body) return parse(body);
|
|
|
|
P1(("\nNo twitter/friends.json found. %O disabled.\n", ME))
|
|
|
|
destruct(ME);
|
|
|
|
#else
|
2009-04-20 07:52:06 +00:00
|
|
|
mapping config;
|
|
|
|
object o = find_object(CONFIG_PATH "config");
|
|
|
|
|
|
|
|
if (o) config = o->qConfig();
|
|
|
|
if (!config) {
|
|
|
|
P1(("\nNo configuration for twitter gateway found in %O.\n", o))
|
|
|
|
//destruct(ME);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
// we could even choose to inherit this instead...
|
|
|
|
fetcha = clone_object(NET_PATH "http/fetch");
|
|
|
|
//fetcha -> sAgent(SERVER_VERSION " builtin Twitter to PSYC gateway");
|
|
|
|
fetcha -> sAuth(config["nickname"], config["password"]);
|
|
|
|
call_out( #'fetch, 14 );
|
2009-04-26 11:53:18 +00:00
|
|
|
#endif
|
2009-04-20 07:52:06 +00:00
|
|
|
}
|
|
|
|
|