/[sudobot]/trunk/src/services/Cooldown.ts
ViewVC logotype

Contents of /trunk/src/services/Cooldown.ts

Parent Directory Parent Directory | Revision Log Revision Log


Revision 397 - (show annotations)
Mon Jul 29 17:30:01 2024 UTC (8 months, 1 week ago) by rakin
File MIME type: application/typescript
File size: 3493 byte(s)
feat: add cooldown support
1 import { formatDuration, intervalToDuration } from "date-fns";
2 import { Message } from "discord.js";
3 import MessageEmbed from "../client/MessageEmbed";
4 import KeyValuePair from "../types/KeyValuePair";
5 import BaseCommand from "../utils/structures/BaseCommand";
6 import Service from "../utils/structures/Service";
7
8 export default class Cooldown extends Service {
9 cooldowns = new Map<string, (KeyValuePair<NodeJS.Timeout>)>();
10
11 async onMessageCreate(message: Message, command: BaseCommand) {
12 if (!command.coolDown)
13 return true;
14
15 const commandName = command.getName();
16
17 if (!this.cooldowns.has(message.guild!.id)) {
18 this.cooldowns.set(message.guild!.id, {
19 [`${commandName}-${message.author.id}-${Date.now()}`]: setTimeout(() => {
20 const cooldowns = this.cooldowns.get(message.guild!.id);
21
22 if (cooldowns) {
23 for (const cooldown in cooldowns) {
24 if (!cooldowns[cooldown]) {
25 continue;
26 }
27
28 if (cooldown.startsWith(`${commandName}-${message.author.id}`)) {
29 delete cooldowns[cooldown];
30 console.log('Cooldown expired', `${commandName}-${message.author.tag}`);
31 }
32 }
33 }
34 }, command.coolDown)
35 });
36 }
37 else {
38 const cooldowns = this.cooldowns.get(message.guild!.id)!;
39
40 console.log("Cooldowns", cooldowns);
41
42 for (const cooldown in cooldowns) {
43 if (cooldown.startsWith(`${commandName}-${message.author.id}`) && cooldowns[cooldown]) {
44 console.log('Cooldown triggered', `${commandName}-${message.author.tag}`);
45 const [,, time] = cooldown.split('-');
46 const end = parseInt(time) + command.coolDown;
47 console.log(end);
48 const timetext = formatDuration(intervalToDuration({ start: Date.now(), end: parseInt(time) + command.coolDown }));
49
50 await message.reply({
51 embeds: [
52 new MessageEmbed({
53 description: `:clock: Please wait, you're doing that too fast!`,
54 footer: { text: 'Cooldown • ' + (timetext.trim() === '' ? '1 second' : timetext) },
55 color: 0xf14a60
56 })
57 ]
58 });
59
60 return false;
61 }
62 }
63
64 cooldowns[`${commandName}-${message.author.id}-${Date.now()}`] = setTimeout(() => {
65 const cooldowns = this.cooldowns.get(message.guild!.id);
66
67 if (cooldowns) {
68 for (const cooldown in cooldowns) {
69 if (!cooldowns[cooldown]) {
70 continue;
71 }
72
73 if (cooldown.startsWith(`${commandName}-${message.author.id}`)) {
74 delete cooldowns[cooldown];
75 console.log('Cooldown expired', `${commandName}-${message.author.tag}`);
76 }
77 }
78 }
79 }, command.coolDown);
80 }
81
82 return true;
83 }
84 }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26