aboutsummaryrefslogtreecommitdiffstats
path: root/notifier.js
diff options
context:
space:
mode:
authorsuVene2009-01-09 14:22:16 +0000
committersuVene2009-01-09 14:22:16 +0000
commit0e1e785c0a20896fe23cad14c0b676d70280f51c (patch)
treef6644fe2126712cb7ac7434d542d71ad59dac880 /notifier.js
parent5e7835783ced42ba4e3a580abef4c09a613eb2d2 (diff)
downloadvimperator-plugins-0e1e785c0a20896fe23cad14c0b676d70280f51c.tar.bz2
* cosmetic changes.
* SubjectHttp#diff return parsed. * subject_weather_yahoo ajust next time. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@28211 d0d07461-0603-4401-acd4-de1884942a52
Diffstat (limited to 'notifier.js')
-rw-r--r--notifier.js660
1 files changed, 330 insertions, 330 deletions
diff --git a/notifier.js b/notifier.js
index d231b3f..2e6a2d2 100644
--- a/notifier.js
+++ b/notifier.js
@@ -1,33 +1,33 @@
/*** BEGIN LICENSE BLOCK {{{
- Copyright (c) 2008 suVene<suvene@zeromemory.info>
+ Copyright (c) 2008 suVene<suvene@zeromemory.info>
- distributable under the terms of an MIT-style license.
- http://www.opensource.jp/licenses/mit-license.html
+ distributable under the terms of an MIT-style license.
+ http://www.opensource.jp/licenses/mit-license.html
}}} END LICENSE BLOCK ***/
// PLUGIN_INFO//{{{
var PLUGIN_INFO =
<VimperatorPlugin>
- <name>{NAME}</name>
- <description>change notice framework.</description>
- <description lang="ja">変更通知フレームワーク。</description>
- <author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
- <version>0.1.6</version>
- <license>MIT</license>
- <minVersion>2.0pre</minVersion>
- <maxVersion>2.0pre</maxVersion>
- <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/notifier.js</updateURL>
- <detail><![CDATA[
+ <name>{NAME}</name>
+ <description>change notice framework.</description>
+ <description lang="ja">変更通知フレームワーク。</description>
+ <author mail="suvene@zeromemory.info" homepage="http://zeromemory.sblo.jp/">suVene</author>
+ <version>0.1.7</version>
+ <license>MIT</license>
+ <minVersion>2.0pre</minVersion>
+ <maxVersion>2.0pre</maxVersion>
+ <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/notifier.js</updateURL>
+ <detail><![CDATA[
== Needs Library ==
- _libly.js(ver.0.1.9)
@see http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/_libly.js
== Commands ==
:notifierstart:
- 変更通知をスタートします。
+ 変更通知をスタートします。
:notifierrestart:
- 変更通知をリスタートします。
+ 変更通知をリスタートします。
:notifierstop:
- 変更通知をストップします。
+ 変更通知をストップします。
== Observer ==
=== 概要 ===
@@ -36,28 +36,28 @@ Subject からの Message オブジェクトを解析し、何らかの動作を
Observer ⇒ Subject への依存は高くて OK です。
=== 命名規約 ===
-prefix に 'observer_' を付け、'rumtimepath/plugin/notifier' の下にインストールして下さい。
-e.g.)'${rumtimepath}/notifier/observer_XXX.js'
+prefix に "observer_" を付け、"rumtimepath/plugin/notifier" の下にインストールして下さい。
+e.g.)"${rumtimepath}/notifier/observer_XXX.js"
=== 登録方法 ===
liberator.plugins.notifier.observer.register(baseClass, extendsMethods)
baseClass:
- 基底クラスとなります。現在以下の基底クラスが存在します。
- - liberator.plugins.notifier.Observer
+ 基底クラスとなります。現在以下の基底クラスが存在します。
+ - liberator.plugins.notifier.Observer
extendsMethosd:
- 基底クラスの拡張となるメソッドをハッシュ形式で渡します。
- 実装するメソッドは基底クラスのルールに従って下さい。
+ 基底クラスの拡張となるメソッドをハッシュ形式で渡します。
+ 実装するメソッドは基底クラスのルールに従って下さい。
=== 基底クラスの説明 ===
==== librator.plugins.notifier.Observer ====
Observerの基本クラスです。
initialize():
- 必要の無い場合、実装しなくても OK です。
- インスタンス生成時に1度だけフレームワークによって呼び出されます。
- 初期化処理など必要な処理を実装して下さい。
+ 必要の無い場合、実装しなくても OK です。
+ インスタンス生成時に1度だけフレームワークによって呼び出されます。
+ 初期化処理など必要な処理を実装して下さい。
update(liberator.plugins.notifier.Message):
- 必ず実装して下さい。
- Subject からの変更通知がなされた場合、引数 Message と共にフレームワークより呼び出されます。
+ 必ず実装して下さい。
+ Subject からの変更通知がなされた場合、引数 Message と共にフレームワークより呼び出されます。
== Subject ==
=== 概要 ===
@@ -66,347 +66,347 @@ update(liberator.plugins.notifier.Message):
(Message の解析の役割は Observer にある)
=== 命名規約 ===
-prefix に 'subject_' を付け、'rumtimepath/plugin/notifier' の下にインストールして下さい。
-e.g.)'${rumtimepath}/notifier/subject_XXX.js'
+prefix に "subject_" を付け、"rumtimepath/plugin/notifier" の下にインストールして下さい。
+e.g.)"${rumtimepath}/notifier/subject_XXX.js"
=== 登録方法 ===
liberator.plugins.notifier.subject.register(baseClass, extendsMethods)
baseClass:
- 基底クラスとなります。現在以下の基底クラスが存在します。
- - liberator.plugins.notifier.Subject
- - liberator.plugins.notifier.SubjectHttp
+ 基底クラスとなります。現在以下の基底クラスが存在します。
+ - liberator.plugins.notifier.Subject
+ - liberator.plugins.notifier.SubjectHttp
extendsMethosd:
- 基底クラスへの拡張をハッシュ形式で渡します。
+ 基底クラスへの拡張をハッシュ形式で渡します。
=== 基底クラスの説明 ===
==== librator.plugins.notifier.Subject ====
Subject の基本クラスです。
interval:
- 秒で変更チェックするインターバルを指定します。デフォルトは 60 です。
+ 秒で変更チェックするインターバルを指定します。デフォルトは 60 です。
initialize():
- 必要の無い場合、実装しなくても OK です。
- インスタンス生成時に1度だけフレームワークによって呼び出されます。
- 初期化処理など必要な処理を実装して下さい。
+ 必要の無い場合、実装しなくても OK です。
+ インスタンス生成時に1度だけフレームワークによって呼び出されます。
+ 初期化処理など必要な処理を実装して下さい。
check():
- 必ず実装して下さい。
- 指定したインターバルごとにフレームワークによって呼び出されます。
- 変更を検知した場合、liberator.plugins.notifier.Message のインスタンスを引数に
- this.notify(message) を呼び出してください。
+ 必ず実装して下さい。
+ 指定したインターバルごとにフレームワークによって呼び出されます。
+ 変更を検知した場合、liberator.plugins.notifier.Message のインスタンスを引数に
+ this.notify(message) を呼び出してください。
shutdown():
- 必要の無い場合、実装しなくても OK です。
- 変更通知フレームワークの終了時に呼ばれます。
+ 必要の無い場合、実装しなくても OK です。
+ 変更通知フレームワークの終了時に呼ばれます。
==== librator.plugins.notifier.SubjectHttp ====
Httpを利用した変更検知の基底クラスです。
リクエスト内容をキャッシュします。
interval:
- 秒で変更チェックするインターバルを指定します。デフォルトは 60 です。
+ 秒で変更チェックするインターバルを指定します。デフォルトは 60 です。
options{}:
- url:
- URL を指定します。
- headers{}:
- リクエストに header が必要な場合ハッシュで指定します。
- extra{}:
- リクエストのオプションです。ハッシュで指定します。
- 以下の key が有効です。
- asynchronous (false), encoding(default utf-8)
+ url:
+ URL を指定します。
+ headers{}:
+ リクエストに header が必要な場合ハッシュで指定します。
+ extra{}:
+ リクエストのオプションです。ハッシュで指定します。
+ 以下の key が有効です。
+ asynchronous (false), encoding(default utf-8)
parse(liberator.pluginsnotifier.Request):
- 必ず実装して下さい。
- リクエストを解析した結果を返却して下さい。
+ 必ず実装して下さい。
+ リクエストを解析した結果を返却して下さい。
diff(cache, parsed):
- 必要の無い場合、実装しなくても OK です。
- デフォルトの実装は cache を返却します。
- this.parse() による解析結果と、そのキャッシュとの差分を抽出して返却して下さい。
+ 必要の無い場合、実装しなくても OK です。
+ デフォルトの実装は cache を返却します。
+ this.parse() による解析結果と、そのキャッシュとの差分を抽出して返却して下さい。
buildMessages(diff):
- 必ず実装して下さい。
- this.diff() により抽出されたオブジェクトを元に、liberator.plugins.notifier.Message のインスタンス、
- または、その配列を返却して下さい。
- ]]></detail>
+ 必ず実装して下さい。
+ this.diff() により抽出されたオブジェクトを元に、liberator.plugins.notifier.Message のインスタンス、
+ または、その配列を返却して下さい。
+ ]]></detail>
</VimperatorPlugin>;
//}}}
(function() {
if (!liberator.plugins.libly) {
- liberator.log('notifier: needs _libly.js');
- return;
+ liberator.log("notifier: needs _libly.js");
+ return;
}
if (liberator.plugins.notifier && liberator.plugins.notifier._self) {
- liberator.plugins.notifier._self.stop(function() { liberator.plugins.notifier._self = bootstrap(); });
+ liberator.plugins.notifier._self.stop(function() { liberator.plugins.notifier._self = bootstrap(); });
} else {
- liberator.plugins.notifier = {};
- liberator.plugins.notifier._self = bootstrap();
+ liberator.plugins.notifier = {};
+ liberator.plugins.notifier._self = bootstrap();
}
function bootstrap() {
- var libly = liberator.plugins.libly;
- var $U = libly.$U;
- var logger = $U.getLogger('notifier');
-
- var Loader = function() {//{{{
- this.initialize.apply(this, arguments);
- };
- Loader.prototype = {
- initialize: function(name) {
- liberator.plugins.notifier[name] = this;
- this.name = name;
- this.plugins = [];
- this.load(name);
- },
- load: function(name) {
- io.getRuntimeDirectories('plugin/notifier').forEach(function(dir) {
- $U.readDirectory(io.expandPath(dir.path), '^' + name + '_', function(f) {
- try {
- io.source(f.path, true)
- logger.log('plugin load success: ' + f.leafName);
- } catch (e) {
- logger.log('plugin load failed: ' + f.leafName);
- }
- });
- });
- },
- register: function(baseClass, pluginExtends) {
- this.plugins.push(new baseClass(pluginExtends));
- },
- unregister: function(plugin) {
- var ret = [];
- this.plugins.forEach(function(p) { if (p != plugin) ret.push(p); });
- this.plugins = ret;
- },
- getPlugins: function() {
- return this.plugins;
+ var libly = liberator.plugins.libly;
+ var $U = libly.$U;
+ var logger = $U.getLogger("notifier");
+
+ var Loader = function() {//{{{
+ this.initialize.apply(this, arguments);
+ };
+ Loader.prototype = {
+ initialize: function(name) {
+ liberator.plugins.notifier[name] = this;
+ this.name = name;
+ this.plugins = [];
+ this.load(name);
+ },
+ load: function(name) {
+ io.getRuntimeDirectories("plugin/notifier").forEach(function(dir) {
+ $U.readDirectory(io.expandPath(dir.path), "^" + name + "_", function(f) {
+ try {
+ io.source(f.path, true)
+ logger.log("plugin load success: " + f.leafName);
+ } catch (e) {
+ logger.log("plugin load failed: " + f.leafName);
+ }
+ });
+ });
+ },
+ register: function(baseClass, pluginExtends) {
+ this.plugins.push(new baseClass(pluginExtends));
+ },
+ unregister: function(plugin) {
+ var ret = [];
+ this.plugins.forEach(function(p) { if (p != plugin) ret.push(p); });
+ this.plugins = ret;
+ },
+ getPlugins: function() {
+ return this.plugins;
+ }
+ };
+ //}}}
+
+ var Message = function() {//{{{
+ this.initialize.apply(this, arguments);
+ };
+ Message.prototype = {
+ initialize: function(title, message, link, options) {
+ try {
+ if (typeof title == "undefined" || title == null) throw "title is undefined.";
+ if (typeof message == "undefined" || message == null) throw "message is undefined.";
+ this.title = title;
+ this.message = message;
+ this.link = link;
+ this.options = options;
+ } catch (e) {
+ logger.log("Message.initialize error: " + e);
+ throw e;
+ }
+ }
+ };//}}}
+
+ var Observer = function() {//{{{
+ this.__initialize__.apply(this, arguments);
+ };
+ Observer.prototype = {
+ __initialize__: function(args) {
+ $U.extend(this, args);
+ if (typeof this.initialize == "function") this.initialize();
+ },
+ shutdown: function() {}
+ };//}}}
+
+ var Subject = function() {//{{{
+ this.__initialize__.apply(this, arguments);
+ };
+ Subject.prototype = {
+ __initialize__: function(args) {
+ this.isActive = false;
+ this.observers = [];
+ this.interval = 60;
+ this.__nextTime = new Date();
+ $U.extend(this, args);
+ if (typeof this.initialize == "function") this.initialize();
+ },
+ attach: function(observer) {
+ this.observers.push(observer);
+ },
+ notify: function(message) {
+ if (!message) return;
+ this.observers.forEach(function(o) {
+ if (!o || typeof o.update != "function") return;
+ try {
+ o.update(message);
+ } catch (e) {
+ logger.log(e);
}
- };
- //}}}
-
- var Message = function() {//{{{
- this.initialize.apply(this, arguments);
- };
- Message.prototype = {
- initialize: function(title, message, link, options) {
- try {
- if (typeof title == 'undefined' || title == null) throw 'title is undefined.';
- if (typeof message == 'undefined' || message == null) throw 'message is undefined.';
- this.title = title;
- this.message = message;
- this.link = link;
- this.options = options;
- } catch (e) {
- logger.log('Message.initialize error: ' + e);
- throw e;
- }
+ });
+ },
+ check: function() { throw "needs override." },
+ shutdown: function() {}
+ };//}}}
+
+ var SubjectHttp = Subject;//{{{
+ $U.extend(SubjectHttp.prototype, {
+ initialize: function() {
+ this.preInitialized = true;
+ this.initialized = false;
+ this.count = 0;
+ this.cache;
+
+ if (typeof this.preInitialize == "function") this.preInitialized = this.preInitialize();
+ if (!this.preInitialized) return;
+
+ var req = new libly.Request(
+ this.options.url,
+ this.options.headers,
+ $U.extend({ asynchronous: true }, this.options.extra)
+ );
+ req.addEventListener("onSuccess", $U.bind(this, function(res) {
+ logger.log("initialized");
+ if (typeof this.parse == "function") this.cache = this.parse(res);
+ if (this.cache)
+ this.initialized = true;
+ }));
+ req.addEventListener("onFailure", function(res) { logger.log(res); });
+ req.addEventListener("onException", function(res) { logger.log(res); });
+ if (this.method == "POST")
+ req.post();
+ else
+ req.get();
+ },
+ check: function() {
+ if (!this.initialized) return;
+
+ this.count++;
+ var req = new libly.Request(
+ this.options.url,
+ this.options.headers,
+ $U.extend({ asynchronous: true }, this.options.extra)
+ );
+ req.addEventListener("onSuccess", $U.bind(this, function(res) {
+ var parsed, diff;
+ if (typeof this.parse == "function") parsed = this.parse(res);
+ if (parsed && typeof this.diff == "function") diff = this.diff(this.cache, parsed);
+ if (diff && (typeof diff.length == "undefined" || diff.length > 0)) {
+ this.cache = parsed;
+ if (typeof this.buildMessages == "function") {
+ let messages = this.buildMessages(diff);
+ [].concat(messages).forEach(function(m) {
+ this.notify(m);
+ liberator.sleep(1500);
+ }, this);
+ }
}
- };//}}}
-
- var Observer = function() {//{{{
- this.__initialize__.apply(this, arguments);
- };
- Observer.prototype = {
- __initialize__: function(args) {
- $U.extend(this, args);
- if (typeof this.initialize == 'function') this.initialize();
- },
- shutdown: function() {}
- };//}}}
-
- var Subject = function() {//{{{
- this.__initialize__.apply(this, arguments);
- };
- Subject.prototype = {
- __initialize__: function(args) {
- this.isActive = false;
- this.observers = [];
- this.interval = 60;
- this.__nextTime = new Date();
- $U.extend(this, args);
- if (typeof this.initialize == 'function') this.initialize();
- },
- attach: function(observer) {
- this.observers.push(observer);
- },
- notify: function(message) {
- if (!message) return;
- this.observers.forEach(function(o) {
- if (!o || typeof o.update != 'function') return;
- try {
- o.update(message);
- } catch (e) {
- logger.log(e);
- }
- });
- },
- check: function() { throw 'needs override.' },
- shutdown: function() {}
- };//}}}
-
- var SubjectHttp = Subject;//{{{
- $U.extend(SubjectHttp.prototype, {
- initialize: function() {
- this.preInitialized = true;
- this.initialized = false;
- this.count = 0;
- this.cache;
-
- if (typeof this.preInitialize == 'function') this.preInitialized = this.preInitialize();
- if (!this.preInitialized) return;
-
- var req = new libly.Request(
- this.options.url,
- this.options.headers,
- $U.extend({ asynchronous: true }, this.options.extra)
- );
- req.addEventListener('onSuccess', $U.bind(this, function(res) {
- logger.log('initialized');
- if (typeof this.parse == 'function') this.cache = this.parse(res);
- if (this.cache)
- this.initialized = true;
- }));
- req.addEventListener('onFailure', function(res) { logger.log(res); });
- req.addEventListener('onException', function(res) { logger.log(res); });
- if (this.method == 'POST')
- req.post();
- else
- req.get();
- },
- check: function() {
- if (!this.initialized) return;
-
- this.count++;
- var req = new libly.Request(
- this.options.url,
- this.options.headers,
- $U.extend({ asynchronous: true }, this.options.extra)
- );
- req.addEventListener('onSuccess', $U.bind(this, function(res) {
- var parsed, diff;
- if (typeof this.parse == 'function') parsed = this.parse(res);
- if (parsed && typeof this.diff == 'function') diff = this.diff(this.cache, parsed);
- if (diff && (typeof diff.length == 'undefined' || diff.length > 0)) {
- this.cache = parsed;
- if (typeof this.buildMessages == 'function') {
- let messages = this.buildMessages(diff);
- [].concat(messages).forEach(function(m) {
- this.notify(m);
- liberator.sleep(1500);
- }, this);
- }
- }
- }));
- if (this.method == 'POST')
- req.post();
- else
- req.get();
- },
- diff: function(cache, parsed) cache
- });//}}}
-
- var Notifier = function() {//{{{
- this.initialize.apply(this, arguments);
- };
- Notifier.prototype = {
- initialize: function(args) {//{{{
- this.id = (new Date()).getTime();
- this.observers;
- this.subjects;
- this.timer = false;
- this.finallycallback;
- this.isBusy = false;
- },//}}}
- setup: function() {//{{{
-
- if (this.isBusy) {
- logger.log('busy.' + this.id);
- return;
- }
-
- this.isBusy = true;
-
- commands.addUserCommand(['notifierstart'], 'start the notifier',
- $U.bind(this, function(args) { this.start() }), null, true
- );
- commands.addUserCommand(['notifierrestart'], 'restart the notifier',
- $U.bind(this, function(args) { this.stop($U.bind(this, function() { this.start() })) }),
- null, true
- );
- commands.addUserCommand(['notifierstop'], 'stop the notifier',
- $U.bind(this, function(args) { this.stop() }), null, true
- );
-
- liberator.plugins.notifier.libly = libly;
- liberator.plugins.notifier.Observer = Observer;
- liberator.plugins.notifier.Subject = Subject;
- liberator.plugins.notifier.SubjectHttp = SubjectHttp;
- liberator.plugins.notifier.Message = Message;
-
- this.observers = new Loader('observer', function(args) new Observer(args));
- this.subjects = new Loader('subject', function(args) new Subject(args));
-
- this.observers.getPlugins().forEach($U.bind(this, function(o) {
- this.subjects.getPlugins().forEach(function(s) s.attach(o));
- }));
-
- liberator.registerObserver("shutdown", $U.bind(this, function() this.stop()));
-
- this.isBusy = false;
- },//}}}
- start: function() {//{{{
-
- if (this.timer) {
- logger.log('already running.' + this.id);
- return;
- }
-
- if (this.isBusy) {
- logger.log('busy.' + this.id);
- return;
- }
-
- var start = $U.dateFormat(new Date());
- setTimeout($U.bind(this, function() {
- logger.echo('notifier[' + this.id + '] running at ' + start, commandline.force_singleline);
- this.timer = true;
- while (this.timer) { //{{{
- this.subjects.getPlugins().forEach(function(s) {
- let now = new Date();
- if (!s.__nextTime) s.__nextTime = now;
- if (s.interval > 0 && !s.isActive && s.__nextTime <= now) {
- s.isActive = true;
- setTimeout(function() {
- let start = (new Date()).getTime();
- if (typeof s.check == 'function')
- try { s.check(); } catch (e) { logger.log('subject.check error: ' + e) }
- let stop = (new Date()).getTime();
- let elapse = (stop - start);
- s.isActive = false;
- s.__nextTime = new Date(s.__nextTime.getTime() + s.interval * 1000);
- if (s.__nextTime < now) s.__nextTime = now;
- }, 1000);
- }
- });
- liberator.sleep(3 * 1000);
- }//}}}
- if (typeof this.finallycallback == 'function') this.finallycallback();
- logger.echo('notifier[' + this.id + '] stopped.(' + start + ')', commandline.force_singleline);
- }), 10);
-
- },//}}}
- stop: function(finallycallback) {//{{{
- if (!this.timer) {
- logger.log('not running.');
- if (typeof finallycallback == 'function') finallycallback();
- return;
+ }));
+ if (this.method == "POST")
+ req.post();
+ else
+ req.get();
+ },
+ diff: function(cache, parsed) parsed
+ });//}}}
+
+ var Notifier = function() {//{{{
+ this.initialize.apply(this, arguments);
+ };
+ Notifier.prototype = {
+ initialize: function(args) {//{{{
+ this.id = (new Date()).getTime();
+ this.observers;
+ this.subjects;
+ this.timer = false;
+ this.finallycallback;
+ this.isBusy = false;
+ },//}}}
+ setup: function() {//{{{
+
+ if (this.isBusy) {
+ logger.log("busy." + this.id);
+ return;
+ }
+
+ this.isBusy = true;
+
+ commands.addUserCommand([ "notifierstart" ], "start the notifier",
+ $U.bind(this, function(args) this.start()), null, true
+ );
+ commands.addUserCommand([ "notifierrestart" ], "restart the notifier",
+ $U.bind(this, function(args) this.stop($U.bind(this, function() { this.start() }))),
+ null, true
+ );
+ commands.addUserCommand([ "notifierstop" ], "stop the notifier",
+ $U.bind(this, function(args) this.stop()), null, true
+ );
+
+ liberator.plugins.notifier.libly = libly;
+ liberator.plugins.notifier.Observer = Observer;
+ liberator.plugins.notifier.Subject = Subject;
+ liberator.plugins.notifier.SubjectHttp = SubjectHttp;
+ liberator.plugins.notifier.Message = Message;
+
+ this.observers = new Loader("observer", function(args) new Observer(args));
+ this.subjects = new Loader("subject", function(args) new Subject(args));
+
+ this.observers.getPlugins().forEach($U.bind(this, function(o) {
+ this.subjects.getPlugins().forEach(function(s) s.attach(o));
+ }));
+
+ liberator.registerObserver("shutdown", $U.bind(this, function() this.stop()));
+
+ this.isBusy = false;
+ },//}}}
+ start: function() {//{{{
+
+ if (this.timer) {
+ logger.log("already running." + this.id);
+ return;
+ }
+
+ if (this.isBusy) {
+ logger.log("busy." + this.id);
+ return;
+ }
+
+ var start = $U.dateFormat(new Date());
+ setTimeout($U.bind(this, function() {
+ logger.echo("notifier[" + this.id + "] running at " + start, commandline.force_singleline);
+ this.timer = true;
+ while (this.timer) { //{{{
+ this.subjects.getPlugins().forEach(function(s) {
+ let now = new Date();
+ if (!s.__nextTime) s.__nextTime = now;
+ if (s.interval > 0 && !s.isActive && s.__nextTime <= now) {
+ s.isActive = true;
+ setTimeout(function() {
+ let start = (new Date()).getTime();
+ if (typeof s.check == "function")
+ try { s.check(); } catch (e) { logger.log("subject.check error: " + e) }
+ let stop = (new Date()).getTime();
+ let elapse = (stop - start);
+ s.isActive = false;
+ s.__nextTime = new Date(s.__nextTime.getTime() + s.interval * 1000);
+ if (s.__nextTime < now) s.__nextTime = now;
+ }, 1000);
}
- this.subjects.getPlugins().forEach(function(s) s.shutdown());
- this.observers.getPlugins().forEach(function(o) o.shutdown());
- this.finallycallback = finallycallback;
- this.timer = false;
+ });
+ liberator.sleep(3 * 1000);
}//}}}
- };//}}}
-
- var instance = new Notifier();
- instance.setup();
- instance.start();
- return instance;
+ if (typeof this.finallycallback == "function") this.finallycallback();
+ logger.echo("notifier[" + this.id + "] stopped.(" + start + ")", commandline.force_singleline);
+ }), 10);
+
+ },//}}}
+ stop: function(finallycallback) {//{{{
+ if (!this.timer) {
+ logger.log("not running.");
+ if (typeof finallycallback == "function") finallycallback();
+ return;
+ }
+ this.subjects.getPlugins().forEach(function(s) s.shutdown());
+ this.observers.getPlugins().forEach(function(o) o.shutdown());
+ this.finallycallback = finallycallback;
+ this.timer = false;
+ }//}}}
+ };//}}}
+
+ var instance = new Notifier();
+ instance.setup();
+ instance.start();
+ return instance;
};
})();