all repos — stealth-developers @ b7e61584ff3af4a94f71727fc28d18adfda7098e

feat: bug report buttons wip
willow hai@wlo.moe
Sat, 24 May 2025 21:15:05 +0100
commit

b7e61584ff3af4a94f71727fc28d18adfda7098e

parent

3266a1185e40b7607c7d2f6db8992c23b487273c

1 files changed, 71 insertions(+), 1 deletions(-)

jump to
M src/interactions/commands/bug.tssrc/interactions/commands/bug.ts

@@ -1,11 +1,13 @@

import { ActionRowBuilder, ButtonBuilder, + type ButtonInteraction, ButtonStyle, ChannelType, type ChatInputCommandInteraction, type Client, EmbedBuilder, + type GuildMember, ModalBuilder, type ModalSubmitInteraction, SlashCommandBuilder,

@@ -15,6 +17,7 @@ } from "discord.js";

import { BugModel, GuildModel, getNextBugId } from "../../database/schemas.ts"; import { createUserIfNotExists } from "../../utils/exists.ts"; import { Logger } from "../../utils/logging.ts"; +import { hasManagerPermissions } from "../../utils/permissions.ts"; const logger = new Logger("bug-command");

@@ -154,7 +157,34 @@ .setDescription(description)

.setFooter({ text: `${gameInfo.name} • bug #${bugId}` }) .setTimestamp(); - const message = await channel.send({ embeds: [embed] }); + const buttons = new ActionRowBuilder<ButtonBuilder>().addComponents( + new ButtonBuilder() + .setCustomId(`bug:close:${bugId}`) + .setLabel("close") + .setStyle(ButtonStyle.Secondary) + .setEmoji("🔒"), + new ButtonBuilder() + .setCustomId(`bug:edit:${bugId}`) + .setLabel("edit") + .setStyle(ButtonStyle.Primary) + .setEmoji("✏️"), + new ButtonBuilder() + .setCustomId(`bug:delete:${bugId}`) + .setLabel("delete") + .setStyle(ButtonStyle.Danger) + .setEmoji("🗑️"), + new ButtonBuilder() + .setCustomId("bug:new") + .setLabel("new bug") + .setStyle(ButtonStyle.Success) + .setEmoji("🐛"), + ); + + const message = await channel.send({ + embeds: [embed], + components: [buttons], + }); + msgUrl = message.url; bug.message_id = message.id;

@@ -196,8 +226,48 @@ return value;

} } +async function buttonExecute(client: Client, interaction: ButtonInteraction) { + const [, action, bugId] = interaction.customId.split(":"); + + if (action === "new") { + // todo: show select menu for the game + return; + } + + const member = interaction.member as GuildMember; + const isManager = await hasManagerPermissions(member); + + const bug = await BugModel.findOne({ bug_id: Number.parseInt(bugId) }); + if (!bug) { + return interaction.reply({ + content: "❌ bug not found.", + flags: ["Ephemeral"], + }); + } + + const isAuthor = bug.user_id === interaction.user.id; + + if (!isManager && !isAuthor) { + return interaction.reply({ + content: "❌ you don't have permission to do this.", + flags: ["Ephemeral"], + }); + } + + // todo: impl. different actions + switch (action) { + case "close": + break; + case "edit": + break; + case "delete": + break; + } +} + export default { data: commandData, execute, modalExecute, + buttonExecute, };