Simple Telegram Bot for Task Management
- 5 minsI would claim to be a pretty organized person, mostly because I have to if I don’t want to go crazy tracking the work happening on various standard orgs, internal projects and mailing lists.
As I only have ten fingers I am sadly not capable of using orgmode efficiently. If you are one of the chosen ones that can exclusively use Emacs I strongly recommend it. Instead, I use PlainTasks (first on Sublime, now on Atom), kudos to @aziz for doing them BTW.
A fairly active IETF working Group has a relatively large number of items that need to be done, for example these are the tasks for CoRE. I aggregate them by draft/RFC, for example ETCH would be:
ETCH draft-ietf-core-etch:
Notes:
Summary available
http://jaimejim.github.io/temp/draft-ietf-core-etch
✔ [ETCH] [IETF96] Address comments (preconditions and use of iPTACH/PATCH)
on mailing list before shepherd-writeup @due(16-07-25) @done(2016-08-15 11:06)
✔ [ETCH] [IETF96] shepherd-writeup (in progress in parallel)
@due(16-07-18 15:28) @jaime @high @done(2016-08-15 11:06)
☐ [ETCH] Awaiting for authors to initiate expert review on the media types
@due(2016-08-22 08:23)
☐ [ETCH] Awaiting for authors to confirm IPR @due(2016-08-22 08:23)
☐ [ETCH] IESG Submission of draft-ietf-core-etch @due(16-07-25 15:25) delayed
to @due(16-08-20 15:25)
☐ [ETCH] IETFLC @iesg
☐ [ETCH] AD go ahead if IETFLC OK. @iesg
☐ [ETCH] IESG Ballot (ADs read it). @iesg
On my computer I have a cron job that alerts me when a task is happening, but to sync among several people is not that easy. I quickly noticed that several of us were chatting through Telegram, thus I thought that maybe a bot that sends us reminders could be helpful.
Telegram has enabled an API for developers to create bots, quickly several implementations popped out, in particular I found Telegram Node Bot pretty useful. I won’t repeat what the Github README says, so just go ahead and check it out.
As it turns out, it was very quick and simple to put together a bot to fetch the task list, find the the due action points, and just send them over Telegram. Beforehand I would like to apologize for the shitty suboptimal code, it works but it isn’t pretty.
// Belvedere Bot 0.1
// @jaimejim http://jaimejim.github.io
var http = require('http')
var fs = require('fs')
var tg = require('telegram-node-bot')('insert-your-token-here')
var ct = new Date()
function gettas (callback) {
http.request('http://<url_of_tasks>.todo', function (error, response, body) {
if (!error && response.statusCode == 200) {
var i = body.indexOf('@due')
var out = ''
var counter = 0
var txt = ''
while (i !== -1){
var dt = getdate(body.substring(i + 5, i + 13))
if ((dt.getYear() == ct.getYear()) && (dt.getMonth() == ct.getMonth())
&& (dt.getDay() == ct.getDay())) {
txt = body.substring(0, i)
out = out + '\n' + body.substring(txt.lastIndexOf(' ☐ '), i)
} else {
}
i = body.indexOf('@due', i + 1)
}
console.log(out)
callback(out)
}
})
}
gettask(function (data) {
tg.router.when(['list'], 'ListController').otherwise('OtherwiseController')
tg.controller('ListController', ($) => {
tg.for('list', () => {
$.sendMessage('These are your tasks for today:\n')
$.sendMessage(data)
})
})
tg.controller('OtherwiseController', ($) => {
$.sendMessage('Sorry, what? \n')
})
tg.controller(($) => {
if (dt.getYear() == ct.getYear()) {
$.sendMessage('Time is ' + dt.getYear() + ' \n')
}
})
})
function getdate (st) {
var dpattern = /(\d{4})\-(\d{2})\-(\d{2})/
return new Date('20' + st.replace(dpattern, '$1-$2-$3'))
}
On the server side you could install forever in case the bot crashes (which it did a couple of times for me):
$jaime:~$ [sudo] npm install forever -g
$jaime:~$ forever start belvederebot.js
info: Forever started process(es):
data: uid command script forever pid id logfile uptime
data: [0] KtcN /usr/bin/nodejs belvederebot.js 4987 1019
/home/jaime/.forever/KtcN.log 0:0:24:4.495
$jaime:~$ forever list
You can also add a crontab task for periodically checking task list updates.
$jaime:~$ crontab -e
0 * * * * /usr/bin/forever restart /home/user/belvederebot.js
And that’s all, this is how the bot looks like once running.