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"
+ }
}