Skip to content

Instantly share code, notes, and snippets.

@kazkicks
Created December 6, 2008 21:27
Show Gist options
  • Save kazkicks/32967 to your computer and use it in GitHub Desktop.
Save kazkicks/32967 to your computer and use it in GitHub Desktop.
mytwitter
// max of 140 chars is recommended, but it really allows 160
const TWITTER_STATUS_MAXLEN = 160;
var noun_mytwitter_options = new CmdUtils.NounType( "options",
["fav",
"reply",
"follower",
"following",
"search",
"src"]);
CmdUtils.CreateCommand({
icon: "http://twitter.com/favicon.ico",
name: "mytwitter",
homepage: "http://d.hatena.ne.jp/kazukiz/",
author: {name: "kazkicks"},
takes: {"-fav -reply -follower -following -search -src >page $b @@": noun_arb_text},
modifiers: {"-": noun_mytwitter_options},
license: "GPL",
description: "twitter",
preview: function(pblock, directObject, modifiers){
var text = directObject.text;
var status = "";
if (text.match(/^(?:-[a-z]+)? ?(?:>[0-9]+)? ?(.+)/)) {
status = RegExp.$1;
}
var window = CmdUtils.getWindow();
var doc = window.document;
status = status.replace("$b", doc.title +" " +doc.location);
// check status
var previewTemplate = '<div style="color:font-size:11px">${status}<span style="font-size:12px;color:gray">(remaining:${chars})</span></div>';
var previewData = {
status: status,
chars: TWITTER_STATUS_MAXLEN - status.length
};
var previewHTML = CmdUtils.renderTemplate(previewTemplate,
previewData);
// display timeline
var page = 1;
if (text.match(/>([0-9]+)/)) {
page = RegExp.$1;
}
var disp_num = 5;
var api_page = 1;
var start_index = 0;
//self
if (text.match(/^@@/)) {
jQuery.get("http://twitter.com/statuses/user_timeline.json", {count:disp_num, page:page}, parse_timeline, "json");
return;
}
//user_timeline
else if (text.match(/^@([a-z0-9_]+)/i)) {
var id = RegExp.$1;
jQuery.get("http://twitter.com/statuses/user_timeline.json", {count:disp_num, page:page,id:id}, parse_timeline, "json");
return;
}
else if (text.match(/^-fav/) || modifiers["-"].text == "fav") {
api_page = (disp_num * (page - 1)) / 20 + 1;
start_index = (disp_num * (page - 1)) % 20;
jQuery.get("http://twitter.com/favorites.json", {page:api_page}, parse_timeline, "json");
}
else if (text.match(/^-rep/) || modifiers["-"].text == "reply") {
api_page = (disp_num * (page - 1)) / 20 + 1;
start_index = (disp_num * (page - 1)) % 20;
jQuery.get("http://twitter.com/replies.json", {page:api_page}, parse_timeline, "json");
}
else if (text.match(/^-following/) || modifiers["-"].text == "following") {
api_page = (disp_num * (page - 1)) / 100 + 1;
start_index = (disp_num * (page - 1)) % 100;
jQuery.get("http://twitter.com/statuses/friends.json", {page:api_page}, parse_users, "json");
}
else if (text.match(/^-follower/) || modifiers["-"].text == "follower") {
api_page = (disp_num * (page - 1)) / 100 + 1;
start_index = (disp_num * (page - 1)) % 100;
jQuery.get("http://twitter.com/statuses/followers.json", {page:api_page}, parse_users, "json");
}
else if (text.match(/^-search\b([^>]+)/) || (modifiers["-"].text == "search" && text.match(/^([^>]+)/))) {
var query = RegExp.$1;
if (query.length > 0) {
jQuery.get("http://search.twitter.com/search.json", {rpp:disp_num, page:page, q:query}, parse_result, "json");
}
}
else if (text.match(/^-src/) || modifiers["-"].text == "src") {
jQuery.get("http://twitter.com/statuses/friends_timeline.xml", {count:200}, parse_src, "xml");
}
//friend_timeline
else {
jQuery.get("http://twitter.com/statuses/friends_timeline.json", {count:disp_num, page:page}, parse_timeline, "json");
}
function parse_src(xml) {
jQuery.get("http://elazyrest.net/pochitt/wm/twitter_stat.xsl", null,
function(xsl) {
try {
var xsltProcessor = new window.XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
var srcDoc = xsltProcessor.transformToDocument(xml, doc);
var charturl = "http://chart.apis.google.com/chart?chs=480x120&cht=p3&";
var previewHTML = "";
var chls = [];
var chds = [];
jQuery("source", srcDoc).slice(0, 10).each(function(index, source) {
var sourceName = jQuery("name", source).text();
var count = jQuery("count", source).text();
previewHTML += "<div style=\"font-size:11px\"><span style=\"color:#3399CC\">" +sourceName +"</span> " +count/2+"%</div>";
if (index < 7) {
if (sourceName.match(/<a href=[^>]+>(.+)<\/a>/)) {
chls[index] = RegExp.$1 + "(" +(count/2) +"%)";
}
else {
chls[index] = sourceName + "(" +(count/2) +"%)";
}
chds[index] = (count/2);
}
});
charturl += 'chl=' +chls.join("|") +'&chd=t:'+ chds.join(",");
pblock.innerHTML = "<div style=\"font-size:11px\">タイムライン上の人気クライアント(最新200件中)</div><div><img src=\"" +encodeURI(charturl) +"\"/></div>" +previewHTML;
// pblock.appendChild(fragment);
// pblock.innerHTML = pblock.innerHTML;
}
catch (e) {
CmdUtils.log(e);
}
}, "xml");
}
function parse_result(data) {
var prevTemplate = '<div style="font-size:11px">{for result in results}<div><table><tr><td><img src="${result.profile_image_url}" style="width:30px;height:30px"/></td><td><span style="color:#FFFF33"><a href="http://twitter.com/${result.from_user}">${result.from_user}</a></span><br/>${result.text}</td></tr></table></div>{/for}</div>';
pblock.innerHTML = CmdUtils.renderTemplate(prevTemplate, data);
}
function parse_timeline(data) {
var prevTemplate = '<div style="font-size:11px">{for status in statuses}<div><table><tr><td><img src="${status.user.profile_image_url}" style="width:30px;height:30px"/></td><td><span style="color:#FFFF33"><a href="http://twitter.com/${status.user.screen_name}">${status.user.screen_name}</a></span><br/>${status.text}</td></tr></table></div>{/for}</div>';
pblock.innerHTML = previewHTML + CmdUtils.renderTemplate(prevTemplate, {statuses:data.splice(start_index, disp_num)});
}
function parse_users(data) {
var prevTemplate = '<div style="font-size:11px">{for user in users}<div><table><tr><td><img src="${user.profile_image_url}" style="width:30px;height:30px"/></td><td><span style="color:#FFFF33"><a href="http://twitter.com/${user.screen_name}">${user.screen_name}(${user.name})</a></span><br/>${user.description}</td></tr></table></div>{/for}</div>';
pblock.innerHTML = previewHTML + CmdUtils.renderTemplate(prevTemplate, {users:data.splice(start_index, disp_num)});
}
},
execute: function(directObject) {
var text = directObject.text;
var status = "";
if (text.match(/^(?:-[a-z]+)? ?(?:>[0-9]+)? ?(.+)/)) {
status = RegExp.$1;
}
if(status.length < 1) {
displayMessage("Twitter requires a status to be entered");
return;
}
var doc = CmdUtils.getDocument();
status = status.replace("$b", doc.title +" " +doc.location);
var updateUrl = "https://twitter.com/statuses/update.json";
var updateParams = {
source: "ubiquity",
status: status
};
jQuery.ajax({
type: "POST",
url: updateUrl,
data: updateParams,
dataType: "json",
error: function() {
displayMessage("Twitter error - status not updated");
},
success: function() {
displayMessage("Twitter status updated");
}
});
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment