parent
44eadfc618
commit
cea6be5740
6 changed files with 124 additions and 1 deletions
|
@ -1,5 +1,6 @@
|
||||||
# Custom Dictionary Words
|
# Custom Dictionary Words
|
||||||
Controlpanel
|
Controlpanel
|
||||||
|
cooldown
|
||||||
cpgg
|
cpgg
|
||||||
dagen
|
dagen
|
||||||
discordjs
|
discordjs
|
||||||
|
|
|
@ -5,7 +5,7 @@ import { CommandInteraction, MessageEmbed } from "discord.js";
|
||||||
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
|
import { SlashCommandSubcommandBuilder } from "@discordjs/builders";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
metadata: { guildOnly: false, ephemeral: false },
|
metadata: { guildOnly: false, ephemeral: false, cooldown: 5 },
|
||||||
|
|
||||||
builder: (command: SlashCommandSubcommandBuilder) => {
|
builder: (command: SlashCommandSubcommandBuilder) => {
|
||||||
return command.setName("meme").setDescription("Get a meme from r/memes)");
|
return command.setName("meme").setDescription("Get a meme from r/memes)");
|
||||||
|
|
|
@ -7,6 +7,8 @@ import deferReply from "../../../helpers/deferReply";
|
||||||
import getEmbedConfig from "../../../helpers/getEmbedConfig";
|
import getEmbedConfig from "../../../helpers/getEmbedConfig";
|
||||||
import getCommandMetadata from "../../../helpers/getCommandMetadata";
|
import getCommandMetadata from "../../../helpers/getCommandMetadata";
|
||||||
import capitalizeFirstLetter from "../../../helpers/capitalizeFirstLetter";
|
import capitalizeFirstLetter from "../../../helpers/capitalizeFirstLetter";
|
||||||
|
import timeoutSchema from "../../../models/timeout";
|
||||||
|
import addSeconds from "../../../helpers/addSeconds";
|
||||||
|
|
||||||
export default async (interaction: CommandInteraction) => {
|
export default async (interaction: CommandInteraction) => {
|
||||||
if (!interaction.isCommand()) return;
|
if (!interaction.isCommand()) return;
|
||||||
|
@ -45,6 +47,77 @@ export default async (interaction: CommandInteraction) => {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (metadata.cooldown) {
|
||||||
|
console.log("cooldown");
|
||||||
|
// console.log(interaction);
|
||||||
|
|
||||||
|
// Check if user has a timeout
|
||||||
|
const isTimeout = await timeoutSchema.findOne({
|
||||||
|
guildId: guild.id,
|
||||||
|
userId: user.id,
|
||||||
|
cooldown: metadata.cooldown,
|
||||||
|
timeoutId: interaction.commandId,
|
||||||
|
});
|
||||||
|
|
||||||
|
// If user is not on timeout
|
||||||
|
if (isTimeout) {
|
||||||
|
logger?.silly(`User is on timeout`);
|
||||||
|
|
||||||
|
const { guildId, userId, timeoutId, cooldown, createdAt } = isTimeout;
|
||||||
|
|
||||||
|
const overDue = (await addSeconds(cooldown, createdAt)) < new Date();
|
||||||
|
|
||||||
|
if (overDue) {
|
||||||
|
timeoutSchema
|
||||||
|
.deleteOne({
|
||||||
|
guildId,
|
||||||
|
userId,
|
||||||
|
timeoutId,
|
||||||
|
cooldown,
|
||||||
|
})
|
||||||
|
.then(async () => {
|
||||||
|
logger.debug(
|
||||||
|
`Timeout document ${timeoutId} has been deleted from user ${userId}.`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
const diff = Math.round(
|
||||||
|
((new Date(isTimeout.createdAt).getTime() - new Date().getTime()) *
|
||||||
|
-1) /
|
||||||
|
1000
|
||||||
|
);
|
||||||
|
|
||||||
|
return interaction?.editReply({
|
||||||
|
embeds: [
|
||||||
|
{
|
||||||
|
title: `[:x:] ${capitalizeFirstLetter(
|
||||||
|
interaction.options.getSubcommand()
|
||||||
|
)}`,
|
||||||
|
description: `
|
||||||
|
You are currently on timeout, please wait ${diff} seconds.
|
||||||
|
|
||||||
|
If it still doesn't work, please wait for a maximum of **1 hour** before contacting bot owner.
|
||||||
|
`,
|
||||||
|
timestamp: new Date(),
|
||||||
|
color: errorColor,
|
||||||
|
footer: {
|
||||||
|
iconURL: footerIcon,
|
||||||
|
text: footerText,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await timeoutSchema.create({
|
||||||
|
guildId: guild.id,
|
||||||
|
userId: user.id,
|
||||||
|
cooldown: metadata.cooldown,
|
||||||
|
timeoutId: interaction.commandId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (metadata.guildOnly) {
|
if (metadata.guildOnly) {
|
||||||
if (!guild) {
|
if (!guild) {
|
||||||
logger.debug(`Guild is null`);
|
logger.debug(`Guild is null`);
|
||||||
|
|
5
src/helpers/addSeconds/index.ts
Normal file
5
src/helpers/addSeconds/index.ts
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
export default async (numOfSeconds: number, date = new Date()) => {
|
||||||
|
date.setSeconds(date.getSeconds() + numOfSeconds);
|
||||||
|
|
||||||
|
return date;
|
||||||
|
};
|
35
src/jobs/timeouts.ts
Normal file
35
src/jobs/timeouts.ts
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import logger from "../logger";
|
||||||
|
|
||||||
|
import timeoutSchema from "../models/timeout";
|
||||||
|
|
||||||
|
import addSeconds from "../helpers/addSeconds";
|
||||||
|
|
||||||
|
export const options = {
|
||||||
|
schedule: "*/30 * * * *", // https://crontab.guru/
|
||||||
|
};
|
||||||
|
|
||||||
|
export const execute = async () => {
|
||||||
|
const timeouts = await timeoutSchema.find();
|
||||||
|
await Promise.all(
|
||||||
|
timeouts.map(async (timeout) => {
|
||||||
|
const { guildId, userId, timeoutId, cooldown, createdAt } = timeout;
|
||||||
|
|
||||||
|
const overDue = (await addSeconds(cooldown, createdAt)) < new Date();
|
||||||
|
|
||||||
|
if (overDue) {
|
||||||
|
timeoutSchema
|
||||||
|
.deleteOne({
|
||||||
|
guildId,
|
||||||
|
userId,
|
||||||
|
timeoutId,
|
||||||
|
cooldown,
|
||||||
|
})
|
||||||
|
.then(async () => {
|
||||||
|
logger.debug(
|
||||||
|
`Timeout document ${timeoutId} has been deleted from user ${userId}.`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
|
@ -4,7 +4,10 @@ import { Schema, model } from "mongoose";
|
||||||
export interface ITimeout {
|
export interface ITimeout {
|
||||||
userId: Snowflake;
|
userId: Snowflake;
|
||||||
guildId: Snowflake;
|
guildId: Snowflake;
|
||||||
|
cooldown: number;
|
||||||
timeoutId: string;
|
timeoutId: string;
|
||||||
|
createdAt: Date;
|
||||||
|
updatedAt: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
const timeoutSchema = new Schema<ITimeout>(
|
const timeoutSchema = new Schema<ITimeout>(
|
||||||
|
@ -21,6 +24,12 @@ const timeoutSchema = new Schema<ITimeout>(
|
||||||
unique: false,
|
unique: false,
|
||||||
index: true,
|
index: true,
|
||||||
},
|
},
|
||||||
|
cooldown: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
unique: false,
|
||||||
|
index: true,
|
||||||
|
},
|
||||||
timeoutId: { type: String },
|
timeoutId: { type: String },
|
||||||
},
|
},
|
||||||
{ timestamps: true }
|
{ timestamps: true }
|
||||||
|
|
Loading…
Add table
Reference in a new issue