🚸 🎨 ♻️ Cooldown Middleware
This commit is contained in:
parent
c8fb975623
commit
0239b6c4dc
4 changed files with 50 additions and 36 deletions
19
package-lock.json
generated
19
package-lock.json
generated
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue