diff --git a/flake.nix b/flake.nix index bbf7aee2..8d3d7b81 100644 --- a/flake.nix +++ b/flake.nix @@ -47,7 +47,7 @@ ${config.pre-commit.installationScript} ''; nativeBuildInputs = [config.proc.groups.daemons.package]; - packages = with pkgs; [nodePackages.pnpm]; + packages = with pkgs; [nodePackages.pnpm redis]; }; formatter = pkgs.alejandra; }; diff --git a/package.json b/package.json index d8cadcf3..f44a1b73 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "just-random": "3.2.0", "kleur": "4.1.5", "redis": "4.6.10", - "tsx": "3.13.0" + "tsx": "4.1.1" }, "devDependencies": { "@types/node": "20.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f98f15fd..3634f9cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ dependencies: version: 8.0.0(@octokit/core@5.0.1) cron: specifier: ^3.1.0 - version: 3.1.6 + version: 3.1.0 discord.js: specifier: 14.13.0 version: 14.13.0 @@ -42,8 +42,8 @@ dependencies: specifier: 4.6.10 version: 4.6.10 tsx: - specifier: 3.13.0 - version: 3.13.0 + specifier: 4.1.1 + version: 4.1.1 devDependencies: '@types/node': @@ -78,17 +78,17 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@discordjs/builders@1.7.0: - resolution: {integrity: sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==} + /@discordjs/builders@1.6.5: + resolution: {integrity: sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg==} engines: {node: '>=16.11.0'} dependencies: - '@discordjs/formatters': 0.3.3 - '@discordjs/util': 1.0.2 - '@sapphire/shapeshift': 3.9.3 - discord-api-types: 0.37.61 + '@discordjs/formatters': 0.3.2 + '@discordjs/util': 1.0.1 + '@sapphire/shapeshift': 3.9.2 + discord-api-types: 0.37.50 fast-deep-equal: 3.1.3 ts-mixer: 6.0.3 - tslib: 2.6.2 + tslib: 2.6.1 dev: false /@discordjs/collection@1.5.3: @@ -101,11 +101,11 @@ packages: engines: {node: '>=18'} dev: false - /@discordjs/formatters@0.3.3: - resolution: {integrity: sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==} + /@discordjs/formatters@0.3.2: + resolution: {integrity: sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA==} engines: {node: '>=16.11.0'} dependencies: - discord-api-types: 0.37.61 + discord-api-types: 0.37.50 dev: false /@discordjs/rest@2.1.0: @@ -123,24 +123,29 @@ packages: undici: 5.27.2 dev: false + /@discordjs/util@1.0.1: + resolution: {integrity: sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA==} + engines: {node: '>=16.11.0'} + dev: false + /@discordjs/util@1.0.2: resolution: {integrity: sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==} engines: {node: '>=16.11.0'} dev: false - /@discordjs/ws@1.0.2: - resolution: {integrity: sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==} + /@discordjs/ws@1.0.1: + resolution: {integrity: sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g==} engines: {node: '>=16.11.0'} dependencies: - '@discordjs/collection': 2.0.0 + '@discordjs/collection': 1.5.3 '@discordjs/rest': 2.1.0 - '@discordjs/util': 1.0.2 + '@discordjs/util': 1.0.1 '@sapphire/async-queue': 1.5.0 - '@types/ws': 8.5.9 + '@types/ws': 8.5.5 '@vladfrangu/async_event_emitter': 2.2.2 - discord-api-types: 0.37.61 - tslib: 2.6.2 - ws: 8.14.2 + discord-api-types: 0.37.50 + tslib: 2.6.1 + ws: 8.13.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -386,7 +391,7 @@ packages: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - fast-uri: 2.3.0 + fast-uri: 2.2.0 dev: false /@fastify/busboy@2.1.0: @@ -398,14 +403,14 @@ packages: resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} dev: false - /@fastify/error@3.4.1: - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + /@fastify/error@3.4.0: + resolution: {integrity: sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==} dev: false /@fastify/fast-json-stringify-compiler@4.3.0: resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} dependencies: - fast-json-stringify: 5.9.1 + fast-json-stringify: 5.8.0 dev: false /@humanwhocodes/config-array@0.11.13: @@ -460,33 +465,33 @@ packages: dependencies: '@octokit/auth-token': 4.0.0 '@octokit/graphql': 7.0.2 - '@octokit/request': 8.1.5 + '@octokit/request': 8.1.4 '@octokit/request-error': 5.0.1 - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 + universal-user-agent: 6.0.0 dev: false - /@octokit/endpoint@9.0.2: - resolution: {integrity: sha512-qhKW8YLIi+Kmc92FQUFGr++DYtkx/1fBv+Thua6baqnjnOsgBYJDCvWZR1YcINuHGOEQt416WOfE+A/oG60NBQ==} + /@octokit/endpoint@9.0.1: + resolution: {integrity: sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 is-plain-object: 5.0.0 - universal-user-agent: 6.0.1 + universal-user-agent: 6.0.0 dev: false /@octokit/graphql@7.0.2: resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 8.1.5 - '@octokit/types': 12.3.0 - universal-user-agent: 6.0.1 + '@octokit/request': 8.1.4 + '@octokit/types': 12.0.0 + universal-user-agent: 6.0.0 dev: false - /@octokit/openapi-types@19.0.2: - resolution: {integrity: sha512-8li32fUDUeml/ACRp/njCWTsk5t17cfTM1jp9n08pBrqs5cDFJubtjsSnuz56r5Tad6jdEPJld7LxNp9dNcyjQ==} + /@octokit/openapi-types@19.0.0: + resolution: {integrity: sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw==} dev: false /@octokit/plugin-paginate-rest@9.0.0(@octokit/core@5.0.1): @@ -496,7 +501,7 @@ packages: '@octokit/core': '>=5' dependencies: '@octokit/core': 5.0.1 - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 dev: false /@octokit/plugin-retry@6.0.1(@octokit/core@5.0.1): @@ -507,7 +512,7 @@ packages: dependencies: '@octokit/core': 5.0.1 '@octokit/request-error': 5.0.1 - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 bottleneck: 2.19.5 dev: false @@ -518,7 +523,7 @@ packages: '@octokit/core': ^5.0.0 dependencies: '@octokit/core': 5.0.1 - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 bottleneck: 2.19.5 dev: false @@ -526,26 +531,26 @@ packages: resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 deprecation: 2.3.1 once: 1.4.0 dev: false - /@octokit/request@8.1.5: - resolution: {integrity: sha512-zVKbNbX1xUluD9ZR4/tPs1yuYrK9xeh5fGZUXA6u04XGsTvomg0YO8/ZUC0FqAd49hAOEMFPAVUTh+2lBhOhLA==} + /@octokit/request@8.1.4: + resolution: {integrity: sha512-M0aaFfpGPEKrg7XoA/gwgRvc9MSXHRO2Ioki1qrPDbl1e9YhjIwVoHE7HIKmv/m3idzldj//xBujcFNqGX6ENA==} engines: {node: '>= 18'} dependencies: - '@octokit/endpoint': 9.0.2 + '@octokit/endpoint': 9.0.1 '@octokit/request-error': 5.0.1 - '@octokit/types': 12.3.0 + '@octokit/types': 12.0.0 is-plain-object: 5.0.0 - universal-user-agent: 6.0.1 + universal-user-agent: 6.0.0 dev: false - /@octokit/types@12.3.0: - resolution: {integrity: sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ==} + /@octokit/types@12.0.0: + resolution: {integrity: sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg==} dependencies: - '@octokit/openapi-types': 19.0.2 + '@octokit/openapi-types': 19.0.0 dev: false /@redis/bloom@1.2.0(@redis/client@1.5.11): @@ -602,8 +607,8 @@ packages: engines: {node: '>=v14.0.0', npm: '>=7.0.0'} dev: false - /@sapphire/shapeshift@3.9.3: - resolution: {integrity: sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ==} + /@sapphire/shapeshift@3.9.2: + resolution: {integrity: sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} dependencies: fast-deep-equal: 3.1.3 @@ -619,8 +624,8 @@ packages: resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} dev: true - /@types/luxon@3.3.4: - resolution: {integrity: sha512-H9OXxv4EzJwE75aTPKpiGXJq+y4LFxjpsdgKwSmr503P5DkWc3AG7VAFYrFNVvqemT5DfgZJV9itYhqBHSGujA==} + /@types/luxon@3.3.2: + resolution: {integrity: sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==} dev: false /@types/node@20.9.0: @@ -632,8 +637,8 @@ packages: resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} dev: true - /@types/ws@8.5.9: - resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} + /@types/ws@8.5.5: + resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: '@types/node': 20.9.0 dev: false @@ -1025,11 +1030,11 @@ packages: engines: {node: '>= 0.6'} dev: false - /cron@3.1.6: - resolution: {integrity: sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w==} + /cron@3.1.0: + resolution: {integrity: sha512-u6Z89TV7zhG7aW7MX7aLQhK5PYjTzFpzjFgiSX5r7qC1vjPvRt1FVfarHRaN/5IokEXM1DRJcXnwXI0e9G0awA==} dependencies: - '@types/luxon': 3.3.4 - luxon: 3.4.4 + '@types/luxon': 3.3.2 + luxon: 3.3.0 dev: false /cross-spawn@7.0.3: @@ -1109,20 +1114,20 @@ packages: resolution: {integrity: sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA==} engines: {node: '>=16.11.0'} dependencies: - '@discordjs/builders': 1.7.0 + '@discordjs/builders': 1.6.5 '@discordjs/collection': 1.5.3 - '@discordjs/formatters': 0.3.3 + '@discordjs/formatters': 0.3.2 '@discordjs/rest': 2.1.0 - '@discordjs/util': 1.0.2 - '@discordjs/ws': 1.0.2 + '@discordjs/util': 1.0.1 + '@discordjs/ws': 1.0.1 '@sapphire/snowflake': 3.5.1 - '@types/ws': 8.5.9 + '@types/ws': 8.5.5 discord-api-types: 0.37.50 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 - tslib: 2.6.2 + tslib: 2.6.1 undici: 5.22.1 - ws: 8.14.2 + ws: 8.13.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -1374,15 +1379,14 @@ packages: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-json-stringify@5.9.1: - resolution: {integrity: sha512-NMrf+uU9UJnTzfxaumMDXK1NWqtPCfGoM9DYIE+ESlaTQqjlANFBy0VAbsm6FB88Mx0nceyi18zTo5kIEUlzxg==} + /fast-json-stringify@5.8.0: + resolution: {integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==} dependencies: '@fastify/deepmerge': 1.3.0 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) fast-deep-equal: 3.1.3 - fast-uri: 2.3.0 - json-schema-ref-resolver: 1.0.1 + fast-uri: 2.2.0 rfdc: 1.3.0 dev: false @@ -1401,24 +1405,24 @@ packages: engines: {node: '>=6'} dev: false - /fast-uri@2.3.0: - resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} + /fast-uri@2.2.0: + resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} dev: false /fastify@4.24.0: resolution: {integrity: sha512-6Uu2cCAV1UgexPnWKchgRt77lng9ivNmyFhPMcgUbJ4VaVBE1l6aYluiYZiVsgOBFpHrmdj7FD6n1aHswln4yQ==} dependencies: '@fastify/ajv-compiler': 3.5.0 - '@fastify/error': 3.4.1 + '@fastify/error': 3.4.0 '@fastify/fast-json-stringify-compiler': 4.3.0 abstract-logging: 2.0.1 avvio: 8.2.1 fast-content-type-parse: 1.1.0 - fast-json-stringify: 5.9.1 + fast-json-stringify: 5.8.0 find-my-way: 7.7.0 light-my-request: 5.11.0 - pino: 8.16.1 - process-warning: 2.3.0 + pino: 8.16.0 + process-warning: 2.2.0 proxy-addr: 2.0.7 rfdc: 1.3.0 secure-json-parse: 2.7.0 @@ -1735,12 +1739,6 @@ packages: argparse: 2.0.1 dev: true - /json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} - dependencies: - fast-deep-equal: 3.1.3 - dev: false - /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -1779,7 +1777,7 @@ packages: resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==} dependencies: cookie: 0.5.0 - process-warning: 2.3.0 + process-warning: 2.2.0 set-cookie-parser: 2.6.0 dev: false @@ -1808,8 +1806,8 @@ packages: dependencies: yallist: 4.0.0 - /luxon@3.4.4: - resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + /luxon@3.3.0: + resolution: {integrity: sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==} engines: {node: '>=12'} dev: false @@ -1987,8 +1985,8 @@ packages: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false - /pino@8.16.1: - resolution: {integrity: sha512-3bKsVhBmgPjGV9pyn4fO/8RtoVDR8ssW1ev819FsRXlRNgW8gR/9Kx+gCK4UPWd4JjrRDLWpzd/pb1AyWm3MGA==} + /pino@8.16.0: + resolution: {integrity: sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==} hasBin: true dependencies: atomic-sleep: 1.0.0 @@ -1996,7 +1994,7 @@ packages: on-exit-leak-free: 2.1.2 pino-abstract-transport: 1.1.0 pino-std-serializers: 6.2.2 - process-warning: 2.3.0 + process-warning: 2.2.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.4.3 @@ -2015,8 +2013,8 @@ packages: hasBin: true dev: true - /process-warning@2.3.0: - resolution: {integrity: sha512-N6mp1+2jpQr3oCFMz6SeHRGbv6Slb20bRhj4v3xR99HqNToAcOe1MFOp4tytyzOfJn+QtN8Rf7U/h2KAn4kC6g==} + /process-warning@2.2.0: + resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} dev: false /process@0.11.10: @@ -2354,12 +2352,17 @@ packages: resolution: {integrity: sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==} dev: false + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + dev: false + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false - /tsx@3.13.0: - resolution: {integrity: sha512-rjmRpTu3as/5fjNq/kOkOtihgLxuIz6pbKdj9xwP4J5jOLkBxw/rjN5ANw+KyrrOXV5uB7HC8+SrrSJxT65y+A==} + /tsx@4.1.1: + resolution: {integrity: sha512-zyPn5BFMB0TB5kMLbYPNx4x/oL/oSlaecdKCv6WeJ0TeSEfx8RTJWjuB5TZ2dSewktgfBsBO/HNA9mrMWqLXMA==} + engines: {node: '>=18.0.0'} hasBin: true dependencies: esbuild: 0.18.20 @@ -2412,8 +2415,8 @@ packages: '@fastify/busboy': 2.1.0 dev: false - /universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} dev: false /unpipe@1.0.0: @@ -2447,8 +2450,8 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 diff --git a/src/index.ts b/src/index.ts index f99bdf7e..f91209fa 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,9 +13,13 @@ import { import config from './config'; -import reupload from './_reupload'; +import { reuploadCommands } from './_reupload'; import { listen as listenApp } from './server'; -import { connect as connectStorage } from './storage'; +import { + connect as connectStorage, + isUserPlural, + storeUserPlurality, +} from './storage'; import { scheduleJobs } from './tasks'; import * as BuildConfig from './constants'; @@ -34,9 +38,13 @@ import { sayCommand } from './commands/say'; import random from 'just-random'; import { green, bold, yellow, cyan } from 'kleur/colors'; -import 'dotenv/config'; +import { + fetchPluralKitMessage, + isMessageProxied, + pkDelay, +} from './utils/pluralKit'; -import { proxied } from './utils/pluralKit'; +import 'dotenv/config'; const client = new Client({ intents: [ @@ -99,7 +107,16 @@ client.once('ready', async () => { if (e.author === client.user) return; - if (await proxied(e)) return; + if (e.webhookId !== null) { + // defer PK detection + setTimeout(async () => { + const pkMessage = await fetchPluralKitMessage(e); + if (pkMessage !== null) storeUserPlurality(pkMessage.sender); + }, pkDelay); + } + + if ((await isUserPlural(e.author.id)) && (await isMessageProxied(e))) + return; if (e.cleanContent.match(BuildConfig.ETA_REGEX)) { await e.reply( @@ -204,7 +221,7 @@ client.on(Events.ThreadCreate, async (channel) => { } }); -reupload() +reuploadCommands() .then(() => { client.login(config.discord.botToken); connectStorage(); diff --git a/src/storage.ts b/src/storage.ts index 2d5b1d31..40bdaebd 100644 --- a/src/storage.ts +++ b/src/storage.ts @@ -45,6 +45,19 @@ export const areContributors = async ( return (await client.smIsMember(key, contributorIds)).includes(true); }; +export const storeUserPlurality = async (userId: string) => { + // Just store some value. We only care about the presence of this key + await client + .multi() + .set(`user:${userId}:pk`, '0') + .expire(`user:${userId}:pk`, 7 * 24 * 60 * 60) + .exec(); +}; + +export const isUserPlural = async (userId: string) => { + return (await client.exists(`user:${userId}:pk`)) > 0; +}; + export const connect = () => { client.connect(); }; diff --git a/src/utils/pluralKit.ts b/src/utils/pluralKit.ts index 7753a955..3f5aae31 100644 --- a/src/utils/pluralKit.ts +++ b/src/utils/pluralKit.ts @@ -1,10 +1,22 @@ -import { Message } from "discord.js"; +import { Message } from 'discord.js'; -export async function proxied(message: Message): Promise { - if (message.webhookId !== null) - return false; +interface PkMessage { + sender: string; +} + +export const pkDelay = 1000; + +export async function fetchPluralKitMessage(message: Message) { + const response = await fetch( + `https://api.pluralkit.me/v2/messages/${message.id}` + ); + + if (!response.ok) return null; + + return (await response.json()) as PkMessage; +} - await new Promise(resolve => setTimeout(resolve, 300)); - const response = await fetch(`https://api.pluralkit.me/v2/messages/${message.id}`); - return response.ok; +export async function isMessageProxied(message: Message) { + await new Promise((resolve) => setTimeout(resolve, pkDelay)); + return (await fetchPluralKitMessage(message)) !== null; }