🚸 🎨 ♻️ Cooldown Middleware

This commit is contained in:
Axel Olausson Holtenäs 2022-10-24 00:17:04 +02:00
parent c8fb975623
commit 0239b6c4dc
No known key found for this signature in database
GPG key ID: BEDBB4D61E6C8462
4 changed files with 50 additions and 36 deletions

19
package-lock.json generated
View file

@ -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",

View file

@ -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",

View file

@ -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

View file

@ -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;
};