-
-
Save kazkicks/32967 to your computer and use it in GitHub Desktop.
mytwitter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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