From 0239b6c4dc3707782d6068224de5c5b14a353f5d Mon Sep 17 00:00:00 2001 From: Vermium Sifell Date: Mon, 24 Oct 2022 00:17:04 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=B8=20=F0=9F=8E=A8=20=E2=99=BB?= =?UTF-8?q?=EF=B8=8F=20Cooldown=20Middleware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 19 +++++++++ package.json | 2 + src/index.ts | 1 - src/middlewares/cooldown/index.ts | 64 ++++++++++++++----------------- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae8bebb..4da390f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "chance": "^1.1.8", "common": "^0.2.5", "crypto": "^1.0.1", + "date-fns": "^2.29.3", "discord-api-types": "^0.37.0", "discord.js": "^14.0.0", "dotenv": "^16.0.1", @@ -25,6 +26,7 @@ "i18next-fs-backend": "^1.1.4", "i18next-http-backend": "^1.4.0", "i18next-resources-to-backend": "^1.0.0", + "moment": "^2.29.4", "mongoose": "^6.2.3", "node-schedule": "^2.1.0", "ts-node": "^10.7.0", @@ -2647,6 +2649,18 @@ "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in." }, + "node_modules/date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -9696,6 +9710,11 @@ "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" }, + "date-fns": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", diff --git a/package.json b/package.json index dee70e9..413cd18 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "chance": "^1.1.8", "common": "^0.2.5", "crypto": "^1.0.1", + "date-fns": "^2.29.3", "discord-api-types": "^0.37.0", "discord.js": "^14.0.0", "dotenv": "^16.0.1", @@ -49,6 +50,7 @@ "i18next-fs-backend": "^1.1.4", "i18next-http-backend": "^1.4.0", "i18next-resources-to-backend": "^1.0.0", + "moment": "^2.29.4", "mongoose": "^6.2.3", "node-schedule": "^2.1.0", "ts-node": "^10.7.0", diff --git a/src/index.ts b/src/index.ts index 2169eb4..b58112b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,6 @@ import "dotenv/config"; import { register as commandRegister } from "./handlers/command"; import { register as eventRegister } from "./handlers/event"; import { start as scheduleStart } from "./handlers/schedule"; - // Main process that starts all other sub processes const main = async () => { // Initiate client object diff --git a/src/middlewares/cooldown/index.ts b/src/middlewares/cooldown/index.ts index 232a083..a188521 100644 --- a/src/middlewares/cooldown/index.ts +++ b/src/middlewares/cooldown/index.ts @@ -1,6 +1,6 @@ +import { add, formatDuration, intervalToDuration, isPast } from "date-fns"; import { Guild, User } from "discord.js"; import prisma from "../../handlers/database"; -import addSeconds from "../../helpers/addSeconds"; import logger from "../logger"; export default async ( @@ -11,7 +11,7 @@ export default async ( silent?: boolean ) => { // Check if user has a timeout - const hasTimeout = await prisma.cooldown.findUnique({ + const isOnCooldown = await prisma.cooldown.findUnique({ where: { guildId_userId_timeoutId: { guildId: guild.id, @@ -20,48 +20,40 @@ export default async ( }, }, }); + logger.silly(isOnCooldown); - logger.silly(hasTimeout); + if (isOnCooldown) { + const { userId, timeoutId, createdAt } = isOnCooldown; + const dueDate = add(createdAt, { seconds: cooldown }); - // If user is not on timeout - if (hasTimeout) { - const { userId, timeoutId, createdAt } = hasTimeout; - const overDue = addSeconds(cooldown, createdAt) < new Date(); + const duration = formatDuration( + intervalToDuration({ + start: new Date(), + end: dueDate, + }) + ); - if (!overDue) { - const diff = Math.round( - (new Date(hasTimeout.createdAt).getTime() - new Date().getTime()) / 1000 - ); - - if (silent) - return logger.verbose( - `User ${userId} is on cooldown for ${timeoutId} for ${diff} seconds` - ); - - throw new Error( - `You must wait ${diff} seconds before using this command.` - ); + if (isPast(dueDate)) { + return await prisma.cooldown.delete({ + where: { + guildId_userId_timeoutId: { + guildId: guild.id, + userId: user.id, + timeoutId: id, + }, + }, + }); } - // Delete timeout - const deleteCooldown = await prisma.cooldown.delete({ - where: { - guildId_userId_timeoutId: { - guildId: guild.id, - userId: user.id, - timeoutId: id, - }, - }, - }); + if (!silent) { + throw new Error(`You are still on cooldown for ${duration}`); + } - logger.silly(deleteCooldown); - - logger.debug( - `Timeout document ${timeoutId} has been deleted from user ${userId}.` + return logger.verbose( + `User ${userId} is on cooldown for ${timeoutId}, it ends in ${duration}.` ); } - // Create timeout const createCooldown = await prisma.cooldown.upsert({ where: { guildId_userId_timeoutId: { @@ -98,4 +90,6 @@ export default async ( }); logger.silly(createCooldown); + + return createCooldown; };