Aethel Bot OSS repository!
aethel.xyz
bot
fun
ai
discord
discord-bot
aethel
1import BotClient from '@/services/Client';
2import { MessageFlags, InteractionReplyOptions } from 'discord.js';
3
4interface CooldownManager {
5 cooldowns: Map<string, number>;
6 cooldownTime: number;
7}
8
9const managers = new Map<string, CooldownManager>();
10
11setInterval(
12 () => {
13 const now = Date.now();
14 for (const manager of managers.values()) {
15 for (const [userId, timestamp] of manager.cooldowns.entries()) {
16 if (now - timestamp > manager.cooldownTime) {
17 manager.cooldowns.delete(userId);
18 }
19 }
20 }
21 },
22 5 * 60 * 1000,
23);
24
25export function createCooldownManager(commandName: string, cooldownTime: number): CooldownManager {
26 const manager = {
27 cooldowns: new Map<string, number>(),
28 cooldownTime,
29 };
30 managers.set(commandName, manager);
31 return manager;
32}
33
34export async function checkCooldown(
35 manager: CooldownManager,
36 userId: string,
37 client: BotClient,
38 locale: string,
39): Promise<{ onCooldown: boolean; timeLeft?: number; message?: string }> {
40 const now = Date.now();
41 const cooldownEnd = manager.cooldowns.get(userId) || 0;
42
43 if (now < cooldownEnd) {
44 const timeLeft = Math.ceil((cooldownEnd - now) / 1000);
45 const message = await client.getLocaleText('cooldown', locale, {
46 cooldown: timeLeft,
47 });
48 return { onCooldown: true, timeLeft, message };
49 }
50
51 return { onCooldown: false };
52}
53
54export function setCooldown(manager: CooldownManager, userId: string): void {
55 const now = Date.now();
56 manager.cooldowns.set(userId, now + manager.cooldownTime);
57 setTimeout(() => manager.cooldowns.delete(userId), manager.cooldownTime);
58}
59
60export function createCooldownResponse(message: string): InteractionReplyOptions {
61 return {
62 content: message,
63 flags: MessageFlags.Ephemeral,
64 };
65}