working towards edit + end buttons (broken for more than one giveaway at a time)

This commit is contained in:
kingomes
2025-07-30 22:30:32 -05:00
parent d0286baf27
commit 39d4d8eed0

View File

@@ -87,18 +87,17 @@ export default commandModule({
let embed = new EmbedBuilder()
.setTitle(`🥳 ${item} giveaway 🥳`)
.setDescription("Click the button to enter the giveaway!")
.addFields(
{ name: "\u200b", value: `Hosted by: <@${ctx.userId}>
.addFields({
name: "\u200b",
value: `Hosted by: <@${ctx.userId}>
Entries: 0
Ends: ${new Timestamp(
Number(endTimeStamp2)
).getRelativeTime()} (${endTimeStamp})`},
);
Ends: ${new Timestamp(Number(endTimeStamp2)).getRelativeTime()} (${endTimeStamp})`,
});
await ctx
.reply({
embeds: [embed],
components: [setupRows()]
components: [setupRows()],
})
.then((embedMessage) => {
let giveawayEnded = false;
@@ -108,57 +107,91 @@ export default commandModule({
ctx.userId
);
deps["@sern/client"].on("interactionCreate", async (interaction) => {
if (interaction.isButton()) {
if (interaction.customId === 'enter' || interaction.customId === 'leave') {
if (interaction.customId === "enter" || interaction.customId === "leave") {
const messageId = interaction.message.id;
console.log(`Message ID: ${messageId}`);
const userId = interaction.user.id;
const host = db.prepare(`SELECT host_id FROM giveaway_message WHERE message_id = ?`).get(messageId);
const host = db
.prepare(
`SELECT host_id FROM giveaway_message WHERE message_id = ?`
)
.get(messageId);
if (interaction.customId === 'enter') {
if (interaction.customId === "enter") {
// Prevent host from entering
// if (host && host.host_id === userId) {
// await interaction.reply({ ephemeral: true, content: `You cannot enter the giveaway as the host!` });
// return;
// }
// Check if already entered
const checkUser = db.prepare(`SELECT COUNT(*) as count FROM entries WHERE message_id = ? AND user_id = ?`).get(messageId, userId);
const checkUser = db
.prepare(
`SELECT COUNT(*) as count FROM entries WHERE message_id = ? AND user_id = ?`
)
.get(messageId, userId);
if (checkUser.count === 0) {
db.prepare(`INSERT INTO entries(message_id, timestamp, user_id) VALUES (?, ?, ?)`).run(messageId, Date.now(), userId);
await interaction.reply({ ephemeral: true, content: `Giveaway entered!` });
db.prepare(
`INSERT INTO entries(message_id, timestamp, user_id) VALUES (?, ?, ?)`
).run(messageId, Date.now(), userId);
await interaction.reply({
ephemeral: true,
content: `Giveaway entered!`,
});
} else {
await interaction.reply({ ephemeral: true, content: `You are already entered!` });
await interaction.reply({
ephemeral: true,
content: `You are already entered!`,
});
}
} else {
// Leave giveaway
const checkUser = db.prepare(`SELECT COUNT(*) as count FROM entries WHERE message_id = ? AND user_id = ?`).get(messageId, userId);
const checkUser = db
.prepare(
`SELECT COUNT(*) as count FROM entries WHERE message_id = ? AND user_id = ?`
)
.get(messageId, userId);
if (checkUser.count === 1) {
db.prepare(`DELETE FROM entries WHERE message_id = ? AND user_id = ?`).run(messageId, userId);
await interaction.reply({ ephemeral: true, content: `Giveaway left` });
db.prepare(
`DELETE FROM entries WHERE message_id = ? AND user_id = ?`
).run(messageId, userId);
await interaction.reply({
ephemeral: true,
content: `Giveaway left`,
});
} else {
await interaction.reply({ ephemeral: true, content: `You cannot leave a giveaway you were not entered in` });
await interaction.reply({
ephemeral: true,
content: `You cannot leave a giveaway you were not entered in`,
});
}
}
// Get updated entry count
const entryCount = db.prepare(`SELECT COUNT(*) as count FROM entries WHERE message_id = ?`).get(messageId).count;
const entryCount = db
.prepare(
`SELECT COUNT(*) as count FROM entries WHERE message_id = ?`
)
.get(messageId).count;
// Edit embed
const embed = EmbedBuilder.from(interaction.message.embeds[0])
.spliceFields(0, 1, {
name: "\u200b",
value: `Hosted by: <@${host?.host_id ?? 'unknown'}>
const embed = EmbedBuilder.from(
interaction.message.embeds[0]
).spliceFields(0, 1, {
name: "\u200b",
value: `Hosted by: <@${host?.host_id ?? "unknown"}>
Entries: ${entryCount}
Ends: ${new Timestamp(Number(endTimeStamp2)).getRelativeTime()} (${endTimeStamp})`
});
Ends: ${new Timestamp(
Number(endTimeStamp2)
).getRelativeTime()} (${endTimeStamp})`,
});
await interaction.message.edit({ embeds: [embed] });
}
}
});
// ...existing code...
// test entries
// db.prepare(`INSERT INTO entries(message_id, timestamp, user_id) VALUES (?, ?, ?)`).run([embedMessage.id, 1, 1])
@@ -169,12 +202,46 @@ export default commandModule({
let intervalTime = endTime.getTime() - startTime.getTime();
setTimeout(() => {
deps["@sern/client"].on("interactionCreate", async (interaction) => {
if (interaction.isButton()) {
if (interaction.customId === "edit" || interaction.customId === "end") {
// if (!ownerIDs.includes(interaction.user.id)) {
// await interaction.reply({ ephemeral: true, content: `You do not have permission to edit or end this giveaway!` });
// return;
//}
if (interaction.customId === "edit") {
// Handle editing the giveaway
await interaction.reply({
ephemeral: true,
content: `Editing the giveaway is not implemented yet.`,
});
} else if (interaction.customId === "end") {
// Handle ending the giveaway
if (giveawayEnded) {
await interaction.reply({
ephemeral: true,
content: `This giveaway has already ended!`,
});
return;
}
giveawayEnded = true;
clearTimeout(giveawayTimeout);
await interaction.reply({
ephemeral: true,
content: `Giveaway ended by <@${interaction.user.id}>`,
});
endGiveaway();
}
}
}
});
function endGiveaway() {
const stmt = db
.prepare(`SELECT * FROM entries WHERE message_id = ?`)
.all(embedMessage.id);
const eligible = stmt/*.filter(
const eligible = stmt; /*.filter(
(entry: { user_id: string }) =>
entry.user_id !== embedMessage.author.id &&
entry.user_id !== ctx.user.id
@@ -188,7 +255,7 @@ export default commandModule({
embedMessage.edit({
content: `Congratulations <@${winnerId}> on winning the ${item} giveaway! ${eligible.length} users entered`,
embeds: [],
components: [discardRows()]
components: [discardRows()],
});
giveawayEnded = true;
} else if (
@@ -203,7 +270,7 @@ export default commandModule({
embedMessage.edit({
content: `Congratulations <@${winnerId}> on winning the ${item} giveaway! ${eligible.length} users entered`,
embeds: [],
components: [discardRows()]
components: [discardRows()],
});
giveawayEnded = true;
} else if (
@@ -224,6 +291,11 @@ export default commandModule({
);
db.prepare(`DELETE FROM entries WHERE message_id = ?`).run(embedMessage.id);
}
}
const giveawayTimeout = setTimeout(() => {
if (giveawayEnded) return;
endGiveaway()
}, intervalTime);
});
},
@@ -243,13 +315,28 @@ function setupRows() {
const enterGiveaway = new ButtonBuilder({
customId: "enter",
label: "Enter Giveaway",
style: ButtonStyle.Success
})
style: ButtonStyle.Success,
});
const leaveGiveaway = new ButtonBuilder({
customId: "leave",
label: "Leave Giveaway",
style: ButtonStyle.Danger
})
style: ButtonStyle.Danger,
});
const editGiveaway = new ButtonBuilder({
customId: "edit",
label: "Edit Giveaway",
style: ButtonStyle.Primary,
});
const endGiveaway = new ButtonBuilder({
customId: "end",
label: "End Giveaway",
style: ButtonStyle.Secondary,
});
return new ActionRowBuilder<ButtonBuilder>().addComponents(enterGiveaway, leaveGiveaway);
}
return new ActionRowBuilder<ButtonBuilder>().addComponents(
enterGiveaway,
leaveGiveaway,
editGiveaway,
endGiveaway
);
}