diff --git a/package.json b/package.json index 1cef146..90b14a4 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "tsm": "^2.3.0" }, "devDependencies": { - "@cloudflare/workers-types": "^4.20231025.0", + "@cloudflare/workers-types": "^4.20240903.0", "@types/node": "^18.17.18", "@types/node-schedule": "^2.1.0", "@typescript-eslint/eslint-plugin": "^6.10.0", @@ -50,7 +50,7 @@ "eslint-plugin-prettier": "^5.0.1", "prettier": "^3.0.3", "typescript": "^5.2.2", - "wrangler": "^3.17.1" + "wrangler": "^3.74.0" }, "license": "MIT" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1765342..f142f91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,8 +53,8 @@ dependencies: devDependencies: '@cloudflare/workers-types': - specifier: ^4.20231025.0 - version: 4.20231025.0 + specifier: ^4.20240903.0 + version: 4.20240903.0 '@types/node': specifier: ^18.17.18 version: 18.17.18 @@ -83,8 +83,8 @@ devDependencies: specifier: ^5.2.2 version: 5.2.2 wrangler: - specifier: ^3.17.1 - version: 3.17.1 + specifier: ^3.74.0 + version: 3.74.0(@cloudflare/workers-types@4.20240903.0) packages: @@ -189,14 +189,15 @@ packages: '@algolia/requester-common': 4.20.0 dev: false - /@cloudflare/kv-asset-handler@0.2.0: - resolution: {integrity: sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==} + /@cloudflare/kv-asset-handler@0.3.4: + resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} + engines: {node: '>=16.13'} dependencies: mime: 3.0.0 dev: true - /@cloudflare/workerd-darwin-64@1.20231030.0: - resolution: {integrity: sha512-J4PQ9utPxLya9yHdMMx3AZeC5M/6FxcoYw6jo9jbDDFTy+a4Gslqf4Im9We3aeOEdPXa3tgQHVQOSelJSZLhIw==} + /@cloudflare/workerd-darwin-64@1.20240821.1: + resolution: {integrity: sha512-CDBpfZKrSy4YrIdqS84z67r3Tzal2pOhjCsIb63IuCnvVes59/ft1qhczBzk9EffeOE2iTCrA4YBT7Sbn7USew==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -204,8 +205,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-darwin-arm64@1.20231030.0: - resolution: {integrity: sha512-WSJJjm11Del4hSneiNB7wTXGtBXI4QMCH9l5qf4iT5PAW8cESGcCmdHtWDWDtGAAGcvmLT04KNvmum92vRKKQQ==} + /@cloudflare/workerd-darwin-arm64@1.20240821.1: + resolution: {integrity: sha512-Q+9RedvNbPcEt/dKni1oN94OxbvuNAeJkgHmrLFTGF8zu21wzOhVkQeRNxcYxrMa9mfStc457NAg13OVCj2kHQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -213,8 +214,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-64@1.20231030.0: - resolution: {integrity: sha512-2HUeRTvoCC17fxE0qdBeR7J9dO8j4A8ZbdcvY8pZxdk+zERU6+N03RTbk/dQMU488PwiDvcC3zZqS4gwLfVT8g==} + /@cloudflare/workerd-linux-64@1.20240821.1: + resolution: {integrity: sha512-j6z3KsPtawrscoLuP985LbqFrmsJL6q1mvSXOXTqXGODAHIzGBipHARdOjms3UQqovzvqB2lQaQsZtLBwCZxtA==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -222,8 +223,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-linux-arm64@1.20231030.0: - resolution: {integrity: sha512-4/GK5zHh+9JbUI6Z5xTCM0ZmpKKHk7vu9thmHjUxtz+o8Ne9DoD7DlDvXQWgMF6XGaTubDWyp3ttn+Qv8jDFuQ==} + /@cloudflare/workerd-linux-arm64@1.20240821.1: + resolution: {integrity: sha512-I9bHgZOxJQW0CV5gTdilyxzTG7ILzbTirehQWgfPx9X77E/7eIbR9sboOMgyeC69W4he0SKtpx0sYZuTJu4ERw==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -231,8 +232,8 @@ packages: dev: true optional: true - /@cloudflare/workerd-windows-64@1.20231030.0: - resolution: {integrity: sha512-fb/Jgj8Yqy3PO1jLhk7mTrHMkR8jklpbQFud6rL/aMAn5d6MQbaSrYOCjzkKGp0Zng8D2LIzSl+Fc0C9Sggxjg==} + /@cloudflare/workerd-windows-64@1.20240821.1: + resolution: {integrity: sha512-keC97QPArs6LWbPejQM7/Y8Jy8QqyaZow4/ZdsGo+QjlOLiZRDpAenfZx3CBUoWwEeFwQTl2FLO+8hV1SWFFYw==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -240,8 +241,20 @@ packages: dev: true optional: true - /@cloudflare/workers-types@4.20231025.0: - resolution: {integrity: sha512-TkcZkntUTOcvJ4vgmwpNfLTclpMbmbClZCe62B25/VTukmyv91joRa4eKzSjzCZUXTbFHNmVdOpmGaaJU2U3+A==} + /@cloudflare/workers-shared@0.4.1: + resolution: {integrity: sha512-nYh4r8JwOOjYIdH2zub++CmIKlkYFlpxI1nBHimoiHcytJXD/b7ldJ21TtfzUZMCgI78mxVlymMHA/ReaOxKlA==} + engines: {node: '>=16.7.0'} + dev: true + + /@cloudflare/workers-types@4.20240903.0: + resolution: {integrity: sha512-a4mqgtVsPWg3JNNlQdLRE0Z6/mHr/uXa1ANDw6Zd7in438UCbeb+j7Z954Sf93G24jExpAn9VZ8kUUml0RwZbQ==} + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 dev: true /@discordjs/builders@1.7.0: @@ -652,6 +665,22 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1142,10 +1171,6 @@ packages: dependencies: fill-range: 7.0.1 - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -1235,6 +1260,10 @@ packages: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} dev: true + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1274,6 +1303,10 @@ packages: engines: {node: '>=12'} dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: false @@ -1830,6 +1863,10 @@ packages: dev: true optional: true + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + /get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} dependencies: @@ -1897,6 +1934,13 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + /html-entities@2.4.0: resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} dev: false @@ -1947,6 +1991,13 @@ packages: binary-extensions: 2.2.0 dev: true + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + dev: true + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2136,21 +2187,21 @@ packages: engines: {node: '>=12'} dev: true - /miniflare@3.20231030.1: - resolution: {integrity: sha512-Y+EkgV/aFg/3Y/xfFtImK36sLZGXvNS45avVEz0cUCA2pGpg4hGdPu1Udmz5b06SyeUEFVf/dEDMJwdRYVEgLw==} + /miniflare@3.20240821.1: + resolution: {integrity: sha512-81qdiryDG7VXzZuoa0EwhkaIYYrn7+StRIrd/2i7SPqPUNICUBjbhFFKqTnvE1+fqIPPB6l8ShKFaFvmnZOASg==} engines: {node: '>=16.13'} hasBin: true dependencies: + '@cspotcode/source-map-support': 0.8.1 acorn: 8.11.2 acorn-walk: 8.3.0 capnp-ts: 0.7.0 exit-hook: 2.2.1 glob-to-regexp: 0.4.1 - source-map-support: 0.5.21 stoppable: 1.1.0 - undici: 5.27.2 - workerd: 1.20231030.0 - ws: 8.14.2 + undici: 5.28.4 + workerd: 1.20240821.1 + ws: 8.18.0 youch: 3.3.3 zod: 3.22.4 transitivePeerDependencies: @@ -2230,6 +2281,10 @@ packages: path-key: 4.0.0 dev: true + /ohash@1.1.3: + resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -2326,6 +2381,10 @@ packages: engines: {node: '>=12'} dev: true + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} dev: true @@ -2335,6 +2394,10 @@ packages: engines: {node: '>=8'} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true @@ -2394,6 +2457,15 @@ packages: engines: {node: '>=10'} dev: true + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2488,13 +2560,6 @@ packages: resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} dev: false - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -2555,6 +2620,11 @@ packages: dependencies: has-flag: 4.0.0 + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2644,17 +2714,38 @@ packages: hasBin: true dev: true + /ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + dev: true + /undici@5.27.2: resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.0 + dev: false + + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.0 + dev: true /undici@6.13.0: resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} engines: {node: '>=18.0'} dev: false + /unenv-nightly@2.0.0-1724863496.70db6f1: + resolution: {integrity: sha512-r+VIl1gnsI4WQxluruSQhy8alpAf1AsLRLm4sEKp3otCyTIVD6I6wHEYzeQnwsyWgaD4+3BD4A/eqrgOpdTzhw==} + dependencies: + defu: 6.1.4 + ohash: 1.1.3 + pathe: 1.1.2 + ufo: 1.5.4 + dev: true + /universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} dev: false @@ -2678,37 +2769,47 @@ packages: isexe: 2.0.0 dev: true - /workerd@1.20231030.0: - resolution: {integrity: sha512-+FSW+d31f8RrjHanFf/R9A+Z0csf3OtsvzdPmAKuwuZm/5HrBv83cvG9fFeTxl7/nI6irUUXIRF9xcj/NomQzQ==} + /workerd@1.20240821.1: + resolution: {integrity: sha512-y4phjCnEG96u8ZkgkkHB+gSw0i6uMNo23rBmixylWpjxDklB+LWD8dztasvsu7xGaZbLoTxQESdEw956F7VJDA==} engines: {node: '>=16'} hasBin: true requiresBuild: true optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20231030.0 - '@cloudflare/workerd-darwin-arm64': 1.20231030.0 - '@cloudflare/workerd-linux-64': 1.20231030.0 - '@cloudflare/workerd-linux-arm64': 1.20231030.0 - '@cloudflare/workerd-windows-64': 1.20231030.0 + '@cloudflare/workerd-darwin-64': 1.20240821.1 + '@cloudflare/workerd-darwin-arm64': 1.20240821.1 + '@cloudflare/workerd-linux-64': 1.20240821.1 + '@cloudflare/workerd-linux-arm64': 1.20240821.1 + '@cloudflare/workerd-windows-64': 1.20240821.1 dev: true - /wrangler@3.17.1: - resolution: {integrity: sha512-Pr9+/tjFkthzG63uoVm1NtVvgokT6p92fy1UsOgrntHyTu0pZMC1VJzG0NC8Vhs+z/+yTT8AqVV6AiJb3w8ZOQ==} + /wrangler@3.74.0(@cloudflare/workers-types@4.20240903.0): + resolution: {integrity: sha512-wmtb+tQrgb61yN+Wa2JM98G1Gt4tKFRYPw6xwuyzUcA74L+Dum1A13w22/manl9Gq1jA3dPn+7UzT5sYEVHRog==} engines: {node: '>=16.17.0'} hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20240821.1 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true dependencies: - '@cloudflare/kv-asset-handler': 0.2.0 + '@cloudflare/kv-asset-handler': 0.3.4 + '@cloudflare/workers-shared': 0.4.1 + '@cloudflare/workers-types': 4.20240903.0 '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 chokidar: 3.5.3 + date-fns: 3.6.0 esbuild: 0.17.19 - miniflare: 3.20231030.1 + miniflare: 3.20240821.1 nanoid: 3.3.7 path-to-regexp: 6.2.1 + resolve: 1.22.8 resolve.exports: 2.0.2 selfsigned: 2.4.1 source-map: 0.6.1 - source-map-support: 0.5.21 + unenv: /unenv-nightly@2.0.0-1724863496.70db6f1 + workerd: 1.20240821.1 xxhash-wasm: 1.0.2 optionalDependencies: fsevents: 2.3.3 @@ -2721,19 +2822,6 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - /ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -2745,7 +2833,6 @@ packages: optional: true utf-8-validate: optional: true - dev: false /xxhash-wasm@1.0.2: resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} diff --git a/src/scheduled/weeklyStatistics.ts b/src/scheduled/weeklyStatistics.ts index 26bb35a..393ccd7 100644 --- a/src/scheduled/weeklyStatistics.ts +++ b/src/scheduled/weeklyStatistics.ts @@ -1,199 +1,150 @@ -import type { Client, EmbedBuilder, ForumChannel, Guild, GuildForumTag, TextChannel } from 'discord.js'; -import { getDefaultEmbed } from '../utils/embeds.js'; +import { Client, EmbedBuilder, ForumChannel, Guild, GuildForumTag, TextChannel } from 'discord.js'; + +function getDefaultEmbed() { + return new EmbedBuilder().setColor([0xff, 0x5d, 0x00]); +} const getTagName = async (guild: Guild, fullTagList: GuildForumTag[], id: string) => { const forumTag = fullTagList.find((tag) => tag.id === id); + if (!forumTag) return 'No Tag Found'; let emoji = ''; - - if (forumTag) { - if (forumTag.emoji) { - if (forumTag.emoji.id) { - const guildEmoji = await guild.emojis.fetch(forumTag.emoji.id); - emoji = `<${guildEmoji.animated ? 'a' : ''}:${guildEmoji.name}:${guildEmoji.id}> `; - } else { - emoji = `${forumTag.emoji.name!} `; - } + if (forumTag.emoji) { + if (forumTag.emoji.id) { + const guildEmoji = await guild.emojis.fetch(forumTag.emoji.id); + emoji = `<${guildEmoji.animated ? 'a' : ''}:${guildEmoji.name}:${guildEmoji.id}> `; + } else { + emoji = `${forumTag.emoji.name} `; } - - return `${emoji}${forumTag?.name}`; } + + return `${emoji}${forumTag.name}`; }; export default { time: process.env.STATS_SCHEDULE, async execute(client: Client) { - if (!process.env.GUILD_ID) { - console.warn('No GUILD_ID enviroment variable was set. Skipping weekly statistics'); - return; - } - - const guild = await client.guilds.fetch(process.env.GUILD_ID); - await guild.fetch(); + const guildId = process.env.GUILD_ID; + const supportChannelId = process.env.SUPPORT_CHANNEL; + const supportSquadChannelId = process.env.SUPPORT_SQUAD_CHANNEL; - if (!process.env.SUPPORT_CHANNEL) { - console.warn('No SUPPORT_CHANNEL enviroment variable was set. Skipping weekly statistics'); + if (!guildId || !supportChannelId || !supportSquadChannelId) { + console.warn('Missing required environment variables. Skipping weekly statistics.'); return; } - const forum: ForumChannel = (await guild.channels.fetch(process.env.SUPPORT_CHANNEL)) as ForumChannel; + const guild = await client.guilds.fetch(guildId); + const forum = (await guild.channels.fetch(supportChannelId)) as ForumChannel; + const channel = (await client.channels.fetch(supportSquadChannelId)) as TextChannel; const lastInterval = new Date(); lastInterval.setDate(lastInterval.getDate() - 7); - const _threads = (await Promise.all([forum.threads.fetch(), forum.threads.fetchArchived()])).map((t) => - t.threads.filter((x) => x.createdAt! > lastInterval) - ); - const threads = [..._threads[0].values(), ..._threads[1].values()]; + const [openThreads, archivedThreads] = await Promise.all([forum.threads.fetch(), forum.threads.fetchArchived()]); - // const threads = (await forum.threads.fetch()).threads.filter((x) => x.createdAt! > lastInterval) + const threads = [ + ...openThreads.threads.filter((thread) => thread.createdAt! > lastInterval).values(), + ...archivedThreads.threads.filter((thread) => thread.createdAt! > lastInterval).values(), + ]; - if (!process.env.SUPPORT_SQUAD_CHANNEL) { - console.warn('No SUPPORT_SQUAD_CHANNEL enviroment variable was set. Skipping weekly statistics'); - return; - } - - const channel = (await client.channels.fetch(process.env.SUPPORT_SQUAD_CHANNEL)!) as TextChannel; - - const titleEmbed = getDefaultEmbed().setTitle('Weekly support statistics'); - - const embeds: EmbedBuilder[] = []; - embeds.push(titleEmbed); + const titleEmbed = getDefaultEmbed().setTitle('Weekly Support Statistics'); + const embeds: EmbedBuilder[] = [titleEmbed]; const unsortedTags: { [tag: string]: { [subTag: string]: number } } = {}; - const newMembers = new Set(); + const newMembers = new Set(); const errors: [string, string][] = []; let postsByNewMembers = 0; let linkedToDocs = 0; let cumulativeResponse = 0; - // biome-ignore lint/complexity/noForEach: - for (const thread of threads.values()) { + for (const thread of threads) { try { - const first = (await thread.messages.fetch()).at(-2); + const messages = await thread.messages.fetch(); + const first = messages.at(-2); const starterMessage = await thread.fetchStarterMessage(); + if (first?.content.includes('https://docs.astro.build')) linkedToDocs++; - if (first && starterMessage) cumulativeResponse += first?.createdTimestamp - starterMessage?.createdTimestamp; + if (first && starterMessage) { + cumulativeResponse += first.createdTimestamp - starterMessage.createdTimestamp; + } - // check for posts from new members const owner = await thread.fetchOwner(); - if (owner) { const member = await guild.members.fetch(owner.id); if (member?.joinedAt && member.joinedAt > lastInterval) { - newMembers.add(owner.user?.id); + newMembers.add(owner.user?.id ?? ''); postsByNewMembers++; } - } else { - console.log('NO OWNER'); } - thread.appliedTags.forEach((tag) => { - if (!unsortedTags[tag]) { - unsortedTags[tag] = {}; - } - - thread.appliedTags.forEach((subTag) => { - if (!unsortedTags[tag][subTag]) { - unsortedTags[tag][subTag] = 0; - } - + for (const tag of thread.appliedTags) { + if (!unsortedTags[tag]) unsortedTags[tag] = {}; + for (const subTag of thread.appliedTags) { + if (!unsortedTags[tag][subTag]) unsortedTags[tag][subTag] = 0; unsortedTags[tag][subTag]++; - }); - }); - } catch (err: any) { - err = err.toString(); - // 10008: unknown message (e.g. deleted message) - if (err.includes('10008')) continue; - errors.push([err, thread.id]); + } + } + } catch (err) { + const errorMessage = err instanceof Error ? err.toString() : 'Unknown error'; + if (!errorMessage.includes('10008')) errors.push([errorMessage, thread.id]); } } - const openEmbed = getDefaultEmbed(); - openEmbed.setTitle('New posts'); - openEmbed.setDescription( - `${_threads[0].size} open posts\n${_threads[1].size} closed posts\n${linkedToDocs} (${Math.round( - (linkedToDocs / threads.length) * 100 - )}%) include a link to docs in first response\nAverage response time of ${Math.round( - cumulativeResponse / threads.length / 1000 / 60 - )} minutes` - ); + const openEmbed = getDefaultEmbed() + .setTitle('New Posts') + .setDescription( + `${threads.filter((thread) => !thread.archived).length} open posts\n` + + `${threads.filter((thread) => thread.archived).length} closed posts\n` + + `${linkedToDocs} (${Math.round( + (linkedToDocs / threads.length) * 100 + )}%) include a link to docs in the first response\n` + + `Average response time: ${Math.round(cumulativeResponse / threads.length / 1000 / 60)} minutes` + ); embeds.push(openEmbed); - const memberEmbed = getDefaultEmbed(); - memberEmbed.setTitle('Posts from new members'); - memberEmbed.setDescription( - `${newMembers.size} new members posting in <#${process.env.SUPPORT_CHANNEL}>\n${Math.round( - (postsByNewMembers / threads.length) * 100 - )}% of posts by new members` - ); + const memberEmbed = getDefaultEmbed() + .setTitle('Posts from New Members') + .setDescription( + `${newMembers.size} new members posting in <#${supportChannelId}>\n` + + `${Math.round((postsByNewMembers / threads.length) * 100)}% of posts by new members` + ); embeds.push(memberEmbed); let description = ''; let embedCount = 0; - - let tags = Object.fromEntries( - Object.entries(unsortedTags) - .sort((a, b) => { - return unsortedTags[a[0]][a[0]] - unsortedTags[b[0]][b[0]]; - }) - .reverse() + const tags = Object.fromEntries( + Object.entries(unsortedTags).sort((a, b) => unsortedTags[b[0]][b[0]] - unsortedTags[a[0]][a[0]]) ); for (const tagId in tags) { const tagName = await getTagName(guild, forum.availableTags, tagId); let localDescription = `**${tagName}** (${tags[tagId][tagId]})\n`; - /** Sub tags sorted descending by count, excluding tags that show up just once. */ - // const subTags = Object.entries(tags[tagId]) - // .sort(([, countA], [, countB]) => countB - countA) - // .filter(([subTagId, count]) => subTagId !== tagId && count > 1); - - // if (subTags.length) { - // const subDescriptions = []; - // for (const [id, count] of subTags) { - // const subTagName = await getTagName(guild, forum.availableTags, id); - // subDescriptions.push(`${subTagName} (${count})`); - // } - // localDescription += `+ ${subDescriptions.join(' / ')}\n`; - // } - localDescription += '\n'; if (description.length + localDescription.length > 4096) { - let embed = getDefaultEmbed(); - - if (embedCount == 0) { - embed.setTitle('Tags'); - } - - embed.setDescription(description); - description = ''; + const embed = getDefaultEmbed() + .setTitle(embedCount === 0 ? 'Tags' : '') + .setDescription(description); embeds.push(embed); - embedCount += 1; + description = ''; + embedCount++; } description += localDescription; } - let embed = getDefaultEmbed(); - - if (embedCount == 0) { - embed.setTitle('Tags'); - } - - embed.setDescription(description || 'failed'); - embeds.push(embed); + const finalEmbed = getDefaultEmbed() + .setTitle(embedCount === 0 ? 'Tags' : '') + .setDescription(description || 'No tags available'); + embeds.push(finalEmbed); if (errors.length) { - const errorEmbed = getDefaultEmbed(); - errorEmbed.setTitle('Errors'); - errorEmbed.setDescription(errors.map(([err, id]) => `<#${id}>: ${err}`).join('\n')); + const errorEmbed = getDefaultEmbed() + .setTitle('Errors') + .setDescription(errors.map(([err, id]) => `<#${id}>: ${err}`).join('\n')); embeds.push(errorEmbed); } - - for (let i = 0; i < embeds.length; i++) { - channel.send({ embeds: [embeds[i]] }); - } + await channel.send({ embeds }); }, };