commit 6872915e568cce2f134108a14c34f814efeccf54 Author: bakonpancakz Date: Sat May 23 17:13:00 2026 -0700 Initial Release (Cloudflare Workers) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a297771 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +.wrangler +*.toml \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8762813 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 bakonpancakz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..adf0369 --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +

+ +
+ faxspittist + - + The only bot that keeps it ๐Ÿ’ฏ ๐Ÿ—ฃ +
+

+
+ + +
+

Get Facts straight from the GOAT ๐Ÿ‘€

+

Keep it real with over 100 images of real dudes with even realer captions

+ + + + + + +
+
+ + +
+

Hear what the GOAT has to say ๐Ÿ—ฃ

+

Keep it ๐Ÿ’ฏ by hearing what he has to say with over 50 different quotes

+ You spend most of your life inside your head. So make it a nice place to be. +
If you notice yourself giving more energy than you recieve, step back. +
In order to love who you are, you can not hate the experiences that shaped you. +
\ No newline at end of file diff --git a/content/README.txt b/content/README.txt new file mode 100644 index 0000000..1fdd67f --- /dev/null +++ b/content/README.txt @@ -0,0 +1,2 @@ +All content in this folder is public and available at: +https://raw.githubusercontent.com/bakonpancakz/discord-faxspittist/main/content/ diff --git a/content/avatar.png b/content/avatar.png new file mode 100644 index 0000000..8fecc5c Binary files /dev/null and b/content/avatar.png differ diff --git a/content/fax-images/001.png b/content/fax-images/001.png new file mode 100644 index 0000000..cafb3d4 Binary files /dev/null and b/content/fax-images/001.png differ diff --git a/content/fax-images/002.png b/content/fax-images/002.png new file mode 100644 index 0000000..4d457f2 Binary files /dev/null and b/content/fax-images/002.png differ diff --git a/content/fax-images/003.png b/content/fax-images/003.png new file mode 100644 index 0000000..4078669 Binary files /dev/null and b/content/fax-images/003.png differ diff --git a/content/fax-images/004.png b/content/fax-images/004.png new file mode 100644 index 0000000..ea3735f Binary files /dev/null and b/content/fax-images/004.png differ diff --git a/content/fax-images/005.png b/content/fax-images/005.png new file mode 100644 index 0000000..11ab40e Binary files /dev/null and b/content/fax-images/005.png differ diff --git a/content/fax-images/006.png b/content/fax-images/006.png new file mode 100644 index 0000000..988e2a6 Binary files /dev/null and b/content/fax-images/006.png differ diff --git a/content/fax-images/007.png b/content/fax-images/007.png new file mode 100644 index 0000000..8222b27 Binary files /dev/null and b/content/fax-images/007.png differ diff --git a/content/fax-images/008.png b/content/fax-images/008.png new file mode 100644 index 0000000..a116f48 Binary files /dev/null and b/content/fax-images/008.png differ diff --git a/content/fax-images/009.png b/content/fax-images/009.png new file mode 100644 index 0000000..414d552 Binary files /dev/null and b/content/fax-images/009.png differ diff --git a/content/fax-images/010.png b/content/fax-images/010.png new file mode 100644 index 0000000..eee7068 Binary files /dev/null and b/content/fax-images/010.png differ diff --git a/content/fax-images/011.png b/content/fax-images/011.png new file mode 100644 index 0000000..7221191 Binary files /dev/null and b/content/fax-images/011.png differ diff --git a/content/fax-images/012.png b/content/fax-images/012.png new file mode 100644 index 0000000..4189cc8 Binary files /dev/null and b/content/fax-images/012.png differ diff --git a/content/fax-images/013.png b/content/fax-images/013.png new file mode 100644 index 0000000..0d2bfe5 Binary files /dev/null and b/content/fax-images/013.png differ diff --git a/content/fax-images/014.png b/content/fax-images/014.png new file mode 100644 index 0000000..8e3ad97 Binary files /dev/null and b/content/fax-images/014.png differ diff --git a/content/fax-images/015.png b/content/fax-images/015.png new file mode 100644 index 0000000..98b771b Binary files /dev/null and b/content/fax-images/015.png differ diff --git a/content/fax-images/016.png b/content/fax-images/016.png new file mode 100644 index 0000000..a0ca085 Binary files /dev/null and b/content/fax-images/016.png differ diff --git a/content/fax-images/017.png b/content/fax-images/017.png new file mode 100644 index 0000000..d245af5 Binary files /dev/null and b/content/fax-images/017.png differ diff --git a/content/fax-images/018.png b/content/fax-images/018.png new file mode 100644 index 0000000..0227ff4 Binary files /dev/null and b/content/fax-images/018.png differ diff --git a/content/fax-images/019.png b/content/fax-images/019.png new file mode 100644 index 0000000..f74f2e9 Binary files /dev/null and b/content/fax-images/019.png differ diff --git a/content/fax-images/020.png b/content/fax-images/020.png new file mode 100644 index 0000000..77aae3d Binary files /dev/null and b/content/fax-images/020.png differ diff --git a/content/fax-images/021.png b/content/fax-images/021.png new file mode 100644 index 0000000..b788352 Binary files /dev/null and b/content/fax-images/021.png differ diff --git a/content/fax-images/022.png b/content/fax-images/022.png new file mode 100644 index 0000000..859c54a Binary files /dev/null and b/content/fax-images/022.png differ diff --git a/content/fax-images/023.png b/content/fax-images/023.png new file mode 100644 index 0000000..9418647 Binary files /dev/null and b/content/fax-images/023.png differ diff --git a/content/fax-images/024.png b/content/fax-images/024.png new file mode 100644 index 0000000..2424b2a Binary files /dev/null and b/content/fax-images/024.png differ diff --git a/content/fax-images/025.png b/content/fax-images/025.png new file mode 100644 index 0000000..2ad1925 Binary files /dev/null and b/content/fax-images/025.png differ diff --git a/content/fax-images/026.png b/content/fax-images/026.png new file mode 100644 index 0000000..7e0d250 Binary files /dev/null and b/content/fax-images/026.png differ diff --git a/content/fax-images/027.png b/content/fax-images/027.png new file mode 100644 index 0000000..b015de8 Binary files /dev/null and b/content/fax-images/027.png differ diff --git a/content/fax-images/028.png b/content/fax-images/028.png new file mode 100644 index 0000000..03b6b53 Binary files /dev/null and b/content/fax-images/028.png differ diff --git a/content/fax-images/029.png b/content/fax-images/029.png new file mode 100644 index 0000000..22778de Binary files /dev/null and b/content/fax-images/029.png differ diff --git a/content/fax-images/030.png b/content/fax-images/030.png new file mode 100644 index 0000000..4d97953 Binary files /dev/null and b/content/fax-images/030.png differ diff --git a/content/fax-images/031.png b/content/fax-images/031.png new file mode 100644 index 0000000..f961b95 Binary files /dev/null and b/content/fax-images/031.png differ diff --git a/content/fax-images/032.png b/content/fax-images/032.png new file mode 100644 index 0000000..ae2acd3 Binary files /dev/null and b/content/fax-images/032.png differ diff --git a/content/fax-images/033.png b/content/fax-images/033.png new file mode 100644 index 0000000..526d0a2 Binary files /dev/null and b/content/fax-images/033.png differ diff --git a/content/fax-images/034.png b/content/fax-images/034.png new file mode 100644 index 0000000..adcbcb9 Binary files /dev/null and b/content/fax-images/034.png differ diff --git a/content/fax-images/035.png b/content/fax-images/035.png new file mode 100644 index 0000000..ee863ac Binary files /dev/null and b/content/fax-images/035.png differ diff --git a/content/fax-images/036.png b/content/fax-images/036.png new file mode 100644 index 0000000..a402fbd Binary files /dev/null and b/content/fax-images/036.png differ diff --git a/content/fax-images/037.png b/content/fax-images/037.png new file mode 100644 index 0000000..a3bdf54 Binary files /dev/null and b/content/fax-images/037.png differ diff --git a/content/fax-images/038.png b/content/fax-images/038.png new file mode 100644 index 0000000..aeb8d7c Binary files /dev/null and b/content/fax-images/038.png differ diff --git a/content/fax-images/039.png b/content/fax-images/039.png new file mode 100644 index 0000000..cb22fe3 Binary files /dev/null and b/content/fax-images/039.png differ diff --git a/content/fax-images/040.png b/content/fax-images/040.png new file mode 100644 index 0000000..cb3b7ad Binary files /dev/null and b/content/fax-images/040.png differ diff --git a/content/fax-images/041.png b/content/fax-images/041.png new file mode 100644 index 0000000..92d61db Binary files /dev/null and b/content/fax-images/041.png differ diff --git a/content/fax-images/042.png b/content/fax-images/042.png new file mode 100644 index 0000000..6c78913 Binary files /dev/null and b/content/fax-images/042.png differ diff --git a/content/fax-images/043.png b/content/fax-images/043.png new file mode 100644 index 0000000..825b5db Binary files /dev/null and b/content/fax-images/043.png differ diff --git a/content/fax-images/044.png b/content/fax-images/044.png new file mode 100644 index 0000000..cbfa896 Binary files /dev/null and b/content/fax-images/044.png differ diff --git a/content/fax-images/045.png b/content/fax-images/045.png new file mode 100644 index 0000000..995d5c1 Binary files /dev/null and b/content/fax-images/045.png differ diff --git a/content/fax-images/046.png b/content/fax-images/046.png new file mode 100644 index 0000000..2c080c5 Binary files /dev/null and b/content/fax-images/046.png differ diff --git a/content/fax-images/047.png b/content/fax-images/047.png new file mode 100644 index 0000000..fa0be51 Binary files /dev/null and b/content/fax-images/047.png differ diff --git a/content/fax-images/048.png b/content/fax-images/048.png new file mode 100644 index 0000000..ab19f29 Binary files /dev/null and b/content/fax-images/048.png differ diff --git a/content/fax-images/049.png b/content/fax-images/049.png new file mode 100644 index 0000000..2fe814d Binary files /dev/null and b/content/fax-images/049.png differ diff --git a/content/fax-images/050.png b/content/fax-images/050.png new file mode 100644 index 0000000..845ca6b Binary files /dev/null and b/content/fax-images/050.png differ diff --git a/content/fax-images/051.png b/content/fax-images/051.png new file mode 100644 index 0000000..7085394 Binary files /dev/null and b/content/fax-images/051.png differ diff --git a/content/fax-images/052.png b/content/fax-images/052.png new file mode 100644 index 0000000..82575fa Binary files /dev/null and b/content/fax-images/052.png differ diff --git a/content/fax-images/053.png b/content/fax-images/053.png new file mode 100644 index 0000000..370d281 Binary files /dev/null and b/content/fax-images/053.png differ diff --git a/content/fax-images/054.png b/content/fax-images/054.png new file mode 100644 index 0000000..b667ec1 Binary files /dev/null and b/content/fax-images/054.png differ diff --git a/content/fax-images/055.png b/content/fax-images/055.png new file mode 100644 index 0000000..e26249e Binary files /dev/null and b/content/fax-images/055.png differ diff --git a/content/fax-images/056.png b/content/fax-images/056.png new file mode 100644 index 0000000..8500b1f Binary files /dev/null and b/content/fax-images/056.png differ diff --git a/content/fax-images/057.png b/content/fax-images/057.png new file mode 100644 index 0000000..9c89ce1 Binary files /dev/null and b/content/fax-images/057.png differ diff --git a/content/fax-images/058.png b/content/fax-images/058.png new file mode 100644 index 0000000..3de0854 Binary files /dev/null and b/content/fax-images/058.png differ diff --git a/content/fax-images/059.png b/content/fax-images/059.png new file mode 100644 index 0000000..1ab9b4e Binary files /dev/null and b/content/fax-images/059.png differ diff --git a/content/fax-images/060.png b/content/fax-images/060.png new file mode 100644 index 0000000..81634c5 Binary files /dev/null and b/content/fax-images/060.png differ diff --git a/content/fax-images/061.png b/content/fax-images/061.png new file mode 100644 index 0000000..2ea4037 Binary files /dev/null and b/content/fax-images/061.png differ diff --git a/content/fax-images/062.png b/content/fax-images/062.png new file mode 100644 index 0000000..0c01d7a Binary files /dev/null and b/content/fax-images/062.png differ diff --git a/content/fax-images/063.png b/content/fax-images/063.png new file mode 100644 index 0000000..6d655da Binary files /dev/null and b/content/fax-images/063.png differ diff --git a/content/fax-images/064.png b/content/fax-images/064.png new file mode 100644 index 0000000..01a68b6 Binary files /dev/null and b/content/fax-images/064.png differ diff --git a/content/fax-images/065.png b/content/fax-images/065.png new file mode 100644 index 0000000..2f0eda5 Binary files /dev/null and b/content/fax-images/065.png differ diff --git a/content/fax-images/066.png b/content/fax-images/066.png new file mode 100644 index 0000000..e13cf7a Binary files /dev/null and b/content/fax-images/066.png differ diff --git a/content/fax-images/067.png b/content/fax-images/067.png new file mode 100644 index 0000000..54f6ea7 Binary files /dev/null and b/content/fax-images/067.png differ diff --git a/content/fax-images/068.png b/content/fax-images/068.png new file mode 100644 index 0000000..66fef19 Binary files /dev/null and b/content/fax-images/068.png differ diff --git a/content/fax-images/069.png b/content/fax-images/069.png new file mode 100644 index 0000000..d6d518b Binary files /dev/null and b/content/fax-images/069.png differ diff --git a/content/fax-images/070.png b/content/fax-images/070.png new file mode 100644 index 0000000..7a8b4dd Binary files /dev/null and b/content/fax-images/070.png differ diff --git a/content/fax-images/071.png b/content/fax-images/071.png new file mode 100644 index 0000000..5eca205 Binary files /dev/null and b/content/fax-images/071.png differ diff --git a/content/fax-images/072.png b/content/fax-images/072.png new file mode 100644 index 0000000..691649a Binary files /dev/null and b/content/fax-images/072.png differ diff --git a/content/fax-images/073.png b/content/fax-images/073.png new file mode 100644 index 0000000..54455e9 Binary files /dev/null and b/content/fax-images/073.png differ diff --git a/content/fax-images/074.png b/content/fax-images/074.png new file mode 100644 index 0000000..dff492f Binary files /dev/null and b/content/fax-images/074.png differ diff --git a/content/fax-images/075.png b/content/fax-images/075.png new file mode 100644 index 0000000..a745f76 Binary files /dev/null and b/content/fax-images/075.png differ diff --git a/content/fax-images/076.png b/content/fax-images/076.png new file mode 100644 index 0000000..b6262e5 Binary files /dev/null and b/content/fax-images/076.png differ diff --git a/content/fax-images/077.png b/content/fax-images/077.png new file mode 100644 index 0000000..feae8b6 Binary files /dev/null and b/content/fax-images/077.png differ diff --git a/content/fax-images/078.png b/content/fax-images/078.png new file mode 100644 index 0000000..1279adb Binary files /dev/null and b/content/fax-images/078.png differ diff --git a/content/fax-images/079.png b/content/fax-images/079.png new file mode 100644 index 0000000..4624156 Binary files /dev/null and b/content/fax-images/079.png differ diff --git a/content/fax-images/080.png b/content/fax-images/080.png new file mode 100644 index 0000000..5e25dc7 Binary files /dev/null and b/content/fax-images/080.png differ diff --git a/content/fax-images/081.png b/content/fax-images/081.png new file mode 100644 index 0000000..dd85c2c Binary files /dev/null and b/content/fax-images/081.png differ diff --git a/content/fax-images/082.png b/content/fax-images/082.png new file mode 100644 index 0000000..1fc4dab Binary files /dev/null and b/content/fax-images/082.png differ diff --git a/content/fax-images/083.png b/content/fax-images/083.png new file mode 100644 index 0000000..80f9cb7 Binary files /dev/null and b/content/fax-images/083.png differ diff --git a/content/fax-images/084.png b/content/fax-images/084.png new file mode 100644 index 0000000..68ce979 Binary files /dev/null and b/content/fax-images/084.png differ diff --git a/content/fax-images/085.png b/content/fax-images/085.png new file mode 100644 index 0000000..b24d599 Binary files /dev/null and b/content/fax-images/085.png differ diff --git a/content/fax-images/086.png b/content/fax-images/086.png new file mode 100644 index 0000000..b3aeb6f Binary files /dev/null and b/content/fax-images/086.png differ diff --git a/content/fax-images/087.png b/content/fax-images/087.png new file mode 100644 index 0000000..e42ea0f Binary files /dev/null and b/content/fax-images/087.png differ diff --git a/content/fax-images/088.png b/content/fax-images/088.png new file mode 100644 index 0000000..d90616d Binary files /dev/null and b/content/fax-images/088.png differ diff --git a/content/fax-images/089.png b/content/fax-images/089.png new file mode 100644 index 0000000..55aff9f Binary files /dev/null and b/content/fax-images/089.png differ diff --git a/content/fax-images/090.png b/content/fax-images/090.png new file mode 100644 index 0000000..a223e31 Binary files /dev/null and b/content/fax-images/090.png differ diff --git a/content/fax-images/091.png b/content/fax-images/091.png new file mode 100644 index 0000000..dd8e301 Binary files /dev/null and b/content/fax-images/091.png differ diff --git a/content/fax-images/092.png b/content/fax-images/092.png new file mode 100644 index 0000000..c6ddd0d Binary files /dev/null and b/content/fax-images/092.png differ diff --git a/content/fax-images/093.png b/content/fax-images/093.png new file mode 100644 index 0000000..ccf3896 Binary files /dev/null and b/content/fax-images/093.png differ diff --git a/content/fax-images/094.png b/content/fax-images/094.png new file mode 100644 index 0000000..af80d36 Binary files /dev/null and b/content/fax-images/094.png differ diff --git a/content/fax-images/095.png b/content/fax-images/095.png new file mode 100644 index 0000000..4124963 Binary files /dev/null and b/content/fax-images/095.png differ diff --git a/content/fax-images/096.png b/content/fax-images/096.png new file mode 100644 index 0000000..f5c06b6 Binary files /dev/null and b/content/fax-images/096.png differ diff --git a/content/fax-images/097.png b/content/fax-images/097.png new file mode 100644 index 0000000..7b657f4 Binary files /dev/null and b/content/fax-images/097.png differ diff --git a/content/fax-images/098.png b/content/fax-images/098.png new file mode 100644 index 0000000..6dddf47 Binary files /dev/null and b/content/fax-images/098.png differ diff --git a/content/fax-images/099.png b/content/fax-images/099.png new file mode 100644 index 0000000..32357f4 Binary files /dev/null and b/content/fax-images/099.png differ diff --git a/content/fax-images/100.png b/content/fax-images/100.png new file mode 100644 index 0000000..ac1c839 Binary files /dev/null and b/content/fax-images/100.png differ diff --git a/content/fax-images/101.png b/content/fax-images/101.png new file mode 100644 index 0000000..612971e Binary files /dev/null and b/content/fax-images/101.png differ diff --git a/content/fax-images/102.png b/content/fax-images/102.png new file mode 100644 index 0000000..680c6a2 Binary files /dev/null and b/content/fax-images/102.png differ diff --git a/content/fax-images/103.png b/content/fax-images/103.png new file mode 100644 index 0000000..b495f48 Binary files /dev/null and b/content/fax-images/103.png differ diff --git a/content/fax-images/104.png b/content/fax-images/104.png new file mode 100644 index 0000000..476359b Binary files /dev/null and b/content/fax-images/104.png differ diff --git a/content/fax-images/105.png b/content/fax-images/105.png new file mode 100644 index 0000000..481f7ee Binary files /dev/null and b/content/fax-images/105.png differ diff --git a/content/fax-images/106.png b/content/fax-images/106.png new file mode 100644 index 0000000..1a4eb58 Binary files /dev/null and b/content/fax-images/106.png differ diff --git a/content/fax-images/107.png b/content/fax-images/107.png new file mode 100644 index 0000000..ecb1da3 Binary files /dev/null and b/content/fax-images/107.png differ diff --git a/content/fax-images/108.png b/content/fax-images/108.png new file mode 100644 index 0000000..7ee3096 Binary files /dev/null and b/content/fax-images/108.png differ diff --git a/content/fax-images/109.png b/content/fax-images/109.png new file mode 100644 index 0000000..e1388d8 Binary files /dev/null and b/content/fax-images/109.png differ diff --git a/content/fax-images/110.png b/content/fax-images/110.png new file mode 100644 index 0000000..d27f255 Binary files /dev/null and b/content/fax-images/110.png differ diff --git a/content/fax-images/111.png b/content/fax-images/111.png new file mode 100644 index 0000000..cd87e5d Binary files /dev/null and b/content/fax-images/111.png differ diff --git a/content/fax-images/112.png b/content/fax-images/112.png new file mode 100644 index 0000000..91846ef Binary files /dev/null and b/content/fax-images/112.png differ diff --git a/content/fax-images/113.png b/content/fax-images/113.png new file mode 100644 index 0000000..0fedeb8 Binary files /dev/null and b/content/fax-images/113.png differ diff --git a/content/fax-images/114.png b/content/fax-images/114.png new file mode 100644 index 0000000..bfab646 Binary files /dev/null and b/content/fax-images/114.png differ diff --git a/content/fax-images/115.png b/content/fax-images/115.png new file mode 100644 index 0000000..a91746d Binary files /dev/null and b/content/fax-images/115.png differ diff --git a/content/fax-images/116.png b/content/fax-images/116.png new file mode 100644 index 0000000..885024d Binary files /dev/null and b/content/fax-images/116.png differ diff --git a/content/fax-images/117.png b/content/fax-images/117.png new file mode 100644 index 0000000..2f97511 Binary files /dev/null and b/content/fax-images/117.png differ diff --git a/content/fax-images/118.png b/content/fax-images/118.png new file mode 100644 index 0000000..819011e Binary files /dev/null and b/content/fax-images/118.png differ diff --git a/content/fax-images/119.png b/content/fax-images/119.png new file mode 100644 index 0000000..644a01c Binary files /dev/null and b/content/fax-images/119.png differ diff --git a/content/fax-images/120.png b/content/fax-images/120.png new file mode 100644 index 0000000..2e316dd Binary files /dev/null and b/content/fax-images/120.png differ diff --git a/content/fax-images/121.png b/content/fax-images/121.png new file mode 100644 index 0000000..b6c8abc Binary files /dev/null and b/content/fax-images/121.png differ diff --git a/content/fax-images/122.png b/content/fax-images/122.png new file mode 100644 index 0000000..a51c30c Binary files /dev/null and b/content/fax-images/122.png differ diff --git a/content/fax-images/123.png b/content/fax-images/123.png new file mode 100644 index 0000000..beca72b Binary files /dev/null and b/content/fax-images/123.png differ diff --git a/content/fax-images/124.png b/content/fax-images/124.png new file mode 100644 index 0000000..7d9584d Binary files /dev/null and b/content/fax-images/124.png differ diff --git a/content/fax-images/125.png b/content/fax-images/125.png new file mode 100644 index 0000000..2e9b985 Binary files /dev/null and b/content/fax-images/125.png differ diff --git a/content/fax-images/126.png b/content/fax-images/126.png new file mode 100644 index 0000000..1c95c5b Binary files /dev/null and b/content/fax-images/126.png differ diff --git a/content/fax-images/127.png b/content/fax-images/127.png new file mode 100644 index 0000000..d68c073 Binary files /dev/null and b/content/fax-images/127.png differ diff --git a/content/fax-images/128.png b/content/fax-images/128.png new file mode 100644 index 0000000..7507b12 Binary files /dev/null and b/content/fax-images/128.png differ diff --git a/content/fax-images/129.png b/content/fax-images/129.png new file mode 100644 index 0000000..f8ee2cd Binary files /dev/null and b/content/fax-images/129.png differ diff --git a/content/fax-images/130.png b/content/fax-images/130.png new file mode 100644 index 0000000..39356a1 Binary files /dev/null and b/content/fax-images/130.png differ diff --git a/content/fax-images/131.png b/content/fax-images/131.png new file mode 100644 index 0000000..6db4568 Binary files /dev/null and b/content/fax-images/131.png differ diff --git a/content/fax-images/132.png b/content/fax-images/132.png new file mode 100644 index 0000000..2bf8386 Binary files /dev/null and b/content/fax-images/132.png differ diff --git a/content/fax-images/133.png b/content/fax-images/133.png new file mode 100644 index 0000000..844eb97 Binary files /dev/null and b/content/fax-images/133.png differ diff --git a/content/fax-images/134.png b/content/fax-images/134.png new file mode 100644 index 0000000..ffa292a Binary files /dev/null and b/content/fax-images/134.png differ diff --git a/content/fax-images/135.png b/content/fax-images/135.png new file mode 100644 index 0000000..9973ff6 Binary files /dev/null and b/content/fax-images/135.png differ diff --git a/content/fax-images/136.png b/content/fax-images/136.png new file mode 100644 index 0000000..df2d3f3 Binary files /dev/null and b/content/fax-images/136.png differ diff --git a/content/fax-images/137.png b/content/fax-images/137.png new file mode 100644 index 0000000..e398328 Binary files /dev/null and b/content/fax-images/137.png differ diff --git a/content/fax-images/138.png b/content/fax-images/138.png new file mode 100644 index 0000000..d450672 Binary files /dev/null and b/content/fax-images/138.png differ diff --git a/content/fax-images/139.png b/content/fax-images/139.png new file mode 100644 index 0000000..6ad3fdd Binary files /dev/null and b/content/fax-images/139.png differ diff --git a/content/fax-images/140.png b/content/fax-images/140.png new file mode 100644 index 0000000..f2c9ca5 Binary files /dev/null and b/content/fax-images/140.png differ diff --git a/content/fax-images/141.png b/content/fax-images/141.png new file mode 100644 index 0000000..2a96c41 Binary files /dev/null and b/content/fax-images/141.png differ diff --git a/content/fax-images/142.png b/content/fax-images/142.png new file mode 100644 index 0000000..dc10c2e Binary files /dev/null and b/content/fax-images/142.png differ diff --git a/content/fax-images/143.png b/content/fax-images/143.png new file mode 100644 index 0000000..ed5fd5b Binary files /dev/null and b/content/fax-images/143.png differ diff --git a/content/fax-images/144.png b/content/fax-images/144.png new file mode 100644 index 0000000..a4db8c6 Binary files /dev/null and b/content/fax-images/144.png differ diff --git a/content/fax-images/145.png b/content/fax-images/145.png new file mode 100644 index 0000000..91d4b31 Binary files /dev/null and b/content/fax-images/145.png differ diff --git a/content/fax-images/146.png b/content/fax-images/146.png new file mode 100644 index 0000000..490208f Binary files /dev/null and b/content/fax-images/146.png differ diff --git a/content/fax-images/147.png b/content/fax-images/147.png new file mode 100644 index 0000000..3ff5115 Binary files /dev/null and b/content/fax-images/147.png differ diff --git a/content/fax-images/148.png b/content/fax-images/148.png new file mode 100644 index 0000000..beb0cbb Binary files /dev/null and b/content/fax-images/148.png differ diff --git a/content/fax-images/149.png b/content/fax-images/149.png new file mode 100644 index 0000000..e1c0e45 Binary files /dev/null and b/content/fax-images/149.png differ diff --git a/content/fax-images/150.png b/content/fax-images/150.png new file mode 100644 index 0000000..8b65eb8 Binary files /dev/null and b/content/fax-images/150.png differ diff --git a/content/fax-images/151.png b/content/fax-images/151.png new file mode 100644 index 0000000..63351fb Binary files /dev/null and b/content/fax-images/151.png differ diff --git a/content/fax-images/152.png b/content/fax-images/152.png new file mode 100644 index 0000000..c81a281 Binary files /dev/null and b/content/fax-images/152.png differ diff --git a/service/package-lock.json b/service/package-lock.json new file mode 100644 index 0000000..7f8f288 --- /dev/null +++ b/service/package-lock.json @@ -0,0 +1,1369 @@ +{ + "name": "faxspittist", + "version": "1.4.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "faxspittist", + "version": "1.4.0", + "dependencies": { + "discord-interactions": "^3.4.0" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20240605.0", + "typescript": "^5.0.4", + "wrangler": "^3.0.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.2.tgz", + "integrity": "sha512-EeEjMobfuJrwoctj7FA1y1KEbM0+Q1xSjobIEyie9k4haVEBB7vkDvsasw1pM3rO39mL2akxIAzLMUAtrMHZhA==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20240605.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240605.0.tgz", + "integrity": "sha512-6V4Uze6jEM1mPBdPO6AevPwAOG2s+auEG1vPzZilwbrpn3BbYklEpQqcAZj05uUXaM6rnffnXerW8X8Fc8l4qQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20240605.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240605.0.tgz", + "integrity": "sha512-ZNxjVSeMYUhTfVlrMsVjpN5eHA2kq3+S7ZMsGu5l44ZqFrDygsFDoc9C4anJVUEIHGFUB9LMu4ZTdS5S80hvPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20240605.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240605.0.tgz", + "integrity": "sha512-zqOWDrYEudW5JCcU8lxCFQ96UHJJHrM+uvGaRS4u5nJaEgMr2z7u9I2286+l1R3JWvJdqj9ehGuHQvZkaTADxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20240605.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240605.0.tgz", + "integrity": "sha512-qFTVNem7bMsU9P1dXUi+kb8EdU5aag1I9RQq6ZLS/zfiJ0a/UasihwQG8lrzT7k9x80VnpyCekNmd625qsVZjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20240605.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240605.0.tgz", + "integrity": "sha512-s0U7d52ALQtb0enbHJ/AXmy+pyBQVoTIaAdAApy/PWrMiAnb8iJhf7A35pRTYfty5SUf7EX9BAPcKmeh+t3N5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20240605.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240605.0.tgz", + "integrity": "sha512-zJw4Q6CnkaQ5JZmHRkNiSs5GfiRgUIUL8BIHPQkd2XUHZkIBv9M9yc0LKEwMYGpCFC+oSOltet6c9RjP9uQ99g==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "dev": true, + "dependencies": { + "debug": "^4.3.1", + "tslib": "^2.2.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, + "node_modules/discord-interactions": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/discord-interactions/-/discord-interactions-3.4.0.tgz", + "integrity": "sha512-DG0Jxdd/FcK8liAPhIP4u5YHpnz50JWn9DK4OavxsLD49/WGimXtP3EdOY439MaWyCgQfsfFkA1GsTEyu63RzA==", + "dependencies": { + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/miniflare": { + "version": "3.20240605.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240605.0.tgz", + "integrity": "sha512-wE59RULU5zo6eYhL8j3wYdoOQ5istlkMruEr5pYvykL0LJecjKlFc8/cu4WJ5JdkdhutE1320Awi7WEICcolEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240605.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "dev": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unenv": { + "name": "unenv-nightly", + "version": "1.10.0-1717606461.a117952", + "resolved": "https://registry.npmjs.org/unenv-nightly/-/unenv-nightly-1.10.0-1717606461.a117952.tgz", + "integrity": "sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==", + "dev": true, + "dependencies": { + "consola": "^3.2.3", + "defu": "^6.1.4", + "mime": "^3.0.0", + "node-fetch-native": "^1.6.4", + "pathe": "^1.1.2", + "ufo": "^1.5.3" + } + }, + "node_modules/workerd": { + "version": "1.20240605.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240605.0.tgz", + "integrity": "sha512-2yhzgaprAOFm7H988xlRFmU4rOLXhSsq24wh6ayucMB3ORfe/nYJ2ysFn1mzjB+UxEJVt5PhixgHkZLv1S8UPQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20240605.0", + "@cloudflare/workerd-darwin-arm64": "1.20240605.0", + "@cloudflare/workerd-linux-64": "1.20240605.0", + "@cloudflare/workerd-linux-arm64": "1.20240605.0", + "@cloudflare/workerd-windows-64": "1.20240605.0" + } + }, + "node_modules/wrangler": { + "version": "3.60.2", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.60.2.tgz", + "integrity": "sha512-lGIuxzaVm8W0ddzwzwZtx3kL/0PUGMZfKBayUzcMq5wGk88aE9UA2lYeGF51EHVXX2yBbnw7Ltw2eXsx2ixNOQ==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.2", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "miniflare": "3.20240605.0", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "unenv": "npm:unenv-nightly@1.10.0-1717606461.a117952", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20240605.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "dev": true, + "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 + } + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true + }, + "node_modules/youch": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", + "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/service/package.json b/service/package.json new file mode 100644 index 0000000..d7ead95 --- /dev/null +++ b/service/package.json @@ -0,0 +1,18 @@ +{ + "name": "faxspittist", + "version": "1.4.0", + "private": true, + "scripts": { + "deploy": "wrangler deploy", + "start": "wrangler dev", + "dev": "wrangler dev" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20240605.0", + "typescript": "^5.0.4", + "wrangler": "^3.0.0" + }, + "dependencies": { + "discord-interactions": "^3.4.0" + } +} \ No newline at end of file diff --git a/service/src/Utils.ts b/service/src/Utils.ts new file mode 100644 index 0000000..38e13f1 --- /dev/null +++ b/service/src/Utils.ts @@ -0,0 +1,75 @@ +import Fax from "./commands/Fax"; +import Realtalk from "./commands/Realtalk"; +import { InteractionResponse } from "./typings"; + +export const CacheTTL = 60 * 60 * 24 * 7 // 1 Week +export const Commands = [ + Realtalk, + Fax, +] + +/** + * Returns a Response for a JSON Object with Headers and custom Status if given + * @param body - Response Body + * @param statusCode - Status Code + * @returns {Response} + */ +export function ToJSONResponse(statusCode: number, body: any): Response { + return new Response( + JSON.stringify(body), + { + status: statusCode, + headers: { + "Content-Type": "application/json" + } + } + ) +} + +/** + * Converts an Interaction to a JSON Response accepted by Discord + * @param response - Interaction Response + * @returns {Response} + */ +export function ToInteractionResponse(response: InteractionResponse): Response { + return ToJSONResponse(200, response) +} + + +/** + * + * @param env + * @returns {string} - The Access Token + */ +export async function GetAccessToken(env: Env): Promise { + return new Promise(async ok => { + // Check cache for the current token + let kvkey = "app_token" + let token = await env.CFKV.get(kvkey, "text") + if (token) return ok(token.toString()) + + // Get frehs access token from discord + const resp = await fetch( + "https://discord.com/api/v8/oauth2/token", + { + method: "POST", + headers: { + "content-type": "application/x-www-form-urlencoded", + "authorization": `Basic ${btoa(`${env.APPLICATION_ID}:${env.APPLICATION_SECRET}`)}` + }, + body: new URLSearchParams({ + grant_type: "client_credentials", + scope: "applications.commands.update" + }), + } + ) + const Body: { + access_token: string + expires_in: number + } = await resp.json() as any + + // Store token in cache + env.CFKV.put(kvkey, Body.access_token, { expirationTtl: Body.expires_in }) + return ok(Body.access_token) + }); +} \ No newline at end of file diff --git a/service/src/commands/Fax.ts b/service/src/commands/Fax.ts new file mode 100644 index 0000000..7c0fde7 --- /dev/null +++ b/service/src/commands/Fax.ts @@ -0,0 +1,40 @@ +import { InteractionResponseType } from "discord-interactions" +import { CacheTTL, ToInteractionResponse } from "../Utils" +import { FaxCommand } from "../typings" + +const ImageCount = 152 + +const Fax: FaxCommand = { + structure: { + name: "fax", + description: "๐Ÿ“  Facts from the Goat" + }, + command: async (int, env) => { + + // Fetch used item list + let key = `usable_fax_${int.guild_id}` + let usableList: Array | null = await env.CFKV.get(key, 'json') + if (!usableList || usableList.length === 0) { + // Create new list of usable items + usableList = [] + for (var x = 1; x <= ImageCount; x++) usableList.push(x) + } + + // Choose a Random Item + const imageId = usableList[Math.floor(Math.random() * usableList.length)]; + + // Update List + usableList.splice(imageId, 1) + env.CFKV.put(key, JSON.stringify(usableList), { expirationTtl: CacheTTL }) + + // Respond to Interaction + return ToInteractionResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + // Discord automatically converts URL into Image Previews + content: env.BUCKET_URL + imageId.toString().padStart(ImageCount.toString().length, '0') + ".png" + } + }) + }, +} +export default Fax \ No newline at end of file diff --git a/service/src/commands/Realtalk.ts b/service/src/commands/Realtalk.ts new file mode 100644 index 0000000..1177df8 --- /dev/null +++ b/service/src/commands/Realtalk.ts @@ -0,0 +1,119 @@ +import { InteractionResponseType } from "discord-interactions" +import { CacheTTL, ToInteractionResponse } from "../Utils" +import { FaxCommand } from "../typings" + +const Realtalk: FaxCommand = { + structure: { + name: "realtalk", + description: "๐Ÿ”Š Real Talk from the Goat" + }, + command: async (int, env) => { + + // Fetch used item list + let key = `usable_realtalk_${int.guild_id}` + let usableList: Array | null = await env.CFKV.get(key, 'json') + if (!usableList || usableList.length === 0) { + // Create new list of usable items + usableList = [] + for (var x = 1; x <= Quotes.length; x++) usableList.push(x) + } + + // Choose a Random Item + const QuoteId = usableList[Math.floor(Math.random() * usableList.length)]; + const QuoteText = Quotes[QuoteId]; + + // Update List + usableList.splice(QuoteId, 1) + env.CFKV.put(key, JSON.stringify(usableList), { expirationTtl: CacheTTL }) + + // Respond to Interaction + return ToInteractionResponse({ + type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE, + data: { + content: QuoteText, + } + }) + }, +} +export default Realtalk + +const Quotes = [ + "Don't worry kiddo, one day someone is going to admire you for who you are. For the way you speak, the way you smile, the way you laugh at the smallest things. Trust me, it will happen. For now just breathe and enjoy life.", + "There is so much to look foward to, please hang in there friend.", + "Shout out to the cool, kind, and good-looking human being reading this! YOU are loved and deserve to be loved, just the way you are. Keep smiling.", + "Imagine how much stuff you could avoid if you knew someone's true intentions from the start.", + "Hey friend, its okay to talk about your problems. It does not make you weak at all. Yes, it makes you vulnerable, but it will make you stronger.", + "Stop imagining fake scenarios and hurting your own feelings.", + "Stop and think about all the people you secretly admired. All the people who you've found attractive, but never said a word to. All the people you've had a temporarily crush on while riding public transportation. All the people you've dreamt of and thought of early in the morning Now take a moment a realize, you've been this person for many people, and you have no idea.", + "Its crazy how you're over here doubting yourself while so many people are afraid of your potiential.", + "The impact you make on others is bigger than you think. Someone laughs every time they think of that funny thing you said. Someone smiles when they think of that compliment you gave them. Someone secretly admires you. Someone appreciates the love and support you give them. You're not insignificant in any way. Your existence makes a positive difference whether you see it or not.", + "No matter how much you miss a toxic person, please don't contact them. They're not worth your time, you'll just be sad again. We both know you deserve nothing but happiness. You don't ever need to feel drained and exhausted over someone.", + "Learn to get back on track. When things go wrong, it don't really mean you've failed. It's normal to have days where you mess up, skip a work out, eat badly or ruin a perfect routine. and that's okay! It's all about being strong enough to forgive yourself and know that no matter how far you've gone in the wrong direction, you'll always have the chance to turn it around.", + "Its okay if you thought you were over it but it hits you all over again. Its okay to fall apart even after you thought you had it under control. You are not weak. Healing is messy. There is no timeline for healing.", + "If you notice yourself giving more energy than you recieve, step back.", + "Hey friend, I hope that one day you feel secure in your mental health, and if not secure at least hopeful and confident that you're making the right decisions for yourself.", + "I hope this time, when you notice the red flags, you don't ignore them. I hope this time when you see the lack of effort, you don't force it, you pick up and go. I really hope you save yourself before you even get hurt.", + "Always remember that you can have the worst days of your life and a few weeks later you can have the best days of your life. Keep pushing friend.", + "Are you really losing friends or are you just losing the people who was never genuine in the first place?", + "The ones with the realest and kindest hearts get treated the worst but we will always win at the end, I promise you that.", + "Dont forget, you've survived 100% of your bad days.", + "Check yourself. Sometimes you are the toxic person. Sometimes you are the mean, negative person you're trying to push away. Sometimes the problem is you but that doesn't make you less worthy. Keep growing, keep checking on yourself and motivating yourself. Mistakes are opportunities. Face them, grow from them and move on.", + "Do yourself a favor and take mixed signals as a no.", + "Before your head hits the pillow tonight, remind yourself that you've done a good job. Be patient with yourself, and remember that big things are achieved not all at once, but one day at a time.", + "You spend most of your life inside your head. So make it a nice place to be.", + "If you have time to feel like crap, complain and check social media, then you have the time to meditate, write out how you feel, create a list of goals, make a list of things you are grateful for and better yourself.", + "I may not know you but im rooting/cheering for you. I really hope that you live a long and good life filled with more love and good times than you can ever imagine.", + "Stop real quick and thank yourself for how far you've come! It hasn't been easy.", + "If you haven't heard it in a while, I want to remind you that im so incredibly proud of you kiddo.", + "It's okay kiddo, you don't have to get it right every day.", + "You can't force anybody to see that you are a blessing, just gotta let them miss out.", + "One day, you are going to have everything you prayed for.", + "Don't put so much time trying to be more physically appealing to find love. Remember the importance of being mentally attractive. Things like educating yourself, addressing your recurring toxic thoughts, dealing with your insecurities and learning to be happy on your own makes you attractive.", + "You're getting distracted again kiddo, stay focused.", + "You are replacable and so are they. Let those crazy thoughts go away and realize they chose you because of how special you are.", + "Make sure you work on things that people can't take away from you. Things like your character, your personality, your honesty, your entire being.", + "You deserve to be loved without having to hide the parts of yourself that you think are unlovable.", + "You are beautiful You're just hard on yourself sometimes.", + "Everything heals. Your body heals. Your heart heals. The mind heals. Wounds heals. Your soul repairs itself. Your happiness is always going to come back. Bad times don't last long.", + "The point is not to become a \"mean cold-hearted person\". It's more about becoming unbothered by things, accepting things for what it is, being content, and staying focused.", + "In order to be successful at anything , you dont have to be different. You simply have to be what most people aren't: consistent.", + "You're not giving yourself enough credit kiddo, for overcoming the tough things and getting better. Like you made it this far. You deserve to celebrate how strong you are.", + "Give yourself some credit, you made it through the days you thought you couldn't", + "It costs $0.00 to remind someone they aren't alone in this world.", + "If you are sad or lonely just remember there are billions of cells in your body and all they give a dam about is you.", + "Not everyone you want in your life wants you in theirs, so stop trying to force someone to stay when they couldn't care less if you're around or not.", + " This is your time to become who you want to be. This is your time to do things you love. This is your time to dedicate yourself to anything you think its worth living for.", + "Would you like you, if you met you?", + "It takes time to love yourself. Don't feel bad if you can't do it yet. You'll be able to soon. I promise", + "You deserve to rest without feeling guilty about it.", + "Dont worry friend, you will get better. Maybe not today, but someday.", + "Please be yourself, even if you're crazy. Stop worrying about people with no personality judging you.", + "Up your levels of self care and watch how much less you care about what isn't for you.", + "You deserve that same love that you keep giving to everyone else.", + "Actions prove who someone is, words just prove who they want to be.", + "Replacing \"why is this happening to me\" with \"what is this trying to teach me\" is a game changer", + "I just want to let you know that you are allowed to get up one day & decide to change who you are. You can choose to dress differently, change hairstyles, be more outspoken, say hi to new people, boost your confidence. You're not obligated to stay the way others view you.", + "Even if you go for it and it doesn't work out, you still took a W. You had the guts to head straight into something that seemed so scary. That type of bravery takes you very far.", + "Its your job to keep YOURSELF happy. Never rely on anyone else to do that for you.", + "Self love will save you every single time.", + "To all my people with good hearts, one day you'll get what you deserve", + "Reset. Restart. Refocus as many times as you need to. Just dont give up!", + "You are either as beautiful or as ugly as you believe you are. Only YOU can define your beauty. Thats not a power anyone can have over you.", + "You can leave a toxic relationship/friendship but if you don't heal what attracted you to them, youll eventually face the same consequence. The same toxic traits but in a different person.", + "You are important and special and loved even when your mind tells you you're not.", + "Dont ever forget to remind people who you are just incase they get a little bit too comfortable.", + "You are so used to your own looks, you dont know how beautiful you look to a stranger.", + "Don't give up, kiddo. There's a future version of youself whos proud of how strong you are.", + "Go surround yourself with people who bring out the best in you.", + "One day you'll back and you'll be proud of yourself.", + "Sometimes you need to take a step back and realize the world is too beautiful to waste your time being angry or sad when you could be enjoying what life has to offer.", + "Ever just wanted to burst into tears because you've been holding in so much? Its okay to let it out. You're human. It will get better friend.", + "You have to be responsible for your emotional intelligence. It's no longer about who hurt you or what made you this way, it's about what YOU can do to fix YOUR problem. Playing the blame game will leave you stuck and sad. Don't do it to yourself.", + "Deep down you know exactly what you're capable of. There's even moments where you get a glimpse of all the potential you have. You can get there. You just have to be willing to sacrifice the habits, things, and situations that are standing in the way of your success.", + "Everything will work in your favor all of a sudden and you will be thankful that you didn't give up. Blessings are coming believe that.", + "Everyday, you continue. You wake up and conquer the day. You accomplish so many things, big or small. You keep pushing through. The dreaded weeks, school, family, whatever it may be. You're doing it.", + "ะะตy, you are not behind in life. There's no timetable that we all must follow. 7 billion people cant do everything in the same order. Its never too early and its never too late. Stop beating yourself up about where you are now. At the end of the day its your schedule and everything is right on time.", + "Hey I know your trying real hard to silently recover And i want you to know Im proud of you and every step you take. Your doing great.", + "Whenever you think you have nothing left just remind yourself that you still have your favorite song, more chances, new beginnings, nice clothes, warm bed and yourself.", + "In order to love who you are, you can not hate the experiences that shaped you." +] \ No newline at end of file diff --git a/service/src/index.ts b/service/src/index.ts new file mode 100644 index 0000000..727c446 --- /dev/null +++ b/service/src/index.ts @@ -0,0 +1,72 @@ +import { InteractionResponseType, InteractionType, verifyKey } from "discord-interactions" +import { Commands, GetAccessToken, ToInteractionResponse, ToJSONResponse } from "./Utils" +import { Interaction } from "./typings" + +export default { + async fetch(req: Request, env: Env, ctx: ExecutionContext): Promise { + const requestURL = new URL(req.url, 'http://localhost') + + // Handle discord user interaction + if (requestURL.pathname === '/interactions') { + + // Validate Request came from Discord + const RequestBody = await req.text() + const HSignature = req.headers.get("x-signature-ed25519") + const HTimestamp = req.headers.get("x-signature-timestamp") + if (!HSignature || !HTimestamp) { + return ToJSONResponse(401, "Invalid Headers") + } + const isValidRequest = verifyKey( + RequestBody, + HSignature, + HTimestamp, + env.APPLICATION_PUBLICKEY, + ) + if (!isValidRequest) { + return ToJSONResponse(401, "Invalid Request") + } + + // Handle Interaction + const int: Interaction = JSON.parse(RequestBody) + switch (int.type) { + // Required for discord to verify the interaction endpoint + case InteractionType.PING: + return new Response( + JSON.stringify({ type: InteractionResponseType.PONG }) + ) + + // Route command to its handler + case InteractionType.APPLICATION_COMMAND: + const someCommand = Commands.find(c => c.structure.name == int.data.name) + return someCommand + ? await someCommand.command(int, env) + : ToInteractionResponse({ + type: 4, + data: { + content: "Unknown Command" + } + }) + } + } + + // Send slash commands to discord + if (requestURL.pathname === '/deploy') { + const token = await GetAccessToken(env) + const resp = await fetch( + `https://discord.com/api/applications/${env.APPLICATION_ID}/commands`, + { + method: "PUT", + headers: { + "authorization": `Bearer ${token}`, + "content-type": "application/json", + }, + body: JSON.stringify(Commands.map(c => c.structure)), + } + ) + return ToJSONResponse(resp.status, await resp.json()) + } + + // 404 Handler + return ToJSONResponse(404, "Endpoint Not Found") + }, +} diff --git a/service/src/typings.d.ts b/service/src/typings.d.ts new file mode 100644 index 0000000..df10275 --- /dev/null +++ b/service/src/typings.d.ts @@ -0,0 +1,57 @@ +import { InteractionResponseType } from "discord-interactions"; + +export interface FaxCommand { + command: (int: Interaction, env: Env) => Promise + structure: { + name: string + description: string + } +} + +export interface FaxRoute { + path: string; + handler: (req: Request, env: Env, ctx: ExecutionContext) => Promise +} + +export interface InteractionResponse { + type: InteractionResponseType + data: { + content: string + } +} + +export interface Interaction { + id: string + application_id: string + type: InteractionType + token: string + version: number + guild_id?: string + channel_id?: string + data: { + id: string + name: string + type: InteractionType + } + user?: { + id: string + username: string + discriminator: number + bot?: boolean + system?: boolean + banner?: string + accent_color?: number + } + member?: { + nick?: string + avatar?: string + roles: Array + joined_at: string + premium_since?: string + deaf: boolean + mute: boolean + pending?: boolean + permissions?: string + communication_disabled_until?: string + } +} \ No newline at end of file diff --git a/service/tsconfig.json b/service/tsconfig.json new file mode 100644 index 0000000..9192490 --- /dev/null +++ b/service/tsconfig.json @@ -0,0 +1,104 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + "lib": ["es2021"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, + "jsx": "react" /* Specify what JSX code is generated. */, + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "es2022" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + "moduleResolution": "Bundler" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + "types": [ + "@cloudflare/workers-types/2023-07-01" + ] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true /* Enable importing .json files */, + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */, + "checkJs": false /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + "noEmit": true /* Disable emitting files from a compilation. */, + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + "isolatedModules": true /* Ensure that each file can be safely transpiled without relying on other imports. */, + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + // "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": ["test"] +} diff --git a/service/worker-configuration.d.ts b/service/worker-configuration.d.ts new file mode 100644 index 0000000..7ee12f1 --- /dev/null +++ b/service/worker-configuration.d.ts @@ -0,0 +1,7 @@ +interface Env { + CFKV: KVNamespace; + BUCKET_URL: string; + APPLICATION_ID: string; + APPLICATION_PUBLICKEY: string; + APPLICATION_SECRET: string; +} \ No newline at end of file