aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jan.tuomi@valuemotive.com>2021-04-18 18:07:54 +0300
committerJan Tuomi <jan.tuomi@valuemotive.com>2021-04-18 18:07:54 +0300
commitbaacc7676c688cd2728033e9051208d655255ee5 (patch)
tree5a3819b1c5f6ad616d82f84b3a62cca20d54c0f7
parent12f3de7a9ec911cf5945eee31c7680aa75c4f8af (diff)
Work on tg bot
-rw-r--r--.env.sample6
-rw-r--r--.gitignore1
-rw-r--r--package-lock.json214
-rw-r--r--package.json4
-rw-r--r--src/config.ts51
-rw-r--r--src/index.ts32
-rw-r--r--src/middleware.ts19
7 files changed, 301 insertions, 26 deletions
diff --git a/.env.sample b/.env.sample
new file mode 100644
index 0000000..5fe837b
--- /dev/null
+++ b/.env.sample
@@ -0,0 +1,6 @@
+PORT=3000
+SHEETS_SPREADSHEET_ID=
+SHEETS_RANGE=
+TELEGRAM_WEBHOOK_URL=https://hommabot2.jan.systems/webhook/telegram
+TELEGRAM_BOT_TOKEN=
+TELEGRAM_USER_IDS=
diff --git a/.gitignore b/.gitignore
index 873c418..f71223e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
node_modules/
build/
.vscode/
+.env
diff --git a/package-lock.json b/package-lock.json
index 1ba2f19..75f5cf8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,12 +10,14 @@
"dependencies": {
"@tinyhttp/app": "1.2.23",
"@tinyhttp/logger": "1.2.4",
+ "telegraf": "4.3.0",
"ts-node": "9.1.1"
},
"devDependencies": {
"@types/node": "14.14.41",
"@typescript-eslint/eslint-plugin": "4.22.0",
"@typescript-eslint/parser": "4.22.0",
+ "dotenv": "8.2.0",
"eslint": "7.24.0",
"nodemon": "2.0.7"
}
@@ -575,6 +577,17 @@
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
"node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
@@ -830,6 +843,25 @@
"node": ">=8"
}
},
+ "node_modules/buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "dependencies": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+ },
+ "node_modules/buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
+ },
"node_modules/buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -1055,7 +1087,6 @@
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
"dependencies": {
"ms": "2.1.2"
},
@@ -1145,6 +1176,15 @@
"node": ">=8"
}
},
+ "node_modules/dotenv": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
@@ -1432,6 +1472,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -2190,14 +2238,17 @@
"node_modules/minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "node_modules/module-alias": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz",
+ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q=="
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/natural-compare": {
"version": "1.4.0",
@@ -2213,6 +2264,14 @@
"node": ">= 0.6"
}
},
+ "node_modules/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ }
+ },
"node_modules/nodemon": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz",
@@ -2349,6 +2408,14 @@
"node": ">=6"
}
},
+ "node_modules/p-timeout": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz",
+ "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -2671,6 +2738,22 @@
"queue-microtask": "^1.2.2"
}
},
+ "node_modules/safe-compare": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz",
+ "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==",
+ "dependencies": {
+ "buffer-alloc": "^1.2.0"
+ }
+ },
+ "node_modules/sandwich-stream": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz",
+ "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
"node_modules/semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -2875,6 +2958,28 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
+ "node_modules/telegraf": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.3.0.tgz",
+ "integrity": "sha512-MuDUtSMipzMzQp8fXbQx76jp4ZD70KREdnpH1idUzN9Zlgm6EzatBQFU4Ps0ipxtEmnBBdghBMumQwrjRe3eqg==",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "debug": "^4.3.1",
+ "minimist": "^1.2.5",
+ "module-alias": "^2.2.2",
+ "node-fetch": "^2.6.1",
+ "p-timeout": "^4.1.0",
+ "safe-compare": "^1.1.4",
+ "sandwich-stream": "^2.0.2",
+ "typegram": "^3.2.0"
+ },
+ "bin": {
+ "telegraf": "bin/telegraf"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/term-size": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
@@ -3005,6 +3110,11 @@
"is-typedarray": "^1.0.0"
}
},
+ "node_modules/typegram": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.2.3.tgz",
+ "integrity": "sha512-zlkY7vNTLcwQhLUyYXAUzRelzH752LBFl8m4u04d5g5P7lM9bGegeIRwzd3mVCHJH6R3s48pKeFTVSdVlN+omg=="
+ },
"node_modules/typescript": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
@@ -3582,6 +3692,14 @@
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
+ "abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "requires": {
+ "event-target-shim": "^5.0.0"
+ }
+ },
"acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
@@ -3778,6 +3896,25 @@
"fill-range": "^7.0.1"
}
},
+ "buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "requires": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
+ },
+ "buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
+ },
"buffer-from": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -3955,7 +4092,6 @@
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
"requires": {
"ms": "2.1.2"
}
@@ -4019,6 +4155,12 @@
"is-obj": "^2.0.0"
}
},
+ "dotenv": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
+ "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
+ "dev": true
+ },
"duplexer3": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
@@ -4238,6 +4380,11 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
+ "event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
+ },
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -4819,14 +4966,17 @@
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "module-alias": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz",
+ "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q=="
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"natural-compare": {
"version": "1.4.0",
@@ -4839,6 +4989,11 @@
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
},
+ "node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+ },
"nodemon": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz",
@@ -4939,6 +5094,11 @@
"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
"dev": true
},
+ "p-timeout": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-4.1.0.tgz",
+ "integrity": "sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw=="
+ },
"package-json": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
@@ -5155,6 +5315,19 @@
"queue-microtask": "^1.2.2"
}
},
+ "safe-compare": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz",
+ "integrity": "sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ==",
+ "requires": {
+ "buffer-alloc": "^1.2.0"
+ }
+ },
+ "sandwich-stream": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/sandwich-stream/-/sandwich-stream-2.0.2.tgz",
+ "integrity": "sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ=="
+ },
"semver": {
"version": "7.3.5",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
@@ -5311,6 +5484,22 @@
}
}
},
+ "telegraf": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.3.0.tgz",
+ "integrity": "sha512-MuDUtSMipzMzQp8fXbQx76jp4ZD70KREdnpH1idUzN9Zlgm6EzatBQFU4Ps0ipxtEmnBBdghBMumQwrjRe3eqg==",
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "debug": "^4.3.1",
+ "minimist": "^1.2.5",
+ "module-alias": "^2.2.2",
+ "node-fetch": "^2.6.1",
+ "p-timeout": "^4.1.0",
+ "safe-compare": "^1.1.4",
+ "sandwich-stream": "^2.0.2",
+ "typegram": "^3.2.0"
+ }
+ },
"term-size": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz",
@@ -5399,6 +5588,11 @@
"is-typedarray": "^1.0.0"
}
},
+ "typegram": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/typegram/-/typegram-3.2.3.tgz",
+ "integrity": "sha512-zlkY7vNTLcwQhLUyYXAUzRelzH752LBFl8m4u04d5g5P7lM9bGegeIRwzd3mVCHJH6R3s48pKeFTVSdVlN+omg=="
+ },
"typescript": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz",
diff --git a/package.json b/package.json
index a5876c0..3cbfb89 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,9 @@
"dependencies": {
"@tinyhttp/app": "1.2.23",
"@tinyhttp/logger": "1.2.4",
- "ts-node": "9.1.1"
+ "telegraf": "4.3.0",
+ "ts-node": "9.1.1",
+ "dotenv": "8.2.0"
},
"devDependencies": {
"@types/node": "14.14.41",
diff --git a/src/config.ts b/src/config.ts
new file mode 100644
index 0000000..dc3889a
--- /dev/null
+++ b/src/config.ts
@@ -0,0 +1,51 @@
+import dotenv from "dotenv";
+
+if (!process.env.SKIP_DOTENV) {
+ dotenv.config();
+}
+
+class ConfigError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = "ConfigError";
+ }
+}
+
+const tgWebhookUrl = process.env.TELEGRAM_WEBHOOK_URL || null;
+if (!tgWebhookUrl) {
+ throw new ConfigError("Missing env var TELEGRAM_WEBHOOK_URL");
+}
+
+const tgBotToken = process.env.TELEGRAM_BOT_TOKEN || null;
+if (!tgBotToken) {
+ throw new ConfigError("Missing env var TELEGRAM_BOT_TOKEN");
+}
+
+const tgUserIds = process.env.TELEGRAM_USER_IDS
+ ? process.env.TELEGRAM_USER_IDS?.split(",")
+ .map(Number.parseInt)
+ : null;
+if (!tgUserIds) {
+ throw new ConfigError("Missing env var TELEGRAM_USER_IDS");
+}
+
+const sheetsSpreadsheetId = process.env.SHEETS_SPREADSHEET_ID || null;
+if (!sheetsSpreadsheetId) {
+ throw new ConfigError("Missing env var SHEETS_SPREADSHEET_ID");
+}
+
+const sheetsRange = process.env.SHEETS_RANGE || null;
+if (!sheetsRange) {
+ throw new ConfigError("Missing env var SHEETS_RANGE");
+}
+
+const config = {
+ port: process.env.PORT ? Number(process.env.PORT) : 3000,
+ tgWebhookUrl,
+ tgBotToken,
+ tgUserIds,
+ sheetsSpreadsheetId,
+ sheetsRange,
+};
+
+export default config;
diff --git a/src/index.ts b/src/index.ts
index 3ff5de7..71e239f 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,9 +1,16 @@
import { App } from "@tinyhttp/app";
import { logger } from "@tinyhttp/logger";
-import { auth } from "./middleware";
+import { Telegraf } from "telegraf";
+import config from "./config";
+import { tgMiddleware } from "./middleware";
const app = new App();
-const port = process.env.PORT ? Number(process.env.PORT) : 3000;
+console.log(`Setting up Telegram bot with token ${config.tgBotToken}`);
+const bot = new Telegraf(config.tgBotToken);
+
+bot.use(tgMiddleware.auth);
+bot.command("/start", (ctx) => ctx.reply("started"));
+bot.command("/stop", (ctx) => ctx.reply("stopped"));
app
.use(logger({
@@ -11,19 +18,20 @@ app
format: "YYYY-MM-DDTHH:mm:ssZ[Z]",
},
}))
- .use(auth)
+ .use(bot.webhookCallback("/webhook/telegram"))
.get("/", (_, res) => {
- res.send({ foo: "bar" });
- })
- .post("/webhook/start", (_req, res) => {
- res.send({ webhook: "start" });
- })
- .post("/webhook/stop", (_req, res) => {
- res.send({ webhook: "stop" });
+ res.send({ service: "hommabot2 API" });
})
.post("/scheduler/trigger", (_req, res) => {
res.send({ scheduler: "trigger" });
});
-console.log(`Serving on http://localhost:${port}`);
-app.listen(port);
+console.log(`Setting up webhook on ${config.tgWebhookUrl}`);
+bot.telegram.setWebhook(config.tgWebhookUrl);
+
+console.log(`Serving on http://localhost:${config.port}`);
+app.listen(config.port);
+
+// Enable graceful stop
+process.once("SIGINT", () => bot.stop("SIGINT"));
+process.once("SIGTERM", () => bot.stop("SIGTERM"));
diff --git a/src/middleware.ts b/src/middleware.ts
index bdc006a..e2814e0 100644
--- a/src/middleware.ts
+++ b/src/middleware.ts
@@ -1,5 +1,18 @@
-import { NextFunction, Request, Response } from "@tinyhttp/app";
+import { Context } from "telegraf";
+import config from "./config";
-export const auth = async (_req: Request, _res: Response, next: NextFunction): Promise<void> => {
- await next();
+const auth = async (ctx: Context, next: () => Promise<void>): Promise<void> => {
+ const userId = ctx.message?.from.id;
+
+ if (!userId || !config.tgUserIds.includes(userId)) {
+ ctx.reply("Käyttäjälläsi ei ole oikeuksia startata HommaBottia.");
+ } else {
+ await next();
+ }
+};
+
+export const tgMiddleware = {
+ auth,
};
+
+export const httpMiddleware = {};