aboutsummaryrefslogtreecommitdiffstats
path: root/hatebuWatchDog.js
diff options
context:
space:
mode:
authorsnaka2009-06-03 19:09:31 +0000
committersnaka2009-06-03 19:09:31 +0000
commit028b1e00f3341125d5fa0be194fc00c0e126ed4b (patch)
tree8256775aa110f580aeb304b5b5f59a7004bf6f75 /hatebuWatchDog.js
parentdb3faaa72c2b8cb1681246ad7542694b7ed25476 (diff)
downloadvimperator-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.js163
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 ...");