-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTimerActionsDaemon.js
128 lines (122 loc) · 4.55 KB
/
TimerActionsDaemon.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*\
title: $:/plugins/OokTech/TimerActions/TimerActionsDaemon.js
type: application/javascript
module-type: startup
This is the daemon process that runs a timer and periodically checks to see if
there is a new task to run based on the ellapsed time.
\*/
(function () {
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
// Export name and synchronous status
exports.name = "scheduler-daemon";
exports.platforms = ["browser"];
exports.after = ["render"];
exports.synchronous = true;
exports.startup = function() {
var timerID, intervalDelay;
function checkStatus() {
var tasksData = {};
var tasksText = $tw.wiki.getTiddlerText('$:/plugins/OokTech/TimerActions/TaskList', '{}');
try {
var tasksData = JSON.parse(tasksText);
} catch (e) {
console.log("Can't parse tasks data.")
}
// Check if the interval delay has changed
var newDelay = $tw.wiki.getTiddlerText('$:/plugins/OokTech/TimerActions/IntervalDelay', 1000);
if (Number(newDelay) !== Number(intervalDelay)) {
intervalDelay = newDelay;
clearInterval(timerID);
setInterval(checkStatus, intervalDelay);
}
// See if any events are scheduled for this interval
var list = getScheduledTasks();
list.forEach(function(title) {
var tiddler = $tw.wiki.getTiddler(title);
if (tiddler) {
// Execute actions
$tw.rootWidget.invokeActionString(tiddler.fields.text,$tw.rootWidget);
// update the task states
switch (tiddler.fields.timer_type) {
case "periodic":
// Update the start time to the current time
tasksData[title] = Date.now();
break;
case "countdown":
// Set the task as done
tasksData[title] = 'false';
break;
}
}
});
if (JSON.stringify(tasksData, null, 2) !== tasksText) {
var fields = $tw.wiki.getTiddler('$:/plugins/OokTech/TimerActions/TaskList').fields;
$tw.wiki.addTiddler(new $tw.Tiddler(fields, {text: JSON.stringify(tasksData, null, 2)}))
}
}
function getScheduledTasks() {
var tasks = [];
var tasksText = $tw.wiki.getTiddlerText('$:/plugins/OokTech/TimerActions/TaskList', '{}');
try {
// All listed tasks
var tasksData = JSON.parse(tasksText);
// All enabled tasks
var enabledTasks = Object.keys(tasksData).filter(function(task) {
return tasksData[task] !== 'false';
});
// Tasks that should be run now
tasks = enabledTasks.filter(function(task) {
var taskTiddler = $tw.wiki.getTiddler(task);
if (taskTiddler) {
// get schedule type
if (taskTiddler.fields.timer_type) {
switch(taskTiddler.fields.timer_type) {
case "periodic":
//intentional fall through
case "countdown":
if (tasksData[task] !== 'false') {
if (!Number.isNaN(Number.parseFloat(tasksData[task])) && Number.isFinite(tasksData[task])) {
if (Date.now() - Number(tasksData[task]) > Number(taskTiddler.fields.period)) {
return true;
} else {
return false;
}
} else {
// If it isn't false and not a number than set the value
// to the current time.
// This is how you start something.
tasksData[task] = Date.now();
return false;
}
}
break;
case "scheduled":
// TODO this!!
return false;
break;
default:
return false;
}
}
} else {
return false;
}
})
if (JSON.stringify(tasksData, null, 2) !== tasksText) {
var fields = $tw.wiki.getTiddler('$:/plugins/OokTech/TimerActions/TaskList').fields;
$tw.wiki.addTiddler(new $tw.Tiddler(fields, {text: JSON.stringify(tasksData, null, 2)}))
}
} catch (e) {
console.log('Error parsing tasks!');
console.log(e);
}
return tasks;
}
intervalDelay = Number($tw.wiki.getTiddlerText('$:/plugins/OokTech/TimerActions/IntervalDelay')) || 1000;
if (intervalDelay) {
timerID = setInterval(checkStatus, intervalDelay);
}
}
})();