fix: Giveaway bugs
This commit is contained in:
@@ -1,3 +1,3 @@
|
||||
export { giveawayCommands } from './commands.js';
|
||||
export { isGiveawayButton, handleGiveawayButton } from './buttons.js';
|
||||
export { endGiveaway, scheduleGiveawayEnd, runGiveawayCreateJob } from './service.js';
|
||||
export { endGiveaway, scheduleGiveawayEnd, runGiveawayCreateJob, GiveawayError } from './service.js';
|
||||
|
||||
@@ -59,6 +59,11 @@ function requirementLines(locale: 'de' | 'en', giveaway: Giveaway): string[] {
|
||||
|
||||
export function buildGiveawayEmbed(locale: 'de' | 'en', giveaway: Giveaway): EmbedBuilder {
|
||||
const ended = giveaway.endedAt !== null;
|
||||
const endsAtUnix = Math.floor(giveaway.endsAt.getTime() / 1000);
|
||||
// Discord does not parse <t:…> timestamps in embed footers — only in
|
||||
// description/fields/content. Keep relative + absolute for clarity.
|
||||
const endsAtText = `<t:${endsAtUnix}:R> (<t:${endsAtUnix}:f>)`;
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setTitle(t(locale, 'giveaway.embed.title'))
|
||||
.setColor(ended ? 0x6b7280 : 0x6366f1)
|
||||
@@ -86,19 +91,17 @@ export function buildGiveawayEmbed(locale: 'de' | 'en', giveaway: Giveaway): Emb
|
||||
);
|
||||
embed.setFooter({ text: t(locale, 'giveaway.embed.ended') });
|
||||
} else if (giveaway.paused) {
|
||||
embed.setDescription(t(locale, 'giveaway.embed.paused'));
|
||||
embed.setFooter({
|
||||
text: tf(locale, 'giveaway.embed.endsAt', {
|
||||
time: `<t:${Math.floor(giveaway.endsAt.getTime() / 1000)}:R>`
|
||||
})
|
||||
});
|
||||
embed.setDescription(
|
||||
`${t(locale, 'giveaway.embed.paused')}\n\n${tf(locale, 'giveaway.embed.endsAt', {
|
||||
time: endsAtText
|
||||
})}`
|
||||
);
|
||||
} else {
|
||||
embed.setDescription(t(locale, 'giveaway.embed.active'));
|
||||
embed.setFooter({
|
||||
text: tf(locale, 'giveaway.embed.endsAt', {
|
||||
time: `<t:${Math.floor(giveaway.endsAt.getTime() / 1000)}:R>`
|
||||
})
|
||||
});
|
||||
embed.setDescription(
|
||||
`${t(locale, 'giveaway.embed.active')}\n\n${tf(locale, 'giveaway.embed.endsAt', {
|
||||
time: endsAtText
|
||||
})}`
|
||||
);
|
||||
}
|
||||
|
||||
const requirements = requirementLines(locale, giveaway);
|
||||
@@ -313,10 +316,13 @@ async function dmWinners(
|
||||
}
|
||||
}
|
||||
|
||||
export async function endGiveaway(context: BotContext, giveawayId: string): Promise<void> {
|
||||
export async function endGiveaway(context: BotContext, giveawayId: string): Promise<Giveaway> {
|
||||
const giveaway = await context.prisma.giveaway.findUnique({ where: { id: giveawayId } });
|
||||
if (!giveaway || giveaway.endedAt) {
|
||||
return;
|
||||
if (!giveaway) {
|
||||
throw new GiveawayError('not_found');
|
||||
}
|
||||
if (giveaway.endedAt) {
|
||||
throw new GiveawayError('already_ended');
|
||||
}
|
||||
|
||||
await cancelGiveawayJob(giveawayId);
|
||||
@@ -338,6 +344,7 @@ export async function endGiveaway(context: BotContext, giveawayId: string): Prom
|
||||
if (winners.length > 0) {
|
||||
await dmWinners(context, updated, winners, locale);
|
||||
}
|
||||
return updated;
|
||||
}
|
||||
|
||||
export async function rerollGiveaway(
|
||||
|
||||
Reference in New Issue
Block a user