From d225d7037cd53e825297b55223a0e2bc553315ac Mon Sep 17 00:00:00 2001 From: Supositware Date: Sun, 18 Dec 2022 23:30:25 +0100 Subject: [PATCH] Move ratelimiter to its own function --- events/client/interactionCreate.js | 38 +++++++---------------------- events/client/messageCreate.js | 36 ++++++--------------------- utils/ratelimiter.js | 39 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 57 deletions(-) create mode 100644 utils/ratelimiter.js diff --git a/events/client/interactionCreate.js b/events/client/interactionCreate.js index 117be13..18eb863 100644 --- a/events/client/interactionCreate.js +++ b/events/client/interactionCreate.js @@ -1,12 +1,12 @@ import { PermissionFlagsBits, InteractionType } from 'discord.js'; import db from '../../models/index.js'; +import ratelimiter from '../../utils/ratelimiter.js'; const { ownerId } = process.env; export default { name: 'interactionCreate', async execute(interaction) { - const ratelimit = global.ratelimit; const client = interaction.client; if (interaction.type !== InteractionType.ApplicationCommand) return; @@ -27,7 +27,7 @@ export default { if (!command) return; - console.log(`\x1b[33m${userTag} (${userID})\x1b[0m launched command \x1b[33m${commandName}\x1b[0m`); + console.log(`\x1b[33m${userTag} (${userID})\x1b[0m launched command \x1b[33m${commandName}\x1b[0m with slash`); // Owner only check if (command.ownerOnly && interaction.user.id !== ownerId) { @@ -51,35 +51,15 @@ export default { } */ - try { - if (!ratelimit[userID]) { - ratelimit[userID] = {}; - } - - const date = new Date(); - if (ratelimit[userID][commandName]) { - if (ratelimit[userID][commandName].cooldown) { - if (date > ratelimit[userID][commandName].cooldown) { - ratelimit[userID][commandName].limit = 0; - ratelimit[userID][commandName].cooldown = undefined; - } - } - - if (command.ratelimit === ratelimit[userID][commandName].limit) { - return await interaction.reply({ content: `You are being rate limited. You can try again in ${Math.floor((ratelimit[userID][commandName].cooldown - date) / 1000)} seconds.`, ephemeral: true }); - } - } + // Check the ratelimit + const doRateLimit = ratelimiter.check(interaction.user, commandName, command); + if (doRateLimit) { + console.log(`\x1b[33m${userTag} (${userID})\x1b[0m is rate limited on \x1b[33m${commandName}\x1b[0m for ${ratelimiter.timeLeft(userID, commandName)} seconds`); + return interaction.reply({ content: doRateLimit, ephemeral: true }); + } - if (command.ratelimit) { - ratelimit[userID][commandName] = { limit: ratelimit[userID][commandName] ? ratelimit[userID][commandName].limit + 1 : 1 }; - if (command.ratelimit === ratelimit[userID][commandName].limit) { - date.setSeconds(date.getSeconds() + command.cooldown); - - ratelimit[userID][commandName] = { limit: ratelimit[userID][commandName].limit, cooldown: date }; - } - } - + try { interaction.prefix = '/'; const args = {}; diff --git a/events/client/messageCreate.js b/events/client/messageCreate.js index f0236ad..40d3145 100644 --- a/events/client/messageCreate.js +++ b/events/client/messageCreate.js @@ -5,6 +5,7 @@ import { ApplicationCommandOptionType, EmbedBuilder, PermissionFlagsBits } from 'discord.js'; import db from '../../models/index.js'; import { rand } from '../../utils/rand.js'; +import ratelimiter from '../../utils/ratelimiter.js'; const { ownerId, prefix } = process.env; const prefixs = prefix.split(','); @@ -289,7 +290,7 @@ export default { const userTag = message.author.tag; const userID = message.author.id; - console.log(`\x1b[33m${userTag} (${userID})\x1b[0m launched command \x1b[33m${commandName}\x1b[0m`); + console.log(`\x1b[33m${userTag} (${userID})\x1b[0m launched command \x1b[33m${commandName}\x1b[0m with prefix`); // Owner only check if (command.ownerOnly && message.author.id !== ownerId) { @@ -311,35 +312,14 @@ export default { } } - try { - const ratelimit = global.ratelimit; - if (!ratelimit[userID]) { - ratelimit[userID] = {}; - } + // Check the ratelimit + const doRateLimit = ratelimiter.check(message.author, commandName, command); + if (doRateLimit) { + return message.reply({ content: doRateLimit, ephemeral: true }); - const date = new Date(); - if (ratelimit[userID][commandName]) { - if (ratelimit[userID][commandName].cooldown) { - if (date > ratelimit[userID][commandName].cooldown) { - ratelimit[userID][commandName].limit = 0; - ratelimit[userID][commandName].cooldown = undefined; - } - } - - if (command.ratelimit === ratelimit[userID][commandName].limit) { - return await message.reply({ content: `You are being rate limited. You can try again in ${Math.floor((ratelimit[userID][commandName].cooldown - date) / 1000)}huh seconds.`, ephemeral: true }); - } - } - - - if (command.ratelimit) { - ratelimit[userID][commandName] = { limit: ratelimit[userID][commandName] ? ratelimit[userID][commandName].limit + 1 : 1 }; - if (command.ratelimit === ratelimit[userID][commandName].limit) { - date.setSeconds(date.getSeconds() + command.cooldown); + } - ratelimit[userID][commandName] = { limit: ratelimit[userID][commandName].limit, cooldown: date }; - } - } + try { message.user = message.author; message.isMessage = true; message.prefix = `${messageArray[0]} `; diff --git a/utils/ratelimiter.js b/utils/ratelimiter.js new file mode 100644 index 0000000..30e7926 --- /dev/null +++ b/utils/ratelimiter.js @@ -0,0 +1,39 @@ +const ratelimit = {}; + +export default { + check, +}; +function check(user, commandName, commands) { + const userID = user.id; + const userTag = user.tag; + + if (!ratelimit[userID]) { + ratelimit[userID] = {}; + } + + const date = new Date(); + if (ratelimit[userID][commandName]) { + if (ratelimit[userID][commandName].cooldown) { + if (date > ratelimit[userID][commandName].cooldown) { + ratelimit[userID][commandName].limit = 0; + ratelimit[userID][commandName].cooldown = undefined; + } + } + + if (commands.ratelimit === ratelimit[userID][commandName].limit) { + console.log(`\x1b[33m${userTag} (${userID})\x1b[0m is rate limited on \x1b[33m${commandName}\x1b[0m for ${Math.floor((ratelimit[userID][commandName].cooldown - date) / 1000)} seconds`); + return `You are being rate limited. You can try again in ${Math.floor((ratelimit[userID][commandName].cooldown - date) / 1000)} seconds.`; + } + } + + + if (commands.ratelimit) { + ratelimit[userID][commandName] = { limit: ratelimit[userID][commandName] ? ratelimit[userID][commandName].limit + 1 : 1 }; + if (commands.ratelimit === ratelimit[userID][commandName].limit) { + date.setSeconds(date.getSeconds() + commands.cooldown); + + ratelimit[userID][commandName] = { limit: ratelimit[userID][commandName].limit, cooldown: date }; + } + } + return false; +} \ No newline at end of file