From bc853a7e8a84aa5a15d94210b735204916c92d4a Mon Sep 17 00:00:00 2001 From: Dan Schultz Date: Mon, 1 Apr 2024 23:05:22 -0400 Subject: [PATCH 1/5] Add pino and a logger The linter tells me never to use console, all hail the linter (plus, colors are nice). This is always run in dev mode so it's OK to just use pino-pretty as a transport, though when aprilbot IPOs we'll want to colorize. --- package.json | 2 + src/logger.ts | 13 +++ yarn.lock | 219 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 src/logger.ts diff --git a/package.json b/package.json index 72e348a..2502140 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,8 @@ "dependencies": { "@slack/socket-mode": "^1.3.4", "@slack/web-api": "^6.1.0", + "pino": "^8.19.0", + "pino-pretty": "^11.0.0", "require-env-variable": "^4.0.2" } } diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..ab71b4a --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,13 @@ +import pino from 'pino'; + +const getLogger = () => + pino({ + transport: { + target: 'pino-pretty', + options: { + colorize: true, + }, + }, + }); + +export { getLogger }; diff --git a/yarn.lock b/yarn.lock index 6f0aaac..e9350c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -311,6 +311,13 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -433,6 +440,11 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" +atomic-sleep@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" + integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -454,6 +466,11 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -476,6 +493,14 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" @@ -520,6 +545,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^2.0.7: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -578,6 +608,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" +dateformat@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -652,6 +687,13 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" @@ -911,6 +953,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^3.1.0: version "3.1.2" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz" @@ -921,6 +968,16 @@ eventemitter3@^4.0.4: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +fast-copy@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35" + integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== + fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz" @@ -951,6 +1008,16 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-redact@^3.1.1: + version "3.5.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.5.0.tgz#e9ea02f7e57d0cd8438180083e93077e496285e4" + integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -1205,6 +1272,16 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +help-me@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6" + integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" @@ -1401,6 +1478,11 @@ isexe@^2.0.0: resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1600,7 +1682,12 @@ object.values@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -once@^1.3.0: +on-exit-leak-free@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" + integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -1708,6 +1795,56 @@ picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pino-abstract-transport@^1.0.0, pino-abstract-transport@v1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz#083d98f966262164504afb989bccd05f665937a8" + integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + +pino-pretty@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-11.0.0.tgz#9b883f7b933f58fa94caa44225aab302409461ef" + integrity sha512-YFJZqw59mHIY72wBnBs7XhLGG6qpJMa4pEQTRgEPEbjIYbng2LXEZZF1DoyDg9CfejEy8uZCyzpcBXXG0oOCwQ== + dependencies: + colorette "^2.0.7" + dateformat "^4.6.3" + fast-copy "^3.0.0" + fast-safe-stringify "^2.1.1" + help-me "^5.0.0" + joycon "^3.1.1" + minimist "^1.2.6" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.0.0" + pump "^3.0.0" + readable-stream "^4.0.0" + secure-json-parse "^2.4.0" + sonic-boom "^3.0.0" + strip-json-comments "^3.1.1" + +pino-std-serializers@^6.0.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3" + integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== + +pino@^8.19.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-8.19.0.tgz#ccc15ef736f103ec02cfbead0912bc436dc92ce4" + integrity sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport v1.1.0 + pino-std-serializers "^6.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^3.7.0" + thread-stream "^2.0.0" + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -1723,11 +1860,29 @@ prettier@3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +process-warning@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" + integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.1.1" resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" @@ -1738,6 +1893,27 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-format-unescaped@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7" + integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== + +readable-stream@^4.0.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" + integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + +real-require@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78" + integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== + regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" @@ -1801,6 +1977,11 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -1810,6 +1991,16 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" + integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + +secure-json-parse@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862" + integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== + semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -1871,6 +2062,18 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +sonic-boom@^3.0.0, sonic-boom@^3.7.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.0.tgz#e442c5c23165df897d77c3c14ef3ca40dec66a66" + integrity sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA== + dependencies: + atomic-sleep "^1.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + string.prototype.trim@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" @@ -1899,6 +2102,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1933,6 +2143,13 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thread-stream@^2.0.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351" + integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== + dependencies: + real-require "^0.2.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" From e46a8927ca9cac787f2a5648968e5e0359e43275 Mon Sep 17 00:00:00 2001 From: Dan Schultz Date: Mon, 1 Apr 2024 23:07:12 -0400 Subject: [PATCH 2/5] Create generic AprilBot class This class should contain universally useful slackbot tooling that might be used between different april fools. A given year's specific april functionality will go into the extending class, to make it easier to know what should / shouldn't be blown away between years. --- src/AprilBot.ts | 13 +++++++++++++ src/GenericAprilBot.ts | 27 +++++++++++++++++++++++++++ src/index.ts | 20 ++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 src/AprilBot.ts create mode 100644 src/GenericAprilBot.ts diff --git a/src/AprilBot.ts b/src/AprilBot.ts new file mode 100644 index 0000000..87a5cb6 --- /dev/null +++ b/src/AprilBot.ts @@ -0,0 +1,13 @@ +import { GenericAprilBot } from './GenericAprilBot'; + +class AprilBot extends GenericAprilBot { + constructor(userToken: string, appToken: string) { + super(userToken, appToken); + } + + public async start() { + await super.start(); + } +} + +export { AprilBot }; diff --git a/src/GenericAprilBot.ts b/src/GenericAprilBot.ts new file mode 100644 index 0000000..d671b86 --- /dev/null +++ b/src/GenericAprilBot.ts @@ -0,0 +1,27 @@ +import { SocketModeClient } from '@slack/socket-mode'; +import { WebClient } from '@slack/web-api'; + +abstract class GenericAprilBot { + private readonly userToken: string; + + private readonly appToken: string; + + protected readonly socketModeClient: SocketModeClient; + + protected readonly webClient: WebClient; + + constructor(userToken: string, appToken: string) { + this.userToken = userToken; + this.appToken = appToken; + this.socketModeClient = new SocketModeClient({ + appToken: this.appToken, + }); + this.webClient = new WebClient(this.userToken); + } + + public async start() { + await this.socketModeClient.start(); + } +} + +export { GenericAprilBot }; diff --git a/src/index.ts b/src/index.ts index e69de29..da8a360 100644 --- a/src/index.ts +++ b/src/index.ts @@ -0,0 +1,20 @@ +import { requireEnv } from 'require-env-variable'; +import { AprilBot } from './AprilBot'; +import { getLogger } from './logger'; + +const logger = getLogger(); + +const { SOCKET_TOKEN, V2_BOT_TOKEN } = requireEnv( + 'SOCKET_TOKEN', + 'V2_BOT_TOKEN', +); + +const aprilBot = new AprilBot(V2_BOT_TOKEN, SOCKET_TOKEN); +aprilBot + .start() + .then(() => { + logger.info('April has started!'); + }) + .catch((error) => { + logger.error(error); + }); From bee9f6fd32354c10b6e0756c80f3fcf892cdeabc Mon Sep 17 00:00:00 2001 From: Dan Schultz Date: Tue, 2 Apr 2024 00:28:34 -0400 Subject: [PATCH 3/5] Update Slack dependency --- package.json | 2 +- yarn.lock | 57 +++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 2502140..93af5a0 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ }, "dependencies": { "@slack/socket-mode": "^1.3.4", - "@slack/web-api": "^6.1.0", + "@slack/web-api": "^7.0.2", "pino": "^8.19.0", "pino-pretty": "^11.0.0", "require-env-variable": "^4.0.2" diff --git a/yarn.lock b/yarn.lock index e9350c1..e8e8498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -111,6 +111,13 @@ dependencies: "@types/node" ">=12.0.0" +"@slack/logger@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@slack/logger/-/logger-4.0.0.tgz#788303ff1840be91bdad7711ef66ca0cbc7073d2" + integrity sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA== + dependencies: + "@types/node" ">=18.0.0" + "@slack/socket-mode@^1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@slack/socket-mode/-/socket-mode-1.3.4.tgz#0bf3ccccda1dab851a456ede3b068a182fd4b476" @@ -127,12 +134,12 @@ p-queue "^2.4.2" ws "^7.5.3" -"@slack/types@^2.11.0": +"@slack/types@^2.11.0", "@slack/types@^2.9.0": version "2.11.0" resolved "https://registry.yarnpkg.com/@slack/types/-/types-2.11.0.tgz#948c556081c3db977dfa8433490cc2ff41f47203" integrity sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ== -"@slack/web-api@^6.1.0", "@slack/web-api@^6.11.2": +"@slack/web-api@^6.11.2": version "6.12.0" resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-6.12.0.tgz#d0487d90e3db2f7bfabe3430fa5da0cc03d2d9cb" integrity sha512-RPw6F8rWfGveGkZEJ4+4jUin5iazxRK2q3FpQDz/FvdgzC3nZmPyLx8WRzc6nh0w3MBjEbphNnp2VZksfhpBIQ== @@ -149,6 +156,23 @@ p-queue "^6.6.1" p-retry "^4.0.0" +"@slack/web-api@^7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@slack/web-api/-/web-api-7.0.2.tgz#1291d3af201517d75f04df1170d6cb833c44a778" + integrity sha512-nY1KO+7i4iURihThS1kMOElzesx4jqRJtkxLS9FOT8Debh7vQAzzbzxpMB4QauSs15030eyJ16HCf1IfCT4BKQ== + dependencies: + "@slack/logger" "^4.0.0" + "@slack/types" "^2.9.0" + "@types/node" ">=18.0.0" + axios "^1.6.5" + eventemitter3 "^5.0.1" + form-data "^4.0.0" + is-electron "2.2.2" + is-stream "^2" + p-queue "^6" + p-retry "^4" + retry "^0.13.1" + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -191,7 +215,7 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@*", "@types/node@>=12.0.0", "@types/node@^20.12.2": +"@types/node@*", "@types/node@>=12.0.0", "@types/node@>=18.0.0", "@types/node@^20.12.2": version "20.12.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== @@ -203,7 +227,7 @@ resolved "https://registry.npmjs.org/@types/p-queue/-/p-queue-2.3.2.tgz" integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== -"@types/retry@^0.12.0": +"@types/retry@0.12.0", "@types/retry@^0.12.0": version "0.12.0" resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== @@ -968,6 +992,11 @@ eventemitter3@^4.0.4: resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -1435,6 +1464,11 @@ is-stream@^1.1.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz" @@ -1735,7 +1769,7 @@ p-queue@^2.4.2: resolved "https://registry.npmjs.org/p-queue/-/p-queue-2.4.2.tgz" integrity sha512-n8/y+yDJwBjoLQe1GSJbbaYQLTI7QHNZI2+rpmCDbe++WLf9HC3gf6iqj5yfPAV71W4UF3ql5W1+UBPXoXTxng== -p-queue@^6.6.1: +p-queue@^6, p-queue@^6.6.1: version "6.6.2" resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== @@ -1743,6 +1777,14 @@ p-queue@^6.6.1: eventemitter3 "^4.0.4" p-timeout "^3.2.0" +p-retry@^4: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + p-retry@^4.0.0: version "4.4.0" resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.4.0.tgz" @@ -1948,6 +1990,11 @@ retry@^0.12.0: resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" From 2975e830d24d127cb5b5b5eea131378f921ea12c Mon Sep 17 00:00:00 2001 From: Dan Schultz Date: Tue, 2 Apr 2024 01:13:22 -0400 Subject: [PATCH 4/5] Set up generic AprilBot This boilerplate creates some basic AprilBot functionality for connecting to slack and handling some basic types of interactions. I had to create types for the event handlers for now, though I opened an issue in the Slack sdk in the hopes they might add types [1] to their events. This also swaps out the class-methods-use-this lint rule for a smarter variety, which is probably something that the upstream maintainer should consider adding as well [2]. [1] https://github.com/slackapi/node-slack-sdk/issues/1768 [2] https://github.com/iamturns/eslint-config-airbnb-typescript/issues/344 --- .eslintrc.json | 7 ++++++ src/AprilBot.ts | 36 ++++++++++++++++++++++++++--- src/GenericAprilBot.ts | 23 +++++++++++++++++- src/logger.ts | 1 + src/types/MessageEvent.ts | 31 +++++++++++++++++++++++++ src/types/ReactionAddedEvent.ts | 14 +++++++++++ src/types/ReactionRemovedEvent.ts | 14 +++++++++++ src/types/SocketModeEventPayload.ts | 6 +++++ src/types/index.ts | 4 ++++ 9 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 src/types/MessageEvent.ts create mode 100644 src/types/ReactionAddedEvent.ts create mode 100644 src/types/ReactionRemovedEvent.ts create mode 100644 src/types/SocketModeEventPayload.ts create mode 100644 src/types/index.ts diff --git a/.eslintrc.json b/.eslintrc.json index 36fcae4..695c6b2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -16,6 +16,13 @@ "import/prefer-default-export": "off", "import/no-default-export": "error", "@typescript-eslint/prefer-readonly-parameter-types": "off", + "class-methods-use-this": "off", + "@typescript-eslint/class-methods-use-this": [ + "error", + { + "ignoreOverrideMethods": true + } + ], "import/order": [ "error", { diff --git a/src/AprilBot.ts b/src/AprilBot.ts index 87a5cb6..c3f0046 100644 --- a/src/AprilBot.ts +++ b/src/AprilBot.ts @@ -1,13 +1,43 @@ import { GenericAprilBot } from './GenericAprilBot'; +import { getLogger } from './logger'; +import type { + SocketModeEventPayload, + ReactionAddedEvent, + ReactionRemovedEvent, + MessageEvent, +} from './types'; + +const logger = getLogger(); class AprilBot extends GenericAprilBot { constructor(userToken: string, appToken: string) { super(userToken, appToken); + logger.debug('AprilBot is constructed'); } - public async start() { - await super.start(); - } + protected override handleMessage = ({ + ack, + event, + }: SocketModeEventPayload) => { + ack(); + logger.debug(event, 'handleMessage'); + }; + + protected override handleReactionAdded = ({ + ack, + event, + }: SocketModeEventPayload) => { + ack(); + logger.debug(event, 'handleReactionAdded'); + }; + + protected override handleReactionRemoved = ({ + ack, + event, + }: SocketModeEventPayload) => { + ack(); + logger.debug(event, 'handleReactionRemoved'); + }; } export { AprilBot }; diff --git a/src/GenericAprilBot.ts b/src/GenericAprilBot.ts index d671b86..fc1fc4e 100644 --- a/src/GenericAprilBot.ts +++ b/src/GenericAprilBot.ts @@ -1,5 +1,11 @@ import { SocketModeClient } from '@slack/socket-mode'; import { WebClient } from '@slack/web-api'; +import type { + SocketModeEventPayload, + ReactionAddedEvent, + ReactionRemovedEvent, + MessageEvent, +} from './types'; abstract class GenericAprilBot { private readonly userToken: string; @@ -19,9 +25,24 @@ abstract class GenericAprilBot { this.webClient = new WebClient(this.userToken); } - public async start() { + public async start(): Promise { + this.socketModeClient.on('message', this.handleMessage); + this.socketModeClient.on('reaction_added', this.handleReactionAdded); + this.socketModeClient.on('reaction_removed', this.handleReactionRemoved); await this.socketModeClient.start(); } + + protected abstract handleMessage: ( + args: SocketModeEventPayload, + ) => void; + + protected abstract handleReactionAdded: ( + args: SocketModeEventPayload, + ) => void; + + protected abstract handleReactionRemoved: ( + args: SocketModeEventPayload, + ) => void; } export { GenericAprilBot }; diff --git a/src/logger.ts b/src/logger.ts index ab71b4a..7cc9a7b 100644 --- a/src/logger.ts +++ b/src/logger.ts @@ -2,6 +2,7 @@ import pino from 'pino'; const getLogger = () => pino({ + level: process.env.LOG_LEVEL ?? 'info', transport: { target: 'pino-pretty', options: { diff --git a/src/types/MessageEvent.ts b/src/types/MessageEvent.ts new file mode 100644 index 0000000..de3d2e4 --- /dev/null +++ b/src/types/MessageEvent.ts @@ -0,0 +1,31 @@ +interface MessageEvent { + user: string; + type: string; + ts: string; + client_msg_id: string; + text: string; + team: string; + thread_ts?: string; + blocks: MessageBlock[]; + channel: string; + event_ts: string; + channel_type: string; +} + +interface MessageBlock { + type: string; + block_id: string; + elements: BlockElement[]; +} + +interface BlockElement { + type: string[]; + elements: BlockElementElement[]; +} + +interface BlockElementElement { + type: string; + text: string; +} + +export { MessageEvent }; diff --git a/src/types/ReactionAddedEvent.ts b/src/types/ReactionAddedEvent.ts new file mode 100644 index 0000000..7b99741 --- /dev/null +++ b/src/types/ReactionAddedEvent.ts @@ -0,0 +1,14 @@ +interface ReactionAddedEvent { + type: string; + user: string; + reaction: string; + item: { + type: string; + channel: string; + ts: string; + }; + item_user: string; + event_ts: string; +} + +export { ReactionAddedEvent }; diff --git a/src/types/ReactionRemovedEvent.ts b/src/types/ReactionRemovedEvent.ts new file mode 100644 index 0000000..9087ed1 --- /dev/null +++ b/src/types/ReactionRemovedEvent.ts @@ -0,0 +1,14 @@ +interface ReactionRemovedEvent { + type: string; + user: string; + reaction: string; + item: { + type: string; + channel: string; + ts: string; + }; + item_user: string; + event_ts: string; +} + +export { ReactionRemovedEvent }; diff --git a/src/types/SocketModeEventPayload.ts b/src/types/SocketModeEventPayload.ts new file mode 100644 index 0000000..59a0eb8 --- /dev/null +++ b/src/types/SocketModeEventPayload.ts @@ -0,0 +1,6 @@ +interface SocketModeEventPayload { + event: T; + ack: () => void; +} + +export { SocketModeEventPayload }; diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..18a092e --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,4 @@ +export * from './MessageEvent'; +export * from './ReactionAddedEvent'; +export * from './ReactionRemovedEvent'; +export * from './SocketModeEventPayload'; From 4d411701af575ecedccc36407e72165c8ad3daed Mon Sep 17 00:00:00 2001 From: Dan Schultz Date: Tue, 2 Apr 2024 01:30:11 -0400 Subject: [PATCH 5/5] Load users on start --- src/GenericAprilBot.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/GenericAprilBot.ts b/src/GenericAprilBot.ts index fc1fc4e..74523eb 100644 --- a/src/GenericAprilBot.ts +++ b/src/GenericAprilBot.ts @@ -1,5 +1,7 @@ import { SocketModeClient } from '@slack/socket-mode'; import { WebClient } from '@slack/web-api'; +import { getLogger } from './logger'; +import type { Member } from '@slack/web-api/dist/types/response/UsersListResponse'; import type { SocketModeEventPayload, ReactionAddedEvent, @@ -7,6 +9,8 @@ import type { MessageEvent, } from './types'; +const logger = getLogger(); + abstract class GenericAprilBot { private readonly userToken: string; @@ -16,6 +20,8 @@ abstract class GenericAprilBot { protected readonly webClient: WebClient; + protected users: Member[] = []; + constructor(userToken: string, appToken: string) { this.userToken = userToken; this.appToken = appToken; @@ -26,12 +32,24 @@ abstract class GenericAprilBot { } public async start(): Promise { + this.users = await this.loadUsers(); this.socketModeClient.on('message', this.handleMessage); this.socketModeClient.on('reaction_added', this.handleReactionAdded); this.socketModeClient.on('reaction_removed', this.handleReactionRemoved); await this.socketModeClient.start(); } + private async loadUsers(): Promise { + logger.debug('Loading users...'); + const result = await this.webClient.users.list({}); + if (!result.ok || result.members === undefined) { + logger.error(result.error); + throw new Error('Unable to load users.'); + } + logger.debug(`${result.members?.length} Users loaded.`); + return result.members; + } + protected abstract handleMessage: ( args: SocketModeEventPayload, ) => void;