From 1fd32b8a20e97bb3efdbcd3ad982a15378b2ff2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linnea=20Gr=C3=A4f?= Date: Tue, 25 Mar 2025 21:24:47 +0100 Subject: [PATCH] feat: Patpat generator --- package.json | 16 +- patches/sharp@0.34.0-rc.0.patch | 13 + pnpm-lock.yaml | 543 ++++++++++++++++++++++ src/commands/pat.ts | 73 +++ src/commands/patpatframes/patpat0.png | Bin 0 -> 5998 bytes src/commands/patpatframes/patpat1.png | Bin 0 -> 5825 bytes src/commands/patpatframes/patpatempty.gif | Bin 0 -> 12221 bytes src/index.ts | 1 + 8 files changed, 645 insertions(+), 1 deletion(-) create mode 100644 patches/sharp@0.34.0-rc.0.patch create mode 100644 src/commands/pat.ts create mode 100644 src/commands/patpatframes/patpat0.png create mode 100644 src/commands/patpatframes/patpat1.png create mode 100644 src/commands/patpatframes/patpatempty.gif diff --git a/package.json b/package.json index 2097584..9317a49 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,26 @@ "check": "tsc" }, "dependencies": { + "canvas": "^3.1.0", "discord.js": "^14.17.2", + "sharp": "git+ssh://git@github.com/lovell/sharp.git", "ts-node": "^10.9.2", "zod": "^3.24.2" }, "devDependencies": { "typescript": "^5.5.3" }, - "private": true + "private": true, + "pnpm": { + "ignoredBuiltDependencies": [ + "canvas" + ], + "onlyBuiltDependencies": [ + "canvas", + "sharp" + ], + "patchedDependencies": { + "sharp@0.34.0-rc.0": "patches/sharp@0.34.0-rc.0.patch" + } + } } diff --git a/patches/sharp@0.34.0-rc.0.patch b/patches/sharp@0.34.0-rc.0.patch new file mode 100644 index 0000000..689b135 --- /dev/null +++ b/patches/sharp@0.34.0-rc.0.patch @@ -0,0 +1,13 @@ +diff --git a/lib/sharp.js b/lib/sharp.js +index 78853e95fd55c3074352d7a7356c399b99170ba4..36001995f9e1acf4c381e0dabefcee131a18aade 100644 +--- a/lib/sharp.js ++++ b/lib/sharp.js +@@ -30,7 +30,7 @@ for (path of paths) { + } + + /* istanbul ignore next */ +-if (sharp && path.startsWith('@img/sharp-linux-x64') && !sharp._isUsingX64V2()) { ++if (sharp && path.startsWith('@img/sharp-linux-x64') && false) { + const err = new Error('Prebuilt binaries for linux-x64 require v2 microarchitecture'); + err.code = 'Unsupported CPU'; + errors.push(err); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11d63c0..9e579bc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,13 +4,24 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + sharp@0.34.0-rc.0: + hash: aec393aef46aa4fa39e5c8d152bbe386c4b9df13f70cc0a46ee371547d7395dc + path: patches/sharp@0.34.0-rc.0.patch + importers: .: dependencies: + canvas: + specifier: ^3.1.0 + version: 3.1.0 discord.js: specifier: ^14.17.2 version: 14.17.2 + sharp: + specifier: git+ssh://git@github.com/lovell/sharp.git + version: https://codeload.github.com/lovell/sharp/tar.gz/03e1b19764719d1b031045420223e78160db9bd0(patch_hash=aec393aef46aa4fa39e5c8d152bbe386c4b9df13f70cc0a46ee371547d7395dc) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@22.10.5)(typescript@5.7.2) @@ -56,6 +67,119 @@ packages: resolution: {integrity: sha512-QH5CAFe3wHDiedbO+EI3OOiyipwWd+Q6BdoFZUw/Wf2fw5Cv2fgU/9UEtJRmJa9RecI+TAhdGPadMaEIur5yJg==} engines: {node: '>=16.11.0'} + '@emnapi/runtime@1.3.1': + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + + '@img/sharp-darwin-arm64@0.34.0-rc.0': + resolution: {integrity: sha512-qbkTsi4yItqb+bvi3JVbgIVPixk4sz7r1F5aw80vzK+q0yHj9lTFYkqnqWhCGNggp3MZfwx4Gqre5M+Y9ITwwQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.0-rc.0': + resolution: {integrity: sha512-aOLXjFWhVcBUpDIWFAZ1AalJKXpm0d1vRQ5alAqTYFZgLwOk80LTEXWy32TQqRUQlHIiUBVq4Aw1KcwvFgPM7Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.1.0-rc4': + resolution: {integrity: sha512-AVPOee9ZyJ5MfS1Iuyx1M2VKHHKnL+kFFp1fWt3QqBWuTVs3JR8ApJOOdmY/Y8Z9sR1eQ3EHsCrzfKCcLxTMRg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.1.0-rc4': + resolution: {integrity: sha512-m2etL2MOBqAp7e7fjJqktTQW13gSY+XQ1rXlQ+AzxviASMhQdpRxPeQgtX7lwnsUL+4S/blRrjh+gVL1LnlsgA==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.1.0-rc4': + resolution: {integrity: sha512-27/wAovlMES4A0dFMRaACcoytVHtQc8QcptQwJBOZHF6IeGPsq6WN3RqDDRNs+T9O7WV+ivALLjCCDIHxXA3Zw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.1.0-rc4.1': + resolution: {integrity: sha512-GvScbEYBFtNMXJuIjXtKCuod66NN52sS2MJEiNQZyEly5aoaJACYnjyszwBfGQTkuxx2Sr2Wv2vTJhtsomCBGA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.1.0-rc4': + resolution: {integrity: sha512-bXCe1kN7ZoC6f+aryXYpi+SEIGFmWxQxa1IQ8XBh3RgtsUiWF8/yfPtYyUHRIt4RXVNABEcpaSvHrtMqunTPQA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.1.0-rc4': + resolution: {integrity: sha512-OpVPJ8XfmrwQ5txkzdCliT57IBrFBBF4EqwrLdq9SqeUtnyM2GlgQf+3TRTmnh3LT4HGC/13VgBmYgWXxTv8cw==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.1.0-rc4': + resolution: {integrity: sha512-Wo3OjH0RaQrhAnSiNv8IvunVSzg73n7WxzmxnwzyHW9pooDzDfF9CnRpIW6KD84Sj/LRLT+ZuaU5ro4b4tYv4A==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0-rc4': + resolution: {integrity: sha512-cftYedmpewmg6STcGp63W09RAXVDQXZaAmlw7/8cMnH7q/XJKPmWVdQW3TWDNd7Ag7Z1ZF5zJ4C2N8+84eBX7g==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.1.0-rc4': + resolution: {integrity: sha512-wqfQrWDbwuPu5XWPNIizZ49q8jXFWlp4zBENG7JwzXEP+BIpT4aQbw92Oaep1bXZF7zXaQjowm6c+ifU5aVG2Q==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.0-rc.0': + resolution: {integrity: sha512-BGIQ198i7vRidGUw9vXCiq1cOeihCRaryZUKyk+nnC5NgjXi4MGGDUuMtIO9oWc0m82uxEAh1Anv2Gob7nL7Bw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.0-rc.0': + resolution: {integrity: sha512-zEyjTaR8L1NigTkuZ4+aOQKFhqJmaum/0B8y4KrJf4veRCDIWUWemMEMTG5y0U8unIsyhPi3HKXSqAHARvie4A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-s390x@0.34.0-rc.0': + resolution: {integrity: sha512-zjcm7vPxPqIfKE5XbSvwMYc7ZYA7GZmCW2+o/B5i5DhoomLrx4IlBjt7+L4WykMdQkrYkDaFmTRORoD6/Veh6g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.0-rc.0': + resolution: {integrity: sha512-XO+D78ZrbYYHiBaqXDkc+vHWlRAn1k03hVhkPxpLyEEAN7gHGfIFVBPlE2yZhbMloqEW41zfIpSY6Vg8SS1poQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.0-rc.0': + resolution: {integrity: sha512-CqYOm0aOg+6+Ep7Dbtl5/V9Ll8u5aGK/e6XLVSZLMsJ+Bfh02NnYVDJZhYZPh1QmvnqUJwCX8egIL4lpiMPuCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.0-rc.0': + resolution: {integrity: sha512-DIbS0nAMAmKsLxCvtoQSFpMWbk4G460kb0axjL4M3oaRCEcXCPwa2gsgiVwoy6YYxCxBBDyzgQt4AggLEMpSXA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.0-rc.0': + resolution: {integrity: sha512-8mUPtwQXmw5YbUJMZjIhtuF+MpX+8ib2aQ4f143y5EFi4yej3qzNw8yxWUaor3VxaZMJNwTgG23K75Hj0eymTw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.34.0-rc.0': + resolution: {integrity: sha512-HvKmPPepuoJb7bzv8aRR13/WVN2YPhcgdb6R9w5z8i08Eijglb5gzB+z4/ajRvPjC6GCn121/XLtM59b5HzDQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.0-rc.0': + resolution: {integrity: sha512-4buOejyM4w+TsTHyYSXXxwPY4hsHmoZhJLlasF8/TiqeiSMr7rprJ/4PtCCaSfF+Y6HdhCDFBUpispDUxLky2g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -112,9 +236,51 @@ packages: arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -126,9 +292,34 @@ packages: resolution: {integrity: sha512-mrH6ziLVtNtId4bV4bsaUt5jE6NUaiHMPqO5VsSw1VVhFnjFi9duD8ctlo90/6cUH+8uyKBkoq9mSJ35SuuZ7Q==} engines: {node: '>=18'} + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + lodash.snakecase@4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} @@ -141,6 +332,81 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + + node-abi@3.74.0: + resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} + engines: {node: '>=10'} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + sharp@https://codeload.github.com/lovell/sharp/tar.gz/03e1b19764719d1b031045420223e78160db9bd0: + resolution: {tarball: https://codeload.github.com/lovell/sharp/tar.gz/03e1b19764719d1b031045420223e78160db9bd0} + version: 0.34.0-rc.0 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} @@ -161,6 +427,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -173,9 +442,15 @@ packages: resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} engines: {node: '>=18.17'} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -248,6 +523,89 @@ snapshots: - bufferutil - utf-8-validate + '@emnapi/runtime@1.3.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@img/sharp-darwin-arm64@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0-rc4 + optional: true + + '@img/sharp-darwin-x64@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0-rc4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-linux-arm@1.1.0-rc4.1': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-linux-x64@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.1.0-rc4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.1.0-rc4': + optional: true + + '@img/sharp-linux-arm64@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0-rc4 + optional: true + + '@img/sharp-linux-arm@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0-rc4.1 + optional: true + + '@img/sharp-linux-s390x@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0-rc4 + optional: true + + '@img/sharp-linux-x64@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0-rc4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0-rc4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.0-rc.0': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0-rc4 + optional: true + + '@img/sharp-wasm32@0.34.0-rc.0': + dependencies: + '@emnapi/runtime': 1.3.1 + optional: true + + '@img/sharp-win32-ia32@0.34.0-rc.0': + optional: true + + '@img/sharp-win32-x64@0.34.0-rc.0': + optional: true + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.0': {} @@ -292,8 +650,52 @@ snapshots: arg@4.1.3: {} + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + canvas@3.1.0: + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + + chownr@1.1.4: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + create-require@1.1.1: {} + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + detect-libc@2.0.3: {} + diff@4.0.2: {} discord-api-types@0.37.115: {} @@ -316,8 +718,26 @@ snapshots: - bufferutil - utf-8-validate + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + expand-template@2.0.3: {} + fast-deep-equal@3.1.3: {} + fs-constants@1.0.0: {} + + github-from-package@0.0.0: {} + + ieee754@1.2.1: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + is-arrayish@0.3.2: {} + lodash.snakecase@4.1.1: {} lodash@4.17.21: {} @@ -326,6 +746,121 @@ snapshots: make-error@1.3.6: {} + mimic-response@3.1.0: {} + + minimist@1.2.8: {} + + mkdirp-classic@0.5.3: {} + + napi-build-utils@2.0.0: {} + + node-abi@3.74.0: + dependencies: + semver: 7.7.1 + + node-addon-api@7.1.1: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.74.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + safe-buffer@5.2.1: {} + + semver@7.7.1: {} + + sharp@https://codeload.github.com/lovell/sharp/tar.gz/03e1b19764719d1b031045420223e78160db9bd0(patch_hash=aec393aef46aa4fa39e5c8d152bbe386c4b9df13f70cc0a46ee371547d7395dc): + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.0-rc.0 + '@img/sharp-darwin-x64': 0.34.0-rc.0 + '@img/sharp-libvips-darwin-arm64': 1.1.0-rc4 + '@img/sharp-libvips-darwin-x64': 1.1.0-rc4 + '@img/sharp-libvips-linux-arm': 1.1.0-rc4.1 + '@img/sharp-libvips-linux-arm64': 1.1.0-rc4 + '@img/sharp-libvips-linux-ppc64': 1.1.0-rc4 + '@img/sharp-libvips-linux-s390x': 1.1.0-rc4 + '@img/sharp-libvips-linux-x64': 1.1.0-rc4 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0-rc4 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0-rc4 + '@img/sharp-linux-arm': 0.34.0-rc.0 + '@img/sharp-linux-arm64': 0.34.0-rc.0 + '@img/sharp-linux-s390x': 0.34.0-rc.0 + '@img/sharp-linux-x64': 0.34.0-rc.0 + '@img/sharp-linuxmusl-arm64': 0.34.0-rc.0 + '@img/sharp-linuxmusl-x64': 0.34.0-rc.0 + '@img/sharp-wasm32': 0.34.0-rc.0 + '@img/sharp-win32-ia32': 0.34.0-rc.0 + '@img/sharp-win32-x64': 0.34.0-rc.0 + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-json-comments@2.0.1: {} + + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + ts-mixer@6.0.4: {} ts-node@10.9.2(@types/node@22.10.5)(typescript@5.7.2): @@ -348,14 +883,22 @@ snapshots: tslib@2.8.1: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + typescript@5.7.2: {} undici-types@6.20.0: {} undici@6.19.8: {} + util-deprecate@1.0.2: {} + v8-compile-cache-lib@3.0.1: {} + wrappy@1.0.2: {} + ws@8.18.0: {} yn@3.1.1: {} diff --git a/src/commands/pat.ts b/src/commands/pat.ts new file mode 100644 index 0000000..990ef32 --- /dev/null +++ b/src/commands/pat.ts @@ -0,0 +1,73 @@ + +import { Command } from "../command.ts"; +import { + ApplicationIntegrationType, + Attachment, + AttachmentBuilder, + ChatInputCommandInteraction, + InteractionContextType, + SlashCommandBuilder +} from "discord.js"; +import { Config } from "../config.ts"; +import sharp, { SharpInput } from "sharp"; +import * as path from 'path'; +import { Canvas, loadImage } from "canvas"; +import { readdir, readFile } from "fs/promises"; + +const patpatGifPath = path.join('src/commands/', 'patpatframes') + +export default class PingCommand extends Command { + + async run(interaction: ChatInputCommandInteraction, config: Config) { + const user = interaction.options.getUser('user', true) + const avatarResponse = await fetch(user.avatarURL({})!) + const avatarBuf = Buffer.from(await avatarResponse.arrayBuffer()) + const frames: SharpInput[] = [] + const frame_avatar_positions = [ + [32, 102, 73, 65], + [32, 112, 73, 47], + ] as const + + let pos = 0 + for (const framePath of await readdir(patpatGifPath)) { + if (!framePath.endsWith(".png")) continue + const filePath = path.join(patpatGifPath, framePath) + const patImage = await loadImage(filePath); + const composite = new Canvas(patImage.width, patImage.height) + const context = composite.getContext('2d'); + const [x, y, w, h] = frame_avatar_positions[pos++] + const squishedAvatar = await loadImage(await sharp(avatarBuf).resize(w, h, { + fit: 'fill' + }).png().toBuffer()) + context.drawImage(squishedAvatar, x, y) + context.drawImage(patImage, 0, 0) + frames.push(composite.toBuffer('image/png')) + } + const webP = await sharp( + frames, + { join: { animated: true } } + ).webp({ delay: new Array(pos).fill(200), loop: 0 }).toBuffer(); + await interaction.reply({ + content: `Patting ${user.displayName}`, + files: [ + new AttachmentBuilder(webP) + .setName('softcorepattingaction.webp') + .setDescription(`the ${user.displayName} is being gently patted`), + ] + }); + } + + slashCommand = new SlashCommandBuilder() + .setName("pat") + .setDescription("Pats someone!").setIntegrationTypes([ + ApplicationIntegrationType.UserInstall + ]) + .addUserOption(builder => builder.setName("user") + .setDescription("The one to plap") + .setRequired(true)) + .setContexts([ + InteractionContextType.BotDM, + InteractionContextType.Guild, + InteractionContextType.PrivateChannel + ]); +} diff --git a/src/commands/patpatframes/patpat0.png b/src/commands/patpatframes/patpat0.png new file mode 100644 index 0000000000000000000000000000000000000000..069d9cf7db5036f9820a3e028035f63f814666d1 GIT binary patch literal 5998 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 Uh$-2MUot>TU01D6)i&}!0JMK|p#T5? literal 0 HcmV?d00001 diff --git a/src/commands/patpatframes/patpatempty.gif b/src/commands/patpatframes/patpatempty.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f115a85a8afd2010d5a180dfcd8e94687300edb GIT binary patch literal 12221 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 g`9}*F$d*1>