Repository: TheOdinProject/odin-bot-v2
Pull request #397 (2023-08-21 07:37:16)

Bump eslint-plugin-import from 2.27.5 to 2.28.1
Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.27.5 to 2.28.1.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md">eslint-plugin-import's changelog</a>.</em></p>
<blockquote>
<h2>[2.28.1] - 2023-08-18</h2>
<h3>Fixed</h3>
<ul>
<li>[<code>order</code>]: revert breaking change to single nested group (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2854">#2854</a>, thanks [<a href="https://github.com/yndajas"><code>@​yndajas</code></a>])</li>
</ul>
<h3>Changed</h3>
<ul>
<li>[Docs] remove duplicate fixable notices in docs (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2850">#2850</a>, thanks [<a href="https://github.com/bmish"><code>@​bmish</code></a>])</li>
</ul>
<h2>[2.28.0] - 2023-07-27</h2>
<h3>Fixed</h3>
<ul>
<li>[<code>no-duplicates</code>]: remove duplicate identifiers in duplicate imports (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2577">#2577</a>, thanks [<a href="https://github.com/joe-matsec"><code>@​joe-matsec</code></a>])</li>
<li>[<code>consistent-type-specifier-style</code>]: fix accidental removal of comma in certain cases (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2754">#2754</a>, thanks [<a href="https://github.com/bradzacher"><code>@​bradzacher</code></a>])</li>
<li>[Perf] <code>ExportMap</code>: Improve <code>ExportMap.for</code> performance on larger codebases (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2756">#2756</a>, thanks [<a href="https://github.com/leipert"><code>@​leipert</code></a>])</li>
<li>[<code>no-extraneous-dependencies</code>]/TypeScript: do not error when importing inline type from dev dependencies (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/1820">#1820</a>, thanks [<a href="https://github.com/andyogo"><code>@​andyogo</code></a>])</li>
<li>[<code>newline-after-import</code>]/TypeScript: do not error when re-exporting a namespaced import (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2832">#2832</a>, thanks [<a href="https://github.com/laurens-dg"><code>@​laurens-dg</code></a>])</li>
<li>[<code>order</code>]: partial fix for <a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2687">#2687</a> (thanks [<a href="https://github.com/ljharb"><code>@​ljharb</code></a>])</li>
<li>[<code>no-duplicates</code>]: Detect across type and regular imports (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2835">#2835</a>, thanks [<a href="https://github.com/benkrejci"><code>@​benkrejci</code></a>])</li>
<li>[<code>extensions</code>]: handle <code>.</code> and <code>..</code> properly (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2778">#2778</a>, thanks [<a href="https://github.com/benasher44"><code>@​benasher44</code></a>])</li>
<li>[<code>no-unused-modules</code>]: improve schema (thanks [<a href="https://github.com/ljharb"><code>@​ljharb</code></a>])</li>
<li>[<code>no-unused-modules</code>]: report error on binding instead of parent export (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2842">#2842</a>, thanks [<a href="https://github.com/Chamion"><code>@​Chamion</code></a>])</li>
</ul>
<h3>Changed</h3>
<ul>
<li>[Docs] [<code>no-duplicates</code>]: fix example schema (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2684">#2684</a>, thanks [<a href="https://github.com/simmo"><code>@​simmo</code></a>])</li>
<li>[Docs] [<code>group-exports</code>]: fix syntax highlighting (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2699">#2699</a>, thanks [<a href="https://github.com/devinrhode2"><code>@​devinrhode2</code></a>])</li>
<li>[Docs] [<code>extensions</code>]: reference node ESM behavior (<a href="https://redirect.github.com/import-js/eslint-plugin-import/issues/2748">#2748</a>, thanks [<a href="https://github.com/xM8WVqaG"><code>@​xM8WVqaG</code></a>])</li>
<li>[Refactor] [<code>exports-last</code>]: use <code>array.prototype.findlastindex</code> (thanks [<a href="https://github.com/ljharb"><code>@​ljharb</code></a>])</li>
<li>[Refactor] [<code>no-anonymous-default-export</code>]: use <code>object.fromentries</code> (thanks [<a href="https://github.com/ljharb"><code>@​ljharb</code></a>])</li>
<li>[Refactor] [<code>no-unused-modules</code>]: use <code>array.prototype.flatmap</code> (thanks [<a href="https://github.com/ljharb"><code>@​ljharb</code></a>])</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/cd957286efe1c4aa0423f82ac5576c75fd3be71e"><code>cd95728</code></a> Bump to 2.28.1</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/0847443b0a6d8273a862960e51ffcf478f636abf"><code>0847443</code></a> Revert 1fa2971 (breaking group change in <code>order</code>)</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/e9de30a9cbf8daab9f7e62131596d554884a56ac"><code>e9de30a</code></a> [resolvers/webpack] v0.13.6</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/cd1dff7544c90c79ef162e93fbe1e1e62d5e80bc"><code>cd1dff7</code></a> Revert &quot;[resolvers/webpack] [refactor] replace <code>lodash/isEqual</code> usage with `d...</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/da71746147450a5b7eeeaca77efc521125d91d41"><code>da71746</code></a> [resolvers/webpack] v0.13.5</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/22a080249074a86339ef4f30af02490e6084eb49"><code>22a0802</code></a> [resolvers/webpack] [deps] update <code>resolve</code></li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/1e81734ddd7a040053d08045c922b15ea9d2045e"><code>1e81734</code></a> [resolvers/webpack] [refactor] replace <code>lodash/isEqual</code> usage with <code>deep-equal</code></li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/2c18c2906dab446023afc3117d6cfdca0d2bbcec"><code>2c18c29</code></a> [resolvers/webpack] [refactor] remove <code>lodash/get</code> usage</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/b9b9c86e918e268c325066af5938ad779f5f6e97"><code>b9b9c86</code></a> [resolvers/webpack] [refactor] switch to a maintained array.prototype.find pa...</li>
<li><a href="https://github.com/import-js/eslint-plugin-import/commit/2e7612ffdfe7721919cdb39832a78cf0b8828162"><code>2e7612f</code></a> [Dev Deps] pin <code>jackspeak</code> since 2.1.2+ depends on npm aliases, which kill th...</li>
<li>Additional commits viewable in <a href="https://github.com/import-js/eslint-plugin-import/compare/v2.27.5...v2.28.1">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint-plugin-import&package-manager=npm_and_yarn&previous-version=2.27.5&new-version=2.28.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/botCommands/club_40_gifs.json b/botCommands/club_40_gifs.json
index 95ceac0..b3ba2f7 100644
--- a/botCommands/club_40_gifs.json
+++ b/botCommands/club_40_gifs.json
@@ -62,5 +62,13 @@
   {
     "gif": "https://i.imgur.com/DVrRqoF.gif",
     "author": "Sully"
+  },
+  {
+    "gif": "https://media.tenor.com/VRYCq0ZeasQAAAAC/dundie-award.gif",
+    "author": "Unknown"
+  },
+  {
+    "gif": "https://i.imgur.com/EhZCIzv.gif",
+    "author": "Mao"
   }
-]
+]
\ No newline at end of file
diff --git a/botCommands/code.js b/botCommands/code.js
new file mode 100644
index 0000000..55d7ae0
--- /dev/null
+++ b/botCommands/code.js
@@ -0,0 +1,51 @@
+const Discord = require("discord.js");
+const { registerBotCommand } = require("../botEngine");
+
+const code = {
+  regex: /(?<!\S)!code(?!\S)/,
+  cb: ({ mentions }) => {
+    let users = "";
+    if (mentions.users) {
+      mentions.users.forEach((user) => {
+        users += `<@${user.id}> `;
+      });
+    }
+
+    const codeCommandEmbed = new Discord.EmbedBuilder()
+      .setColor('#cc9543')
+      .setTitle('How to share your code')
+      .setDescription(`
+**Codeblocks:**        
+
+To write multiple lines of code with language syntax highlighting, use three [backticks](https://i.stack.imgur.com/ETTnT.jpg) followed by the language:
+
+\\\`\\\`\\\`js
+// your JavaScript code goes here
+\\\`\\\`\\\`
+
+**Inline code:**
+
+For \`inline code\` use one backtick (no syntax highlighting):
+
+\\\`code here!\\\`
+
+**Websites:**
+
+- [Code Sandbox](https://codesandbox.io/) for Webpack/React projects
+- [Repl.it](https://replit.com/) for JavaScript/Ruby projects
+- [Codepen](https://codepen.io/) for basic HTML/CSS/Javascript
+      `
+      );
+
+    return { 
+      content: users ? `${users.trim()}` : '',
+      embeds: [codeCommandEmbed] 
+    };
+  },
+};
+
+registerBotCommand(code.regex, code.cb);
+
+module.exports = {
+  code,
+};
diff --git a/botCommands/help.js b/botCommands/help.js
index f4f5937..fed2bc5 100644
--- a/botCommands/help.js
+++ b/botCommands/help.js
@@ -1,27 +1,31 @@
-const Discord = require('discord.js');
-const { registerBotCommand } = require('../botEngine');
+const Discord = require("discord.js");
+const { registerBotCommand } = require("../botEngine");
 
 const help = {
   regex: /(?<!\S)!help(?!\S)/,
   cb: () => {
     const helpEmbed = new Discord.EmbedBuilder()
-      .setColor('#cc9543')
-      .setTitle('Help')
-      .setDescription('**By posting in this chatroom you agree to our [rules](https://www.theodinproject.com/guides/community/rules)** and our **[community expectations](https://www.theodinproject.com/guides/community/expectations)**.')
+      .setColor("#cc9543")
+      .setTitle("Help")
+      .setDescription(
+        "**By posting in this chatroom you agree to our [rules](https://www.theodinproject.com/guides/community/rules)** and our **[community expectations](https://www.theodinproject.com/guides/community/expectations)**."
+      )
       .addFields([
         {
-          name: 'Add Points',
-          value: 'Give points to someone who has been helpful by mentioning their name \n and adding ++ : \n `@username ++` or by \n giving them a star : `@username :star:`.',
+          name: "Add Points",
+          value:
+            "Give points to someone who has been helpful by mentioning their name \n and adding ++ : \n `@username ++` or by \n giving them a star : `@username :star:`.",
           inline: true,
         },
         {
-          name: 'Leaderboard',
-          value: 'View the points leaderboard with `!leaderboard`. \n\n Modify it with `n=` and `start=` i.e. `!leaderboard n=25 start=30`.',
+          name: "Leaderboard",
+          value:
+            "View the points leaderboard with `!leaderboard`. \n\n Modify it with `n=` and `start=` i.e. `!leaderboard n=25 start=30`.",
           inline: true,
         },
         {
-          name: 'Contribute to the bot',
-          value: '<https://github.com/TheOdinProject/odin-bot-v2>',
+          name: "Contribute to the bot",
+          value: "<https://github.com/TheOdinProject/odin-bot-v2>",
           inline: true,
         },
       ]);
@@ -30,62 +34,8 @@ const help = {
   },
 };
 
-const code = {
-  regex: /(?<!\S)!code(?!\S)/,
-  cb: ({ mentions }) => {
-    let users = '';
-    if (mentions.users) {
-      mentions.users.forEach((user) => {
-        users += `<@${user.id}> `;
-      });
-    }
-
-    const codeCommandEmbed = new Discord.EmbedBuilder()
-      .setColor('#cc9543')
-      .setTitle('HOW TO EMBED CODE SNIPPETS')
-      .setDescription(
-        !users ? 'Hey, here\'s some helpful tips on sharing your code with others!' : `Hey, ${users.trim()}, here's some helpful tips on sharing your code with others!`,
-      )
-      // weird formating is needer to avoid identation on mobile
-      .addFields([{
-        name: 'Sharing Code on Discord',
-        value: `To write multiple lines of code with language syntax highlighting, use three backticks (<https://i.stack.imgur.com/ETTnT.jpg>), followed by the language.
-
-\\\`\\\`\\\`js
-[Put your JavaScript Code here!]
-\\\`\\\`\\\`
-
-For \`inline code\` use one backtick (no syntax highlighting):
-
-\\\`Code here!\\\`
-      `,
-      },
-      {
-        name: 'Link a Code Sandbox to share Webpack/React examples',
-        value: 'https://codesandbox.io/',
-        inline: true,
-      },
-      {
-        name: 'Link a Repl.it to share Javascript/Ruby examples',
-        value: 'https://replit.com/',
-        inline: true,
-      },
-
-      {
-        name: 'Link a Codepen to share basic HTML/CSS/Javascript examples',
-        value: 'https://codepen.io/',
-        inline: true,
-      },
-      ]);
-
-    return { embeds: [codeCommandEmbed] };
-  },
-};
-
 registerBotCommand(help.regex, help.cb);
-registerBotCommand(code.regex, code.cb);
 
 module.exports = {
   help,
-  code,
 };
diff --git a/new-era-commands/slash/ai.js b/new-era-commands/slash/ai.js
index 134cac5..f59b7ec 100644
--- a/new-era-commands/slash/ai.js
+++ b/new-era-commands/slash/ai.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('ai')
-    .setDescription('Generative AI and Learning to Code'),
+    .setDescription('Generative AI and Learning to Code')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const aiEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Generative AI and Learning Code')
@@ -26,6 +29,9 @@ module.exports = {
         ],
       );
 
-    await interaction.reply({ embeds: [aiEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [aiEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/bookmark.js b/new-era-commands/slash/bookmark.js
index 68f5b2d..986546e 100644
--- a/new-era-commands/slash/bookmark.js
+++ b/new-era-commands/slash/bookmark.js
@@ -4,19 +4,25 @@ const config = require('../../config');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('bookmark')
-    .setDescription('Info about bookmarking messages in the TOP Discord server'),
+    .setDescription('Info about bookmarking messages in the TOP Discord server')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const bookmarkEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Bookmark messages in this server')
       .setDescription(`
-To bookmark a message, react with the bookmark icon 🔖 on the message you wish to save for later. 
+To bookmark a message, react with the bookmark icon 🔖 on the message you wish to save for later.
 
-<@${config.clientId}> will then deliver the message to your DMs in an embedded format with a link to the original message in the server. 
+<@${config.clientId}> will then deliver the message to your DMs in an embedded format with a link to the original message in the server.
 
 You can delete a bookmarked message at any time from your DMs by reacting on it with the ❌ emoji.
       `);
 
-    await interaction.reply({ embeds: [bookmarkEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [bookmarkEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/code.js b/new-era-commands/slash/code.js
index 9024642..ca2f92d 100644
--- a/new-era-commands/slash/code.js
+++ b/new-era-commands/slash/code.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('code')
-    .setDescription('How to share your code'),
+    .setDescription('How to share your code')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const codeEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('How to share your code')
@@ -30,6 +33,9 @@ For \`inline code\` use one backtick (no syntax highlighting):
 - [Codepen](https://codepen.io/) for basic HTML/CSS/Javascript
       `);
 
-    await interaction.reply({ embeds: [codeEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [codeEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/contribute.js b/new-era-commands/slash/contribute.js
index a0f2621..f67d8ae 100644
--- a/new-era-commands/slash/contribute.js
+++ b/new-era-commands/slash/contribute.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('contribute')
-    .setDescription('Information on how to contribute to TOP on GitHub'),
+    .setDescription('Information on how to contribute to TOP on GitHub')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const contributingEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Contributing to The Odin Project Repositories')
@@ -20,11 +23,11 @@ To contribute to The Odin Project, check out our repositories on GitHub:
 
 Make sure to read the [contributing guide](https://github.com/TheOdinProject/.github/blob/main/CONTRIBUTING.md) before getting started.
 
-To find issues ready to be worked on, go to the \`issues\` tab in each repository. You can also create new issues or propose suggestions there. 
+To find issues ready to be worked on, go to the \`issues\` tab in each repository. You can also create new issues or propose suggestions there.
 
 **First time contributors**
 
-If you're a first-time contributor, you can look for issues labeled \`good first issue\`. 
+If you're a first-time contributor, you can look for issues labeled \`good first issue\`.
 These are beginner-friendly and perfect for getting started with open source contributions.
 
 **Top-contributors role**
@@ -34,6 +37,9 @@ You will recognize our TOP-Contributors by their special role which you can lear
 We hope to see you on GitHub!
       `);
 
-    await interaction.reply({ embeds: [contributingEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [contributingEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/data.js b/new-era-commands/slash/data.js
index a54939a..8a562c5 100644
--- a/new-era-commands/slash/data.js
+++ b/new-era-commands/slash/data.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('data')
-    .setDescription("Don't ask to ask!"),
+    .setDescription("Don't ask to ask!")
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const dataEmbed = new EmbedBuilder()
       .setTitle('Don’t ask to ask!')
       .setColor('#cc9543')
@@ -21,12 +24,15 @@ Instead of asking if anyone can help you, ask your question outright with as muc
 **Lesson link:**
 **Code:** [code sandbox like replit or codepen]
 **Issue/Problem:** [screenshots if applicable]
-**What I expected:** 
-**What I've tried:** 
+**What I expected:**
+**What I've tried:**
 
 **https://www.dontasktoask.com/**
         `);
 
-    await interaction.reply({ embeds: [dataEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [dataEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/debug.js b/new-era-commands/slash/debug.js
index 7bda178..173a841 100644
--- a/new-era-commands/slash/debug.js
+++ b/new-era-commands/slash/debug.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('debug')
-    .setDescription('Debugging'),
+    .setDescription('Debugging')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const debugEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('DEBUGGING')
@@ -24,6 +27,9 @@ module.exports = {
         ],
       );
 
-    await interaction.reply({ embeds: [debugEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [debugEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/freelance.js b/new-era-commands/slash/freelance.js
index ad44e04..1f147d9 100644
--- a/new-era-commands/slash/freelance.js
+++ b/new-era-commands/slash/freelance.js
@@ -3,15 +3,21 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('freelancing')
-    .setDescription('Things to consider about freelancing'),
+    .setDescription('Things to consider about freelancing')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const freelanceEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Freelancing')
       .setDescription(`
-Here are some things that should be considered before getting into freelancing: https://discord.com/channels/505093832157691914/505093832157691916/928760451213443193 
+Here are some things that should be considered before getting into freelancing: https://discord.com/channels/505093832157691914/505093832157691916/928760451213443193
       `);
 
-    await interaction.reply({ embeds: [freelanceEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [freelanceEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/memory.js b/new-era-commands/slash/memory.js
new file mode 100644
index 0000000..89f4f5b
--- /dev/null
+++ b/new-era-commands/slash/memory.js
@@ -0,0 +1,21 @@
+const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
+
+module.exports = {
+  data: new SlashCommandBuilder()
+    .setName('memory')
+    .setDescription('A professional\'s anecdote about why you don\'t need to memorize everything you\'re learning.')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
+  execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+    const memoryEmbed = new EmbedBuilder()
+      .setColor('#cc9543')
+      .setTitle('Memorization and learning to code')
+      .setDescription(
+        'Please read this [blog post about why you don\'t need to memorize everything you learn.](https://dev.to/theodinproject/memorization-and-learning-to-code-1b6h)',
+      );
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [memoryEmbed],
+    });
+  },
+};
diff --git a/new-era-commands/slash/notes.js b/new-era-commands/slash/notes.js
index 81c6380..e95f69b 100644
--- a/new-era-commands/slash/notes.js
+++ b/new-era-commands/slash/notes.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('notes')
-    .setDescription('Things to consider about taking notes'),
+    .setDescription('Things to consider about taking notes')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const freelanceEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('To note, or not to note, that is the question')
@@ -12,6 +15,9 @@ module.exports = {
 Please read this [Discord message about what we think you should consider about taking notes](https://discord.com/channels/505093832157691914/505093832157691916/768161823366578176)
       `);
 
-    await interaction.reply({ embeds: [freelanceEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [freelanceEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/portfolio.js b/new-era-commands/slash/portfolio.js
index 9345b0f..e845c3e 100644
--- a/new-era-commands/slash/portfolio.js
+++ b/new-era-commands/slash/portfolio.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('portfolio')
-    .setDescription('Information about portfolio-worthy projects'),
+    .setDescription('Information about portfolio-worthy projects')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const portfolioEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Strategically Building Your Portfolio')
@@ -14,6 +17,9 @@ module.exports = {
 Read more on which projects are worth your extra time in
 [this article about strategically building your portfolio](https://dev.to/theodinproject/strategically-building-your-portfolio-1km4)
 `);
-    await interaction.reply({ embeds: [portfolioEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [portfolioEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/question.js b/new-era-commands/slash/question.js
index 56d5e39..4c1e399 100644
--- a/new-era-commands/slash/question.js
+++ b/new-era-commands/slash/question.js
@@ -3,24 +3,30 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('question')
-    .setDescription('Asking Great Questions'),
+    .setDescription('Asking Great Questions')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const questionEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Asking Great Questions')
       .setDescription(`
-Asking context-rich questions makes it easy to receive help, and makes it easy for others to help you quickly! Great engineers ask great questions, and the prompt below is an invitation to improve your skills and set yourself up for success in the workplace. 
+Asking context-rich questions makes it easy to receive help, and makes it easy for others to help you quickly! Great engineers ask great questions, and the prompt below is an invitation to improve your skills and set yourself up for success in the workplace.
 
 **Project/Exercise:**
 **Lesson link:**
 **Code:** [code sandbox like replit or codepen]
 **Issue/Problem:** [screenshots if applicable]
-**What I expected:** 
-**What I've tried:** 
+**What I expected:**
+**What I've tried:**
 
 For even more context around on how to hone your question-asking skills, give this a read: https://www.theodinproject.com/guides/community/how_to_ask
               `);
 
-    await interaction.reply({ embeds: [questionEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [questionEmbed],
+     });
   },
 };
diff --git a/new-era-commands/slash/top.js b/new-era-commands/slash/top.js
index 85f31a2..6441114 100644
--- a/new-era-commands/slash/top.js
+++ b/new-era-commands/slash/top.js
@@ -3,8 +3,11 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('top')
-    .setDescription('Information about The Odin Project'),
+    .setDescription('Information about The Odin Project')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const topEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('The Odin Project')
@@ -12,6 +15,10 @@ module.exports = {
 For more information about The Odin Project, visit our site:
 [Your Career in Web Development Starts Here](https://www.theodinproject.com/)
     `);
-    await interaction.reply({ embeds: [topEmbed] });
+
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [topEmbed],
+    });
   },
 };
diff --git a/new-era-commands/slash/windows.js b/new-era-commands/slash/windows.js
index bbbc419..7dc17c3 100644
--- a/new-era-commands/slash/windows.js
+++ b/new-era-commands/slash/windows.js
@@ -3,14 +3,20 @@ const { SlashCommandBuilder, EmbedBuilder } = require('discord.js');
 module.exports = {
   data: new SlashCommandBuilder()
     .setName('windows')
-    .setDescription('Windows'),
+    .setDescription('Windows')
+    .addUserOption((option) => option.setName('user').setDescription('user to ping')),
   execute: async (interaction) => {
+    const userId = interaction.options.getUser('user')?.id;
+
     const windowsEmbed = new EmbedBuilder()
       .setColor('#cc9543')
       .setTitle('Windows')
       .setDescription('**The Odin Project does not support Windows, WSL, or any OS outside of our recommendations**. We are happy to assist with any questions about installing a VM or dual booting Linux. <https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/installation-overview#os-options>')
       .setURL('https://www.theodinproject.com/paths/foundations/courses/foundations/lessons/installation-overview#os-options');
 
-    await interaction.reply({ embeds: [windowsEmbed] });
+    await interaction.reply({
+      content: userId ? `<@${userId}>` : '',
+      embeds: [windowsEmbed],
+    });
   },
 };
diff --git a/package-lock.json b/package-lock.json
index d7a605a..8b51a33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
       "dependencies": {
         "@discordjs/rest": "^1.7.1",
         "axios": "^1.4.0",
-        "discord-api-types": "^0.37.50",
+        "discord-api-types": "^0.37.56",
         "discord.js": "^14.11.0",
         "dotenv": "^16.3.1",
         "glob": "^10.3.3",
@@ -24,7 +24,7 @@
         "eslint": "^8.46.0",
         "eslint-config-airbnb-base": "^15.0.0",
         "eslint-config-prettier": "^9.0.0",
-        "eslint-plugin-import": "^2.27.5",
+        "eslint-plugin-import": "^2.28.1",
         "husky": "^8.0.3",
         "jest": "^29.6.1",
         "lint-staged": "^13.2.3",
@@ -2816,7 +2816,7 @@
     "node_modules/@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
       "dev": true
     },
     "node_modules/@types/node": {
@@ -3027,6 +3027,25 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/array.prototype.findlastindex": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
+      "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0",
+        "get-intrinsic": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/array.prototype.flat": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
@@ -3063,6 +3082,26 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/arraybuffer.prototype.slice": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
+      "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+      "dev": true,
+      "dependencies": {
+        "array-buffer-byte-length": "^1.0.0",
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "get-intrinsic": "^1.2.1",
+        "is-array-buffer": "^3.0.2",
+        "is-shared-array-buffer": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -3763,9 +3802,9 @@
       }
     },
     "node_modules/discord-api-types": {
-      "version": "0.37.50",
-      "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz",
-      "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg=="
+      "version": "0.37.56",
+      "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.56.tgz",
+      "integrity": "sha512-Ih3wj0ZTaQxaJRqUEXHMIXfXB86bwMGC0wc2nNsyCJqeo3lC4qnxXtFIsC+IGI46+dSIinuayCAZ6sLEEM02Bw=="
     },
     "node_modules/discord.js": {
       "version": "14.11.0",
@@ -3852,18 +3891,19 @@
       }
     },
     "node_modules/es-abstract": {
-      "version": "1.21.2",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz",
-      "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==",
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
+      "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
       "dev": true,
       "dependencies": {
         "array-buffer-byte-length": "^1.0.0",
+        "arraybuffer.prototype.slice": "^1.0.1",
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
         "es-set-tostringtag": "^2.0.1",
         "es-to-primitive": "^1.2.1",
         "function.prototype.name": "^1.1.5",
-        "get-intrinsic": "^1.2.0",
+        "get-intrinsic": "^1.2.1",
         "get-symbol-description": "^1.0.0",
         "globalthis": "^1.0.3",
         "gopd": "^1.0.1",
@@ -3883,14 +3923,18 @@
         "object-inspect": "^1.12.3",
         "object-keys": "^1.1.1",
         "object.assign": "^4.1.4",
-        "regexp.prototype.flags": "^1.4.3",
+        "regexp.prototype.flags": "^1.5.0",
+        "safe-array-concat": "^1.0.0",
         "safe-regex-test": "^1.0.0",
         "string.prototype.trim": "^1.2.7",
         "string.prototype.trimend": "^1.0.6",
         "string.prototype.trimstart": "^1.0.6",
+        "typed-array-buffer": "^1.0.0",
+        "typed-array-byte-length": "^1.0.0",
+        "typed-array-byte-offset": "^1.0.0",
         "typed-array-length": "^1.0.4",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.9"
+        "which-typed-array": "^1.1.10"
       },
       "engines": {
         "node": ">= 0.4"
@@ -4072,9 +4116,9 @@
       }
     },
     "node_modules/eslint-module-utils": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
-      "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
       "dev": true,
       "dependencies": {
         "debug": "^3.2.7"
@@ -4098,26 +4142,28 @@
       }
     },
     "node_modules/eslint-plugin-import": {
-      "version": "2.27.5",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
-      "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+      "version": "2.28.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
+      "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
       "dev": true,
       "dependencies": {
         "array-includes": "^3.1.6",
+        "array.prototype.findlastindex": "^1.2.2",
         "array.prototype.flat": "^1.3.1",
         "array.prototype.flatmap": "^1.3.1",
         "debug": "^3.2.7",
         "doctrine": "^2.1.0",
         "eslint-import-resolver-node": "^0.3.7",
-        "eslint-module-utils": "^2.7.4",
+        "eslint-module-utils": "^2.8.0",
         "has": "^1.0.3",
-        "is-core-module": "^2.11.0",
+        "is-core-module": "^2.13.0",
         "is-glob": "^4.0.3",
         "minimatch": "^3.1.2",
+        "object.fromentries": "^2.0.6",
+        "object.groupby": "^1.0.0",
         "object.values": "^1.1.6",
-        "resolve": "^1.22.1",
-        "semver": "^6.3.0",
-        "tsconfig-paths": "^3.14.1"
+        "semver": "^6.3.1",
+        "tsconfig-paths": "^3.14.2"
       },
       "engines": {
         "node": ">=4"
@@ -4148,9 +4194,9 @@
       }
     },
     "node_modules/eslint-plugin-import/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
       "bin": {
         "semver": "bin/semver.js"
@@ -4765,13 +4811,14 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
-      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
       "dev": true,
       "dependencies": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
+        "has-proto": "^1.0.1",
         "has-symbols": "^1.0.3"
       },
       "funding": {
@@ -5246,9 +5293,9 @@
       }
     },
     "node_modules/is-core-module": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
-      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
       "dev": true,
       "dependencies": {
         "has": "^1.0.3"
@@ -5450,6 +5497,12 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true
+    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -6579,10 +6632,13 @@
       }
     },
     "node_modules/minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
-      "dev": true
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/minipass": {
       "version": "7.0.2",
@@ -6759,6 +6815,35 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/object.fromentries": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.groupby": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
+      "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "get-intrinsic": "^1.2.1"
+      }
+    },
     "node_modules/object.values": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
@@ -7248,14 +7333,14 @@
       }
     },
     "node_modules/regexp.prototype.flags": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
-      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+      "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
       "dev": true,
       "dependencies": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "functions-have-names": "^1.2.2"
+        "define-properties": "^1.2.0",
+        "functions-have-names": "^1.2.3"
       },
       "engines": {
         "node": ">= 0.4"
@@ -7463,6 +7548,24 @@
         "tslib": "^2.1.0"
       }
     },
+    "node_modules/safe-array-concat": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz",
+      "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.0",
+        "has-symbols": "^1.0.3",
+        "isarray": "^2.0.5"
+      },
+      "engines": {
+        "node": ">=0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -7975,13 +8078,13 @@
       "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ=="
     },
     "node_modules/tsconfig-paths": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
-      "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+      "version": "3.14.2",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+      "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
       "dev": true,
       "dependencies": {
         "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
+        "json5": "^1.0.2",
         "minimist": "^1.2.6",
         "strip-bom": "^3.0.0"
       }
@@ -8001,7 +8104,7 @@
     "node_modules/tsconfig-paths/node_modules/strip-bom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
       "dev": true,
       "engines": {
         "node": ">=4"
@@ -8045,6 +8148,57 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/typed-array-buffer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+      "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.1",
+        "is-typed-array": "^1.1.10"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/typed-array-byte-length": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+      "dev": true,
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "has-proto": "^1.0.1",
+        "is-typed-array": "^1.1.10"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/typed-array-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+      "dev": true,
+      "dependencies": {
+        "available-typed-arrays": "^1.0.5",
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "has-proto": "^1.0.1",
+        "is-typed-array": "^1.1.10"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/typed-array-length": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
@@ -8225,17 +8379,16 @@
       }
     },
     "node_modules/which-typed-array": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
-      "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
+      "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
       "dev": true,
       "dependencies": {
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0",
-        "is-typed-array": "^1.1.10"
+        "has-tostringtag": "^1.0.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -10422,7 +10575,7 @@
     "@types/json5": {
       "version": "0.0.29",
       "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
-      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
+      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
       "dev": true
     },
     "@types/node": {
@@ -10583,6 +10736,19 @@
         "is-string": "^1.0.7"
       }
     },
+    "array.prototype.findlastindex": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
+      "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "es-shim-unscopables": "^1.0.0",
+        "get-intrinsic": "^1.2.1"
+      }
+    },
     "array.prototype.flat": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
@@ -10607,6 +10773,20 @@
         "es-shim-unscopables": "^1.0.0"
       }
     },
+    "arraybuffer.prototype.slice": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz",
+      "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==",
+      "dev": true,
+      "requires": {
+        "array-buffer-byte-length": "^1.0.0",
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "get-intrinsic": "^1.2.1",
+        "is-array-buffer": "^3.0.2",
+        "is-shared-array-buffer": "^1.0.2"
+      }
+    },
     "astral-regex": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -11110,9 +11290,9 @@
       "dev": true
     },
     "discord-api-types": {
-      "version": "0.37.50",
-      "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.50.tgz",
-      "integrity": "sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg=="
+      "version": "0.37.56",
+      "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.56.tgz",
+      "integrity": "sha512-Ih3wj0ZTaQxaJRqUEXHMIXfXB86bwMGC0wc2nNsyCJqeo3lC4qnxXtFIsC+IGI46+dSIinuayCAZ6sLEEM02Bw=="
     },
     "discord.js": {
       "version": "14.11.0",
@@ -11181,18 +11361,19 @@
       }
     },
     "es-abstract": {
-      "version": "1.21.2",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz",
-      "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==",
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz",
+      "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==",
       "dev": true,
       "requires": {
         "array-buffer-byte-length": "^1.0.0",
+        "arraybuffer.prototype.slice": "^1.0.1",
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
         "es-set-tostringtag": "^2.0.1",
         "es-to-primitive": "^1.2.1",
         "function.prototype.name": "^1.1.5",
-        "get-intrinsic": "^1.2.0",
+        "get-intrinsic": "^1.2.1",
         "get-symbol-description": "^1.0.0",
         "globalthis": "^1.0.3",
         "gopd": "^1.0.1",
@@ -11212,14 +11393,18 @@
         "object-inspect": "^1.12.3",
         "object-keys": "^1.1.1",
         "object.assign": "^4.1.4",
-        "regexp.prototype.flags": "^1.4.3",
+        "regexp.prototype.flags": "^1.5.0",
+        "safe-array-concat": "^1.0.0",
         "safe-regex-test": "^1.0.0",
         "string.prototype.trim": "^1.2.7",
         "string.prototype.trimend": "^1.0.6",
         "string.prototype.trimstart": "^1.0.6",
+        "typed-array-buffer": "^1.0.0",
+        "typed-array-byte-length": "^1.0.0",
+        "typed-array-byte-offset": "^1.0.0",
         "typed-array-length": "^1.0.4",
         "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.9"
+        "which-typed-array": "^1.1.10"
       }
     },
     "es-set-tostringtag": {
@@ -11442,9 +11627,9 @@
       }
     },
     "eslint-module-utils": {
-      "version": "2.7.4",
-      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
-      "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
+      "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
       "dev": true,
       "requires": {
         "debug": "^3.2.7"
@@ -11462,26 +11647,28 @@
       }
     },
     "eslint-plugin-import": {
-      "version": "2.27.5",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
-      "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+      "version": "2.28.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
+      "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
       "dev": true,
       "requires": {
         "array-includes": "^3.1.6",
+        "array.prototype.findlastindex": "^1.2.2",
         "array.prototype.flat": "^1.3.1",
         "array.prototype.flatmap": "^1.3.1",
         "debug": "^3.2.7",
         "doctrine": "^2.1.0",
         "eslint-import-resolver-node": "^0.3.7",
-        "eslint-module-utils": "^2.7.4",
+        "eslint-module-utils": "^2.8.0",
         "has": "^1.0.3",
-        "is-core-module": "^2.11.0",
+        "is-core-module": "^2.13.0",
         "is-glob": "^4.0.3",
         "minimatch": "^3.1.2",
+        "object.fromentries": "^2.0.6",
+        "object.groupby": "^1.0.0",
         "object.values": "^1.1.6",
-        "resolve": "^1.22.1",
-        "semver": "^6.3.0",
-        "tsconfig-paths": "^3.14.1"
+        "semver": "^6.3.1",
+        "tsconfig-paths": "^3.14.2"
       },
       "dependencies": {
         "debug": {
@@ -11503,9 +11690,9 @@
           }
         },
         "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+          "version": "6.3.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+          "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
           "dev": true
         }
       }
@@ -11847,13 +12034,14 @@
       "dev": true
     },
     "get-intrinsic": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
-      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
       "dev": true,
       "requires": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
+        "has-proto": "^1.0.1",
         "has-symbols": "^1.0.3"
       }
     },
@@ -12168,9 +12356,9 @@
       "dev": true
     },
     "is-core-module": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
-      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
       "dev": true,
       "requires": {
         "has": "^1.0.3"
@@ -12297,6 +12485,12 @@
         "call-bind": "^1.0.2"
       }
     },
+    "isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "dev": true
+    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -13159,9 +13353,9 @@
       }
     },
     "minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
       "dev": true
     },
     "minipass": {
@@ -13295,6 +13489,29 @@
         "es-abstract": "^1.20.4"
       }
     },
