/
pick.js
88 lines (88 loc) · 2.86 KB
/
pick.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
"use strict";
(() => {
let creds = new Credentials();
var getWeights = function () {
const now = new Date();
const hour = now.getHours();
const day = now.getDay();
if (hour >= 8 && hour <= 17 && day != 0 && day != 6) {
return { work: 0.8, personal: 0.2 };
}
else {
return { work: 0.8, personal: 0.2 };
return { work: 0.0, personal: 1.0 };
}
};
var categorizeTask = function (task) {
var todo = task.tags;
while (todo.length != 0) {
let tag = todo.pop();
if (tag.name == "work") {
return "work";
}
else if (tag.name == "personal") {
return "personal";
}
else if (tag.parent) {
todo.push(tag.parent);
}
}
return null;
};
var daysBetween = function (a, b) {
let millis = Math.abs(a.getTime() - b.getTime());
return millis / 1000 / 60 / 60 / 24;
};
var weightedRandom = function (pairs) {
var total = 0;
for (let pair of pairs) {
total += pair[1];
}
let target = Math.random() * total;
for (let pair of pairs) {
target -= pair[1];
if (target <= 0) {
return pair[0];
}
}
return null;
};
var chooseATask = function () {
let weights = getWeights();
let now = new Date();
let possibleTasks = flattenedProjects
.filter((p) => p.status == Project.Status.Active)
.flatMap((p) => p.flattenedTasks.filter((t) => t.taskStatus == Task.Status.Available ||
t.taskStatus == Task.Status.DueSoon ||
t.taskStatus == Task.Status.Next ||
t.taskStatus == Task.Status.Overdue));
let weightedTasks = [];
for (let task of possibleTasks) {
// weight some categories higher than others
let categoryWeight = 0;
let category = categorizeTask(task);
if (category) {
categoryWeight = weights[category];
}
// weight stale-er tasks higher, up to 7 days
let ageWeight = Math.min(7, daysBetween(now, task.modified)) / 7;
// weight due-er tasks higher, up to 100 points
let dueWeight = 0;
if (task.effectiveDueDate) {
dueWeight = 100 - daysBetween(now, task.effectiveDueDate);
}
weightedTasks.push([task, ageWeight + dueWeight + categoryWeight]);
}
return weightedRandom(weightedTasks);
};
var action = new PlugIn.Action(async () => {
try {
console.log(`task: ${chooseATask()}`);
}
catch (err) {
console.error(err);
throw err;
}
});
return action;
})();