The bot created new cooldowns instead of updating old ones, this commit fixes this by doing an updateMany if it finds a cooldown instead of just creating new ones
109 lines
3.1 KiB
TypeScript
109 lines
3.1 KiB
TypeScript
import { Cooldown } from "@prisma/client";
|
|
import { Guild, User } from "discord.js";
|
|
import logger from "../utils/logger";
|
|
import prisma from "./prisma";
|
|
|
|
class CooldownManager {
|
|
async setCooldown(
|
|
cooldownItem: string,
|
|
guild: Guild | null,
|
|
user: User | null,
|
|
cooldownSeconds: number
|
|
): Promise<void> {
|
|
const expiresAt = new Date(Date.now() + cooldownSeconds * 1000);
|
|
const data = {
|
|
cooldownItem,
|
|
expiresAt,
|
|
guild: guild ? { connect: { id: guild.id } } : undefined,
|
|
user: user ? { connect: { id: user.id } } : undefined,
|
|
};
|
|
|
|
const { guildCooldown, guildMemberCooldown, userCooldown } =
|
|
await this.checkCooldowns(cooldownItem, guild, user);
|
|
|
|
if (guildCooldown || guildMemberCooldown || userCooldown) {
|
|
await prisma.cooldown.updateMany({
|
|
where: {
|
|
cooldownItem,
|
|
expiresAt,
|
|
guild: guild ? { id: guild.id } : undefined,
|
|
user: user ? { id: user.id } : undefined,
|
|
},
|
|
data: {
|
|
cooldownItem,
|
|
expiresAt,
|
|
guildId: guild ? guild.id : undefined,
|
|
userId: user ? user.id : undefined,
|
|
},
|
|
});
|
|
} else {
|
|
await prisma.cooldown.create({ data });
|
|
}
|
|
|
|
if (guild && user) {
|
|
logger.verbose(
|
|
`Set guild member cooldown: ${cooldownItem} in guild ${guild.id} for user ${user.id}`
|
|
);
|
|
} else if (guild) {
|
|
logger.verbose(
|
|
`Set guild cooldown: ${cooldownItem} in guild ${guild.id}`
|
|
);
|
|
} else if (user) {
|
|
logger.verbose(`Set user cooldown: ${cooldownItem} for user ${user.id}`);
|
|
}
|
|
}
|
|
|
|
async checkCooldown(
|
|
cooldownItem: string,
|
|
guild: Guild | null,
|
|
user: User | null
|
|
): Promise<Cooldown | null> {
|
|
const start = Date.now();
|
|
const where = {
|
|
cooldownItem,
|
|
guild: guild ? { id: guild.id } : null,
|
|
user: user ? { id: user.id } : null,
|
|
expiresAt: { gte: new Date() },
|
|
};
|
|
const cooldown = await prisma.cooldown.findFirst({ where });
|
|
const duration = Date.now() - start;
|
|
|
|
if (guild && user) {
|
|
logger.verbose(
|
|
`Checked guild member cooldown: ${cooldownItem} in guild ${guild.id} for user ${user.id}. Duration: ${duration}ms`
|
|
);
|
|
} else if (guild) {
|
|
logger.verbose(
|
|
`Checked guild cooldown: ${cooldownItem} in guild ${guild.id}. Duration: ${duration}ms`
|
|
);
|
|
} else if (user) {
|
|
logger.verbose(
|
|
`Checked user cooldown: ${cooldownItem} for user ${user.id}. Duration: ${duration}ms`
|
|
);
|
|
}
|
|
|
|
return cooldown;
|
|
}
|
|
|
|
async checkCooldowns(
|
|
cooldownItem: string,
|
|
guild: Guild | null,
|
|
user: User | null
|
|
): Promise<{
|
|
guildCooldown: Cooldown | null;
|
|
userCooldown: Cooldown | null;
|
|
guildMemberCooldown: Cooldown | null;
|
|
}> {
|
|
const guildCooldown = guild
|
|
? await this.checkCooldown(cooldownItem, guild, null)
|
|
: null;
|
|
const userCooldown = await this.checkCooldown(cooldownItem, null, user);
|
|
const guildMemberCooldown = guild
|
|
? await this.checkCooldown(cooldownItem, guild, user)
|
|
: null;
|
|
|
|
return { guildCooldown, userCooldown, guildMemberCooldown };
|
|
}
|
|
}
|
|
|
|
export default CooldownManager;
|