diff options
author | snaka | 2009-06-03 19:09:31 +0000 |
---|---|---|
committer | snaka | 2009-06-03 19:09:31 +0000 |
commit | 028b1e00f3341125d5fa0be194fc00c0e126ed4b (patch) | |
tree | 8256775aa110f580aeb304b5b5f59a7004bf6f75 /hatebuWatchDog.js | |
parent | db3faaa72c2b8cb1681246ad7542694b7ed25476 (diff) | |
download | vimperator-plugins-028b1e00f3341125d5fa0be194fc00c0e126ed4b.tar.bz2 |
- リファクタリング
- メッセージの日本語化
- 非同期化
- 複数サイトのwatchに対応
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@33773 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'hatebuWatchDog.js')
-rw-r--r-- | hatebuWatchDog.js | 163 |
1 files changed, 102 insertions, 61 deletions
diff --git a/hatebuWatchDog.js b/hatebuWatchDog.js index 1b8ee0f..d3df64b 100644 --- a/hatebuWatchDog.js +++ b/hatebuWatchDog.js @@ -1,104 +1,145 @@ // // hatebuWatchDog.js - hatena bookmark watch dog - // -plugins.hatebuWatchDog = {}; + +// Clear all watchers if started watcher exists. +if (plugins.hatebuWatchDog && plugins.hatebuWatchDog.stopWatching) + plugins.hatebuWatchDog.stopWatching(); + plugins.hatebuWatchDog = (function() { - // for DEVELOPMENT - //liberator.globalVariables.hatebuWatchDogTarget = 'http://d.hatena.ne.jp/snaka72/'; - //liberator.globalVariables.hatebuWatchDogWatchAlways = 'true'; + const libly = plugins.libly; let previousValue = 0; + let tasks = []; - function watch() { - let libly = plugins.libly; - if (target() == '') { - liberator.echoerr("Please set g:hatebeWatchDogTarget before watch()."); - return; - } - // build hatebu xml-rpc request - let requestBody = ( - <methodCall> - <methodName>bookmark.getTotalCount</methodName> - <params> - <param><value><string>{target()}</string></value></param> - </params> - </methodCall> - ).toXMLString(); + function addTask(target) { + liberator.echo(target.site); + const MINUTE = 60; // sec. + interval = getInterval() || (10 * MINUTE); // default 10 min. + interval = Math.max(interval, MINUTE); // lower limt is 1 min. + + // initialize previous value + target.previousValue = 0; + + tasks.push(setInterval(watch, 1000 * interval, target)); + liberator.dump({target: target, interval: interval}); + } + + function clearAllTasks() { + tasks.forEach(function(task) { + clearInterval(task); + }); + tasks = []; + liberator.dump("watch dog is sleeping..."); + } + + function watch(target) { + getCurrentValue( + target.site, + function(currentValue) { + let delta = currentValue - target.previousValue; + if (delta || notifyAlways()) { + showHatebuNotification(target, currentValue, delta); + } + target.previousValue = currentValue; + }, + function() { + liberator.echoerr("Cannot get current value."); + } + ); + } + function getCurrentValue(target, onSuccess, onFailure) { + // build hatebu xml-rpc request let req = new libly.Request( 'http://b.hatena.ne.jp/xmlrpc', { 'Content-Type' : 'text/xml' },{ - asynchronous: false, - postBody : requestBody + postBody : <methodCall> + <methodName>bookmark.getTotalCount</methodName> + <params> + <param><value><string>{target}</string></value></param> + </params> + </methodCall>.toXMLString() } ); let currentValue; - let resXml; req.addEventListener("onSuccess", function(data) { liberator.log("XML-RPC request was succeeded."); - resXml = new XML(data.responseText.replace(/^<\?xml version[^>]+?>/, '')); + let resXml = new XML(data.responseText.replace(/^<\?xml version[^>]+?>/, '')); currentValue = window.eval(resXml..int.toString()); + onSuccess(currentValue); }); req.addEventListener("onFailure", function(data) { - liberator.echoerr("Cannot remove pin"); + onFailure(); }); - liberator.log("reauest..."); req.post(); liberator.log("done..."); - - let isDifferent = currentValue != previousValue; - if (isDifferent || watchAlways()) - growl('Your hatebu count became ... ' + currentValue); - - return { - isDifferent : isDifferent, - count: isDifferent ? (previousValue = currentValue) - : previousValue - }; } - function target() - liberator.globalVariables.hatebuWatchDogTarget || ''; - - function watchAlways() + function notifyAlways() window.eval(liberator.globalVariables.hatebuWatchDogAlways) || false; - function getInterval() - window.eval(liberator.globalVariables.hatebuWatchDogInterval) || 600; // default : 10 min. + function showHatebuNotification(target, currentValue, delta) { + let title = delta > 0 ? "\u304A\u3081\u3067\u3068\u3046\u3054\u3056\u3044\u307E\u3059" // good news + :(delta < 0 ? "\u6B8B\u5FF5\u306A\u304A\u77E5\u3089\u305B" // bad news + : "\u304A\u77E5\u3089\u305B"); + let suffix = delta != 0 ? "\u306B\u306A\u308A\u307E\u3057\u305F\u3002" + : "\u3067\u3059\u3002"; + let message = "'" + target + "' \u306E\u88AB\u306F\u3066\u30D6\u6570\u306F '" + + currentValue + "' " + suffix + " (" + getSignedNum(delta) + ")"; - function growl(message) { + showAlertNotification(null, title, message); + } + + function showAlertNotification(icon, title, message) { Cc['@mozilla.org/alerts-service;1'] .getService(Ci.nsIAlertsService) .showAlertNotification( - null, //'chrome://mozapps/skin/downloads/downloadIcon.png', - "From hatebuWatchDog", + icon, //'chrome://mozapps/skin/downloads/downloadIcon.png', + title, message ); } - var watchInterval; - function setWatchInterval(interval) { - interval = interval || 600; - interval = interval < 60 ? 60 : interval; - - // Clear interval while plugin reloaded. - if (watchInterval) { - clearInterval(watchInterval); - liberator.echo("timer reset!"); - } - watchInterval = setInterval(function() watch(), 1000 * interval); + function getSignedNum(num) { + if (num > 0) return "+" + num; + if (num < 0) return "-" + Math.abs(num); + return "0"; } - // Run immediatly - setWatchInterval(getInterval()); + function getInterval() + window.eval(liberator.globalVariables.hatebuWatchDogInterval) || 600; // default : 10 min. return { - watch : watch, - target: target, - interval : setWatchInterval - } + interval getter: function() getInterval(), + addTask : addTask, + stopWatching : clearAllTasks + //previous setter: function(val) previousValue = val, + //previous getter: function() previousValue + }; })(); + +// Awaking the watch dog. +let (targets, self = plugins.hatebuWatchDog) { + try { + targets = window.eval(liberator.globalVariables.hatebuWatchDogTargets); + } catch(e) { + targets = liberator.globalVariables.hatebuWatchDogTargets; + } + if (targets) { + if (!(targets instanceof Array)) + targets = [targets]; + targets.forEach(function(target) { + self.addTask({site : target}); + }); + } + else { + liberator.echoerr("Please set g:hatebeWatchDogTargets before watch()."); + } +} + +liberator.dump("Watch dog is awaking ..."); |