+    "object.fromentries": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+      "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1"
+      }
+    },
+    "object.groupby": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
+      "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.2.0",
+        "es-abstract": "^1.22.1",
+        "get-intrinsic": "^1.2.1"
+      }
+    },
     "object.values": {
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
@@ -13626,14 +13843,14 @@
       }
     },
     "regexp.prototype.flags": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
-      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
+      "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
       "dev": true,
       "requires": {
         "call-bind": "^1.0.2",
-        "define-properties": "^1.1.3",
-        "functions-have-names": "^1.2.2"
+        "define-properties": "^1.2.0",
+        "functions-have-names": "^1.2.3"
       }
     },
     "regexpu-core": {
@@ -13778,6 +13995,18 @@
         "tslib": "^2.1.0"
       }
     },
+    "safe-array-concat": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz",
+      "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.0",
+        "has-symbols": "^1.0.3",
+        "isarray": "^2.0.5"
+      }
+    },
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -14146,13 +14375,13 @@
       "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ=="
     },
     "tsconfig-paths": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
-      "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+      "version": "3.14.2",
+      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+      "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
       "dev": true,
       "requires": {
         "@types/json5": "^0.0.29",
-        "json5": "^1.0.1",
+        "json5": "^1.0.2",
         "minimist": "^1.2.6",
         "strip-bom": "^3.0.0"
       },
