diff options
author | anekos | 2009-10-23 10:17:29 +0000 |
---|---|---|
committer | anekos | 2009-10-23 10:17:29 +0000 |
commit | 77287ec57eb4b00082c0e1936a741756d25a5f34 (patch) | |
tree | 9be53604a3483c75c52a605d79504e6eff057489 /twitter.js | |
parent | 897af6f3b96d21d3f271785b7bb7817175b49de0 (diff) | |
download | vimperator-plugins-77287ec57eb4b00082c0e1936a741756d25a5f34.tar.bz2 |
返信補完時に自動的に status を取得しに行くようにした
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@35694 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'twitter.js')
-rw-r--r-- | twitter.js | 106 |
1 files changed, 77 insertions, 29 deletions
@@ -22,7 +22,7 @@ let PLUGIN_INFO = <VimperatorPlugin> <name>{NAME}</name> <description>The script allows you to update Twitter status from Vimperator</description> -<version>1.1.1</version> +<version>1.2.0</version> <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/twitter.js</updateURL> <author>Trapezoid</author> <license>Creative Commons</license> @@ -48,6 +48,10 @@ let PLUGIN_INFO = liberator.modules.twitter = (function(){ var statuses = null; + var expiredStatus = false; + var autoStatusUpdate = !!parseInt(liberator.globalVariables.twitter_auto_status_update || 0); + var statusValidDuration = parseInt(liberator.globalVariables.twitter_status_valid_duration || 90); + var statusRefreshTimer; var passwordManager = Cc["@mozilla.org/login-manager;1"].getService(Ci.nsILoginManager); var evalFunc = window.eval; try { @@ -136,15 +140,40 @@ liberator.modules.twitter = (function(){ //liberator.log(html); liberator.echo(html, true); } - function showFollowersStatus(username, password, target){ + function getFollowersStatus(username, password, target, onComplete){ // for debug //target = "otsune" + function setRefresher(){ + expiredStatus = false; + if (statusRefreshTimer) + clearTimeout(statusRefreshTimer); + statusRefreshTimer = setTimeout(function () expiredStatus = true, statusValidDuration * 1000); + } + var xhr = new XMLHttpRequest(); var endPoint = target ? "https://twitter.com/statuses/user_timeline/" + target + ".json" : "https://twitter.com/statuses/friends_timeline.json"; - xhr.open("GET", endPoint, false, username, password); + xhr.open("GET", endPoint, onComplete, username, password); + liberator.log('get!'); + if (onComplete) { + xhr.onreadystatechange = function () { + if (xhr.readyState == 4 && xhr.status == 200) { + liberator.log('got!'); + setRefresher(); + onComplete(statuses = evalFunc(xhr.responseText) || []); + } + } + } xhr.send(null); + if (onComplete) + return; + setRefresher(); statuses = evalFunc(xhr.responseText) || []; + } + function showFollowersStatus(username, password, target){ + // for debug + //target = "otsune" + getFollowersStatus.apply(null, arguments); var html = <style type="text/css"><![CDATA[ span.twitter.entry-content a { text-decoration: none; } @@ -166,7 +195,7 @@ liberator.modules.twitter = (function(){ //liberator.log(html); liberator.echo(html, true); } - function detectLink(str) { + function detectLink(str){ let m = str.match(/https?:\/\/\S+/); if (m) { let left = str.substr(0, m.index); @@ -176,6 +205,19 @@ liberator.modules.twitter = (function(){ } return str; } + function getAccount(){ + try { + var logins = passwordManager.findLogins({}, "http://twitter.com", "https://twitter.com", null); + if (logins.length) + return [logins[0].username, logins[0].password]; + else + throw "Twitter: account not found"; + } + catch (ex){ + liberator.echoerr(ex); + } + + } function showTwitterSearchResult(word){ var xhr = new XMLHttpRequest(); xhr.open("GET", "http://search.twitter.com/search.json?q=" + encodeURIComponent(word), false); @@ -205,19 +247,7 @@ liberator.modules.twitter = (function(){ liberator.modules.commands.addUserCommand(["twitter"], "Change Twitter status", function(arg){ var special = arg.bang; - var password; - var username; - try { - var logins = passwordManager.findLogins({}, "http://twitter.com", "https://twitter.com", null); - if (logins.length) - [username, password] = [logins[0].username, logins[0].password]; - else - throw "Twitter: account not found"; - } - catch (ex){ - liberator.echoerr(ex); - } - + var [username, password] = getAccount(); arg = arg.string.replace(/%URL%/g, liberator.modules.buffer.URL) .replace(/%TITLE%/g, liberator.modules.buffer.title); @@ -240,24 +270,42 @@ liberator.modules.twitter = (function(){ },{ bang: true, literal: 0, - completer: function(context, args){ - if (!statuses) return; + completer: let (getting, targetContext) function(context, args){ + function compl(){ + if (args.bang) + list = statuses.map(function(s) ["@" + s.user.screen_name, s.text]); + else + list = statuses.map(function(s) ["@" + s.user.screen_name+ "#" + s.id + " ", s.text]); + + if (target){ + list = list.filter(function($_) $_[0].indexOf(target) >= 0); + } + targetContext.completions = list; + targetContext.incomplete = false; + targetContext = getting = null; + } + var matches= context.filter.match(/^@(\w*)$/); if (!matches) return; var list = []; var target = matches[1]; + var doGet = (expiredStatus || !(statuses && statuses.length)) && autoStatusUpdate; context.title = ["ID","Entry"]; - if (args.bang) - list = statuses.map(function(s) ["@" + s.user.screen_name, s.text]); - else - list = statuses.map(function(s) ["@" + s.user.screen_name+ "#" + s.id + " ", s.text]); - - if (target){ - list = list.filter(function($_) $_[0].indexOf(target) >= 0); + context.incomplete = doGet; + context.hasitems = !doGet; + targetContext = context; + if (doGet) { + if (!getting) { + getting = true; + var [username, password] = getAccount(); + getFollowersStatus(username, password, null, compl); + } + } else { + compl(); } - context.completions = list; - }, - } + } + }, + true ); let self = { get statuses(){ |