From bbbf30bf2f2c6e7b3b50b54284a6cb6eaaf15b37 Mon Sep 17 00:00:00 2001 From: Robin Glauser Date: Tue, 17 Nov 2020 14:16:03 +0100 Subject: [PATCH] Adding daily overview for bot --- README.md | 2 +- bot.js | 94 ++++++++++++++++++++++++++++++++++++++++++----- package-lock.json | 76 ++++++++++++++++++++++++++++++++++++++ package.json | 12 +++++- 4 files changed, 172 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ba89c03..7504e00 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ A flatastic telegram bot that shows the tasks and things on the shopping list in a telegram chat. ## How to get started -- Create .env file with a BOT_TOKEN and FLATASTIC_TOKEN environment variable. +- Create .env file with a BOT_TOKEN, FLATASTIC_TOKEN and TELEGRAM_GROUP environment variable. - Run ```node bot.js``` ## Planned features: diff --git a/bot.js b/bot.js index 6e0e771..1e2e151 100644 --- a/bot.js +++ b/bot.js @@ -1,12 +1,16 @@ const {Telegraf} = require('telegraf') const {Flatastic} = require('./flatastic.js') +const LocalSession = require('telegraf-session-local') require('dotenv').config() let flatastic = new Flatastic(process.env.FLATASTIC_TOKEN) const bot = new Telegraf(process.env.BOT_TOKEN) + +bot.use((new LocalSession({database: 'example_db.json'})).middleware()) + bot.start((ctx) => ctx.reply('Welcome!')) bot.help((ctx) => ctx.reply('Send me a sticker')) @@ -16,29 +20,95 @@ flatastic.getInformation(function (data) { let user = data.flatmates[key]; users[user.id] = user; } +}) + +var cron = require('node-cron'); + +cron.schedule('00 15 * * *', () => { + + flatastic.getTaskList(function (data) { + var tasks = ""; + data = data.sort(function (x, y) { + let n = x.currentUser - y.currentUser; + if (n !== 0) { + return n; + } + + return x.timeLeftNext - y.timeLeftNext; + }); + let lastUser = 0; + for (const dataKey in data) { + let task = data[dataKey]; + + if (task.currentUser !== lastUser) { + tasks += "\n" + users[task.currentUser].firstName + "\n"; + } + + var daysUntilTask = (task.timeLeftNext / 60 / 60 / 24); + var passed = 'heute'; + if (daysUntilTask < 0) { + passed = "vor " + Math.ceil(Math.abs(daysUntilTask)) + " Tag/en" + } + if (daysUntilTask > 1) { + continue; + } + tasks += task.title + " " + tasks += passed + " fällig\n"; + + lastUser = task.currentUser; + } + + bot.telegram.sendMessage(process.env.TELEGRAM_GROUP, tasks, { + parse_mode: 'HTML' + }) + + }) }) +cron.schedule('0 12 * * *', () => { + flatastic.getShoppingList(function (data) { + var output = ""; + data = data.filter(function (a) { + return a.bought === 0; + }) + if (data.length === 0) { + + } else { + output = "Momentan ist folgendes auf der Einkaufsliste:\n"; + for (const dataKey in data) { + let item = data[dataKey]; + if (item.bought) { + continue; + } + + output += item.itemName + " hinzugefügt von " + users[item.inserterId].firstName + "\n" + } + bot.telegram.sendMessage(process.env.TELEGRAM_GROUP, output) + } + + }) +}); bot.hears(/einkaufsliste|ichoufe|einkaufen|kaufen|shopping/i, (ctx) => { + console.dir(ctx.update.message.chat) flatastic.getShoppingList(function (data) { var output = ""; - data = data.filter(function (a){ + data = data.filter(function (a) { return a.bought === 0; }) console.log(data) - if (data.length === 0){ + if (data.length === 0) { output = "Die Einkaufsliste ist leer." - } - else { + } else { output = "Einkaufsliste\n"; for (const dataKey in data) { let item = data[dataKey]; - if (item.bought){ + if (item.bought) { continue; } - output += item.itemName + " hinzugefügt von " + users[item.inserterId].firstName +"\n" + output += item.itemName + " hinzugefügt von " + users[item.inserterId].firstName + "\n" } } @@ -46,6 +116,12 @@ bot.hears(/einkaufsliste|ichoufe|einkaufen|kaufen|shopping/i, (ctx) => { }) }); +bot.hears(/counter/i, (ctx, next) => { + ctx.session.counter = ctx.session.counter || 0 + ctx.session.counter = ctx.session.counter * 2 + ctx.replyWithMarkdown(`Counter updated, new value: \`${ctx.session.counter}\``) + return next() +}) bot.hears(/task|aufgabe|ämtli/i, (ctx) => { @@ -63,8 +139,8 @@ bot.hears(/task|aufgabe|ämtli/i, (ctx) => { for (const dataKey in data) { let task = data[dataKey]; - if (task.currentUser !== lastUser){ - tasks += "\n"+users[task.currentUser].firstName+ "\n"; + if (task.currentUser !== lastUser) { + tasks += "\n" + users[task.currentUser].firstName + "\n"; } tasks += task.title + " " @@ -78,7 +154,7 @@ bot.hears(/task|aufgabe|ämtli/i, (ctx) => { passed = "in " + Math.ceil(Math.abs(daysUntilTask)) + " Tag/en" } - tasks += passed +" fällig\n"; + tasks += passed + " fällig\n"; lastUser = task.currentUser; } diff --git a/package-lock.json b/package-lock.json index 723455e..7ecd981 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,19 @@ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, + "@types/lodash": { + "version": "4.14.161", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.161.tgz", + "integrity": "sha512-EP6O3Jkr7bXvZZSZYlsgt5DIjiGr0dXP1/jVEwVLTFgg0d+3lWVQkRavYVQszV7dYUwvg0B8R0MBDpcmXg7XIA==" + }, + "@types/lowdb": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/lowdb/-/lowdb-1.0.9.tgz", + "integrity": "sha512-LBRG5EPXFOJDoJc9jACstMhtMP+u+UkPYllBeGQXXKiaHc+uzJs9+/Aynb/5KkX33DtrIiKyzNVTPQc/4RcD6A==", + "requires": { + "@types/lodash": "*" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -614,6 +627,11 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -681,6 +699,23 @@ "package-json": "^6.3.0" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lowdb": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowdb/-/lowdb-1.0.0.tgz", + "integrity": "sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==", + "requires": { + "graceful-fs": "^4.1.3", + "is-promise": "^2.1.0", + "lodash": "4", + "pify": "^3.0.0", + "steno": "^0.4.1" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -742,6 +777,15 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node-cron": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-2.0.3.tgz", + "integrity": "sha512-eJI+QitXlwcgiZwNNSRbqsjeZMp5shyajMR81RZCqeW0ZDEj4zU9tpd4nTh/1JsBiKbF8d08FCewiipDmVIYjg==", + "requires": { + "opencollective-postinstall": "^2.0.0", + "tz-offset": "0.0.1" + } + }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -805,6 +849,11 @@ "wrappy": "1" } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" + }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -838,6 +887,11 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -1006,6 +1060,14 @@ "tweetnacl": "~0.14.0" } }, + "steno": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/steno/-/steno-0.4.4.tgz", + "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=", + "requires": { + "graceful-fs": "^4.1.3" + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -1075,6 +1137,15 @@ "telegram-typings": "^3.6.0" } }, + "telegraf-session-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/telegraf-session-local/-/telegraf-session-local-2.0.0.tgz", + "integrity": "sha512-EOcKh5vEn7wq+9zyCQwud8RU04QhWGGq939lyr1UhGeeCVulSYbU94Q02itQ19nSwUbyMvX1Pf7hZUd3MZCIiA==", + "requires": { + "@types/lowdb": "^1.0.9", + "lowdb": "^1.0.0" + } + }, "telegram-typings": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/telegram-typings/-/telegram-typings-3.6.1.tgz", @@ -1141,6 +1212,11 @@ "is-typedarray": "^1.0.0" } }, + "tz-offset": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tz-offset/-/tz-offset-0.0.1.tgz", + "integrity": "sha512-kMBmblijHJXyOpKzgDhKx9INYU4u4E1RPMB0HqmKSgWG8vEcf3exEfLh4FFfzd3xdQOw9EuIy/cP0akY6rHopQ==" + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", diff --git a/package.json b/package.json index a9b27b1..15a39c9 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,11 @@ "main": "bot.js", "dependencies": { "dotenv": "^8.2.0", + "node-cron": "^2.0.3", "nodemon": "^2.0.4", "request": "^2.88.2", - "telegraf": "^3.38.0" + "telegraf": "^3.38.0", + "telegraf-session-local": "^2.0.0" }, "devDependencies": {}, "scripts": { @@ -19,5 +21,11 @@ "telegraf" ], "author": "Robin Glauser", - "license": "MIT" + "license": "MIT", + "nodemonConfig": { + "ignore": [ + "example_db.json" + ], + "delay": "2500" + } }