From 48d2008d1a86fbcd09ed4aa14d3b6e12b5c147c1 Mon Sep 17 00:00:00 2001 From: Eamon Watson Date: Mon, 2 Nov 2026 23:15:02 +0100 Subject: [PATCH] feat(giveaway): purge ended giveaways and hide them from view --- apps/bot/src/commands/utility/giveaway.ts | 7 ++----- apps/bot/src/lib/giveaways.ts | 13 ++++++++++--- apps/bot/src/lib/purgeScheduler.ts | 2 ++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/bot/src/commands/utility/giveaway.ts b/apps/bot/src/commands/utility/giveaway.ts index 6cbfe71..ea2672c 100644 --- a/apps/bot/src/commands/utility/giveaway.ts +++ b/apps/bot/src/commands/utility/giveaway.ts @@ -104,7 +104,7 @@ function buildViewEmbed( const slice = shown.slice(page * 20, (page + 1) * 20); const list = slice.length - ? slice.map((entry) => `\`${entry.position}.\` <@${entry.userId}> \`${entry.userId}\``).join('\n') + ? slice.map((entry) => `${entry.position}\\. <@${entry.userId}> \`${entry.userId}\``).join('\n') : query ? 'No entries match that search.' : 'No entries yet.'; @@ -227,10 +227,7 @@ export class GiveawayCommand extends Command { const giveaways = await searchGuildGiveaways(interaction.guildId, interaction.options.getFocused().trim()); await interaction.respond( - giveaways.map((giveaway) => ({ - name: `${truncate(giveaway.prize, 88)} (${giveaway.ended ? 'ended' : 'active'})`, - value: giveaway.messageId!, - })), + giveaways.map((giveaway) => ({ name: truncate(giveaway.prize, 100), value: giveaway.messageId! })), ); } diff --git a/apps/bot/src/lib/giveaways.ts b/apps/bot/src/lib/giveaways.ts index d18aa5d..2bf8083 100644 --- a/apps/bot/src/lib/giveaways.ts +++ b/apps/bot/src/lib/giveaways.ts @@ -139,16 +139,23 @@ export async function searchGuildGiveaways(guildId: string, query: string) { where: { guildId, messageId: { not: null }, + ended: false, OR: query ? [{ prize: { contains: query, mode: 'insensitive' } }, { messageId: { startsWith: query } }] : undefined, }, - select: { messageId: true, prize: true, ended: true }, - orderBy: [{ ended: 'asc' }, { createdAt: 'desc' }], + select: { messageId: true, prize: true }, + orderBy: { createdAt: 'desc' }, take: 25, }); } +export async function clearExpiredGiveaways() { + return prisma.giveaway.deleteMany({ + where: { ended: true, endsAt: { lt: new Date(Date.now() - 7 * 86_400_000) } }, // 7d after ending + }); +} + export async function deleteGiveawayByMessageId(messageId: string) { await prisma.giveaway.deleteMany({ where: { messageId } }); } @@ -225,7 +232,7 @@ export async function finishGiveaway(giveawayId: string): Promise