@@ -14169,7 +14398,7 @@
         "strip-bom": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
-          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+          "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
           "dev": true
         }
       }
@@ -14200,6 +14429,42 @@
       "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
       "dev": true
     },
+    "typed-array-buffer": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+      "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "get-intrinsic": "^1.2.1",
+        "is-typed-array": "^1.1.10"
+      }
+    },
+    "typed-array-byte-length": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+      "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "has-proto": "^1.0.1",
+        "is-typed-array": "^1.1.10"
+      }
+    },
+    "typed-array-byte-offset": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+      "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+      "dev": true,
+      "requires": {
+        "available-typed-arrays": "^1.0.5",
+        "call-bind": "^1.0.2",
+        "for-each": "^0.3.3",
+        "has-proto": "^1.0.1",
+        "is-typed-array": "^1.1.10"
+      }
+    },
     "typed-array-length": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
@@ -14331,17 +14596,16 @@
       }
     },
     "which-typed-array": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
-      "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
+      "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
       "dev": true,
       "requires": {
         "available-typed-arrays": "^1.0.5",
         "call-bind": "^1.0.2",
         "for-each": "^0.3.3",
         "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.0",
-        "is-typed-array": "^1.1.10"
+        "has-tostringtag": "^1.0.0"
       }
     },
     "wrap-ansi": {
diff --git a/package.json b/package.json
index 59916d1..061747c 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
   "dependencies": {
     "@discordjs/rest": "^1.7.1",
     "axios": "^1.4.0",
-    "discord-api-types": "^0.37.50",
+    "discord-api-types": "^0.37.56",
     "discord.js": "^14.11.0",
     "dotenv": "^16.3.1",
     "glob": "^10.3.3",
@@ -27,7 +27,7 @@
     "eslint": "^8.46.0",
     "eslint-config-airbnb-base": "^15.0.0",
     "eslint-config-prettier": "^9.0.0",
-    "eslint-plugin-import": "^2.27.5",
+    "eslint-plugin-import": "^2.28.1",
     "husky": "^8.0.3",
     "jest": "^29.6.1",
     "lint-staged": "^13.2.3",


Test patch:
diff --git a/botCommands/__snapshots__/code.test.js.snap b/botCommands/__snapshots__/code.test.js.snap
new file mode 100644
index 0000000..e65a6b5
--- /dev/null
+++ b/botCommands/__snapshots__/code.test.js.snap
@@ -0,0 +1,133 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`!code snapshot returns correct output 1`] = `
+{
+  "content": "",
+  "embeds": [
+    {
+      "color": 13407555,
+      "description": "
+**Codeblocks:**        
+
+To write multiple lines of code with language syntax highlighting, use three [backticks](https://i.stack.imgur.com/ETTnT.jpg) followed by the language:
+
+\\\`\\\`\\\`js
+// your JavaScript code goes here
+\\\`\\\`\\\`
+
+**Inline code:**
+
+For \`inline code\` use one backtick (no syntax highlighting):
+
+\\\`code here!\\\`
+
+**Websites:**
+
+- [Code Sandbox](https://codesandbox.io/) for Webpack/React projects
+- [Repl.it](https://replit.com/) for JavaScript/Ruby projects
+- [Codepen](https://codepen.io/) for basic HTML/CSS/Javascript
+      ",
+      "title": "How to share your code",
+    },
+  ],
+}
+`;
+
+exports[`!code snapshot returns correct output 2`] = `
+{
+  "content": "<@1>",
+  "embeds": [
+    {
+      "color": 13407555,
+      "description": "
+**Codeblocks:**        
+
+To write multiple lines of code with language syntax highlighting, use three [backticks](https://i.stack.imgur.com/ETTnT.jpg) followed by the language:
+
+\\\`\\\`\\\`js
+// your JavaScript code goes here
+\\\`\\\`\\\`
+
+**Inline code:**
+
+For \`inline code\` use one backtick (no syntax highlighting):
+
+\\\`code here!\\\`
+
+**Websites:**
+
+- [Code Sandbox](https://codesandbox.io/) for Webpack/React projects
+- [Repl.it](https://replit.com/) for JavaScript/Ruby projects
+- [Codepen](https://codepen.io/) for basic HTML/CSS/Javascript
+      ",
+      "title": "How to share your code",
+    },
+  ],
+}
+`;
+
+exports[`!code snapshot returns correct output 3`] = `
+{
+  "content": "<@1> <@2>",
+  "embeds": [
+    {
+      "color": 13407555,
+      "description": "
+**Codeblocks:**        
+
+To write multiple lines of code with language syntax highlighting, use three [backticks](https://i.stack.imgur.com/ETTnT.jpg) followed by the language:
+
+\\\`\\\`\\\`js
+// your JavaScript code goes here
+\\\`\\\`\\\`
+
+**Inline code:**
+
+For \`inline code\` use one backtick (no syntax highlighting):
+
+\\\`code here!\\\`
+
+**Websites:**
+
+- [Code Sandbox](https://codesandbox.io/) for Webpack/React projects
+- [Repl.it](https://replit.com/) for JavaScript/Ruby projects
+- [Codepen](https://codepen.io/) for basic HTML/CSS/Javascript
+      ",
+      "title": "How to share your code",
+    },
+  ],
+}
+`;
+
+exports[`!code snapshot returns correct output 4`] = `
+{
+  "content": "<@1> <@2> <@3>",
+  "embeds": [
+    {
+      "color": 13407555,
+      "description": "
+**Codeblocks:**        
+
+To write multiple lines of code with language syntax highlighting, use three [backticks](https://i.stack.imgur.com/ETTnT.jpg) followed by the language:
+
+\\\`\\\`\\\`js
+// your JavaScript code goes here
+\\\`\\\`\\\`
+
+**Inline code:**
+
+For \`inline code\` use one backtick (no syntax highlighting):
+
+\\\`code here!\\\`
+
+**Websites:**
+
+- [Code Sandbox](https://codesandbox.io/) for Webpack/React projects
+- [Repl.it](https://replit.com/) for JavaScript/Ruby projects
+- [Codepen](https://codepen.io/) for basic HTML/CSS/Javascript
+      ",
+      "title": "How to share your code",
+    },
+  ],
+}
+`;
diff --git a/botCommands/__snapshots__/help.test.js.snap b/botCommands/__snapshots__/help.test.js.snap
index 5d1e096..b546f6b 100644
--- a/botCommands/__snapshots__/help.test.js.snap
+++ b/botCommands/__snapshots__/help.test.js.snap
@@ -1,173 +1,5 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`!code snapshot returns correct output 1`] = `
-{
-  "embeds": [
-    {
-      "color": 13407555,
-      "description": "Hey, here's some helpful tips on sharing your code with others!",
-      "fields": [
-        {
-          "name": "Sharing Code on Discord",
-          "value": "To write multiple lines of code with language syntax highlighting, use three backticks (<https://i.stack.imgur.com/ETTnT.jpg>), followed by the language.
-
-\\\`\\\`\\\`js
-[Put your JavaScript Code here!]
-\\\`\\\`\\\`
-
-For \`inline code\` use one backtick (no syntax highlighting):
-
-\\\`Code here!\\\`
-      ",
-        },
-        {
-          "inline": true,
-          "name": "Link a Code Sandbox to share Webpack/React examples",
-          "value": "https://codesandbox.io/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Repl.it to share Javascript/Ruby examples",
-          "value": "https://replit.com/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Codepen to share basic HTML/CSS/Javascript examples",
-          "value": "https://codepen.io/",
-        },
-      ],
-      "title": "HOW TO EMBED CODE SNIPPETS",
-    },
-  ],
-}
-`;
-
-exports[`!code snapshot returns correct output 2`] = `
-{
-  "embeds": [
-    {
-      "color": 13407555,
-      "description": "Hey, <@1>, here's some helpful tips on sharing your code with others!",
-      "fields": [
-        {
-          "name": "Sharing Code on Discord",
-          "value": "To write multiple lines of code with language syntax highlighting, use three backticks (<https://i.stack.imgur.com/ETTnT.jpg>), followed by the language.
-
-\\\`\\\`\\\`js
-[Put your JavaScript Code here!]
-\\\`\\\`\\\`
-
-For \`inline code\` use one backtick (no syntax highlighting):
-
-\\\`Code here!\\\`
-      ",
-        },
-        {
-          "inline": true,
-          "name": "Link a Code Sandbox to share Webpack/React examples",
-          "value": "https://codesandbox.io/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Repl.it to share Javascript/Ruby examples",
-          "value": "https://replit.com/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Codepen to share basic HTML/CSS/Javascript examples",
-          "value": "https://codepen.io/",
-        },
-      ],
-      "title": "HOW TO EMBED CODE SNIPPETS",
-    },
-  ],
-}
-`;
-
-exports[`!code snapshot returns correct output 3`] = `
-{
-  "embeds": [
-    {
-      "color": 13407555,
-      "description": "Hey, <@1> <@2>, here's some helpful tips on sharing your code with others!",
-      "fields": [
-        {
-          "name": "Sharing Code on Discord",
-          "value": "To write multiple lines of code with language syntax highlighting, use three backticks (<https://i.stack.imgur.com/ETTnT.jpg>), followed by the language.
-
-\\\`\\\`\\\`js
-[Put your JavaScript Code here!]
-\\\`\\\`\\\`
-
-For \`inline code\` use one backtick (no syntax highlighting):
-
-\\\`Code here!\\\`
-      ",
-        },
-        {
-          "inline": true,
-          "name": "Link a Code Sandbox to share Webpack/React examples",
-          "value": "https://codesandbox.io/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Repl.it to share Javascript/Ruby examples",
-          "value": "https://replit.com/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Codepen to share basic HTML/CSS/Javascript examples",
-          "value": "https://codepen.io/",
-        },
-      ],
-      "title": "HOW TO EMBED CODE SNIPPETS",
-    },
-  ],
-}
-`;
-
-exports[`!code snapshot returns correct output 4`] = `
-{
-  "embeds": [
-    {
-      "color": 13407555,
-      "description": "Hey, <@1> <@2> <@3>, here's some helpful tips on sharing your code with others!",
-      "fields": [
-        {
-          "name": "Sharing Code on Discord",
-          "value": "To write multiple lines of code with language syntax highlighting, use three backticks (<https://i.stack.imgur.com/ETTnT.jpg>), followed by the language.
-
-\\\`\\\`\\\`js
-[Put your JavaScript Code here!]
-\\\`\\\`\\\`
-
-For \`inline code\` use one backtick (no syntax highlighting):
-
-\\\`Code here!\\\`
-      ",
-        },
-        {
-          "inline": true,
-          "name": "Link a Code Sandbox to share Webpack/React examples",
-          "value": "https://codesandbox.io/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Repl.it to share Javascript/Ruby examples",
-          "value": "https://replit.com/",
-        },
-        {
-          "inline": true,
-          "name": "Link a Codepen to share basic HTML/CSS/Javascript examples",
-          "value": "https://codepen.io/",
-        },
-      ],
-      "title": "HOW TO EMBED CODE SNIPPETS",
-    },
-  ],
-}
-`;
-
 exports[`!help snapshot should return the correct output 1`] = `
 {
   "embeds": [
diff --git a/botCommands/code.test.js b/botCommands/code.test.js
new file mode 100644
index 0000000..e7e670b
--- /dev/null
+++ b/botCommands/code.test.js
@@ -0,0 +1,62 @@
+const commands = require('./code');
+const { generateMentions } = require('./mockData');
+
+describe('!code', () => {
+  it.each([
+    ['!code'],
+    [' !code'],
+    ['!code @odin-bot'],
+    [' !code @odin-bot'],
+    ['!code fmdkslafmksa'],
+  ])("'%s' triggers the callback", (string) => {
+    expect(commands.code.regex.test(string)).toBeTruthy();
+  });
+
+  it.each([
+    ['!cfdsdnjae'],
+    ['!cood'],
+    ['code'],
+    ['!cdoe'],
+    ['!co de'],
+    ['! code'],
+    ['@odin-bot ! code'],
+    ['!co&d^e'],
+    ['!c*od&e^'],
+    ['!^code'],
+  ])("'%s' does not trigger the callback", (string) => {
+    expect(commands.code.regex.test(string)).toBeFalsy();
+  });
+
+  it.each([
+    ['how to share !code'],
+    ['need some !code ?'],
+    ['hey @odin-bot, teach me to !code'],
+    ['!@odin-bot ^ !me !code !test$*'],
+  ])("'%s' - the command can be anywhere in the string", (string) => {
+    expect(commands.code.regex.test(string)).toBeTruthy();
+  });
+
+  it.each([
+    ['!codesgrealkdmsfalnd'],
+    ['someone!code'],
+    ['@odin-bot!code'],
+    ['!code!xx'],
+    ['!code*'],
+    ['!code...'],
+    ['^_!code...'],
+  ])(
+    "'%s' - command should be its own word!group - no leading or trailing characters",
+    (string) => {
+      expect(commands.code.regex.test(string)).toBeFalsy();
+    },
+  );
+});
+
+describe('!code snapshot', () => {
+  it('returns correct output', () => {
+    expect(commands.code.cb(generateMentions(0))).toMatchSnapshot();
+    expect(commands.code.cb(generateMentions(1))).toMatchSnapshot();
+    expect(commands.code.cb(generateMentions(2))).toMatchSnapshot();
+    expect(commands.code.cb(generateMentions(3))).toMatchSnapshot();
+  });
+});
diff --git a/botCommands/help.test.js b/botCommands/help.test.js
index 361ad42..e73490f 100644
--- a/botCommands/help.test.js
+++ b/botCommands/help.test.js
@@ -1,5 +1,4 @@
 const commands = require('./help');
-const { generateMentions } = require('./mockData');
 
 describe('!help', () => {
   it.each([
@@ -57,63 +56,3 @@ describe('!help snapshot', () => {
     expect(commands.help.cb({})).toMatchSnapshot();
   });
 });
-
-describe('!code', () => {
-  it.each([
-    ['!code'],
-    [' !code'],
-    ['!code @odin-bot'],
-    [' !code @odin-bot'],
-    ['!code fmdkslafmksa'],
-  ])("'%s' triggers the callback", (string) => {
-    expect(commands.code.regex.test(string)).toBeTruthy();
-  });
-
-  it.each([
-    ['!cfdsdnjae'],
-    ['!cood'],
-    ['code'],
-    ['!cdoe'],
-    ['!co de'],
-    ['! code'],
-    ['@odin-bot ! code'],
-    ['!co&d^e'],
-    ['!c*od&e^'],
-    ['!^code'],
-  ])("'%s' does not trigger the callback", (string) => {
-    expect(commands.code.regex.test(string)).toBeFalsy();
-  });
-
-  it.each([
-    ['how to share !code'],
-    ['need some !code ?'],
-    ['hey @odin-bot, teach me to !code'],
-    ['!@odin-bot ^ !me !code !test$*'],
-  ])("'%s' - the command can be anywhere in the string", (string) => {
-    expect(commands.code.regex.test(string)).toBeTruthy();
-  });
-
-  it.each([
-    ['!codesgrealkdmsfalnd'],
-    ['someone!code'],
-    ['@odin-bot!code'],
-    ['!code!xx'],
-    ['!code*'],
-    ['!code...'],
-    ['^_!code...'],
-  ])(
-    "'%s' - command should be its own word!group - no leading or trailing characters",
-    (string) => {
-      expect(commands.code.regex.test(string)).toBeFalsy();
-    },
-  );
-});
-
-describe('!code snapshot', () => {
-  it('returns correct output', () => {
-    expect(commands.code.cb(generateMentions(0))).toMatchSnapshot();
-    expect(commands.code.cb(generateMentions(1))).toMatchSnapshot();
-    expect(commands.code.cb(generateMentions(2))).toMatchSnapshot();
-    expect(commands.code.cb(generateMentions(3))).toMatchSnapshot();
-  });
-});