import { CommandInteraction, GuildMember, Message, ActionRowBuilder, ButtonBuilder, MessageComponentInteraction, TextChannel, ButtonStyle, User, ThreadChannel } from "discord.js"; import EmojiEmbed from "../utils/generateEmojiEmbed.js"; import getEmojiByName from "../utils/getEmojiByName.js"; import client from "../utils/client.js"; import { messageException } from '../utils/createTemporaryStorage.js'; const noTopic = new EmojiEmbed() .setTitle("User not found") .setDescription("There is no user associated with this ticket.") .setStatus("Danger") .setEmoji("CONTROL.BLOCKCROSS") export default async function (interaction: CommandInteraction | MessageComponentInteraction) { if (interaction.channel === null) return; if (!(interaction.channel instanceof TextChannel || interaction.channel instanceof ThreadChannel)) return; const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger; let messages: Message[] = []; let deletedCount: number; do { const fetched = await (interaction.channel as TextChannel).messages.fetch({ limit: 100 }); const deleted = await (interaction.channel as TextChannel).bulkDelete(fetched, true); deletedCount = deleted.size; messages = messages.concat(Array.from(deleted.values() as Iterable)); if (messages.length === 1) messageException(interaction.guild!.id, interaction.channel.id, messages[0]!.id) } while (deletedCount === 100); messages = messages.filter(message => !( message.components.some( component => component.components.some( child => child.customId?.includes("transcript") ?? false ) ) )); let topic let member: GuildMember = interaction.guild?.members.me!; if (interaction.channel instanceof TextChannel) { topic = interaction.channel.topic; if (topic === null) return await interaction.reply({ embeds: [noTopic] }); const mem = interaction.guild!.members.cache.get(topic.split(" ")[1]!); if (mem) member = mem; } else { topic = interaction.channel.name; const split = topic.split("-").map(p => p.trim()) as [string, string, string]; const mem = interaction.guild!.members.cache.get(split[1]) if (mem) member = mem; } const newOut = await client.database.transcripts.createTranscript(messages, interaction, member); const [code, key, iv] = await client.database.transcripts.create(newOut); if(!code) return await interaction.reply({ embeds: [ new EmojiEmbed() .setTitle("Error") .setDescription("An error occurred while creating the transcript.") .setStatus("Danger") .setEmoji("CONTROL.BLOCKCROSS") ] }) const guildConfig = await client.database.guilds.read(interaction.guild!.id); const m: Message = (await interaction.reply({ embeds: [ new EmojiEmbed() .setTitle("Transcript") .setDescription( "You can view the transcript using the link below. You can save the link for later" + (guildConfig.logging.logs.channel ? ` or find it in <#${guildConfig.logging.logs.channel}> once you press delete below. After this the channel will be deleted.` : ".") ) .setStatus("Success") .setEmoji("CONTROL.DOWNLOAD") ], components: [ new ActionRowBuilder().addComponents([ new ButtonBuilder().setLabel("View").setStyle(ButtonStyle.Link).setURL(`https://testing.coded.codes/nucleus/transcript/${code}?key=${key}&iv=${iv}`), new ButtonBuilder() .setLabel("Delete") .setStyle(ButtonStyle.Danger) .setCustomId("close") .setEmoji(getEmojiByName("CONTROL.CROSS", "id")) ]) ], fetchReply: true })) as Message; let i; try { i = await m.awaitMessageComponent({ time: 300000, filter: (i) => { return i.user.id === interaction.user.id && i.channel!.id === interaction.channel!.id && i.message.id === m.id } }); await i.deferUpdate(); } catch { return; } const data = { meta: { type: "ticketDeleted", displayName: "Ticket Deleted", calculateType: "ticketUpdate", color: NucleusColors.red, emoji: "GUILD.TICKET.CLOSE", timestamp: Date.now() }, list: { ticketFor: entry(member.id, renderUser(member.user)), deletedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as User)), deleted: entry(Date.now().toString(), renderDelta(Date.now())), transcript: entry(code, `https://clicks.codes/nucleus/transcript/${code}`) }, hidden: { guild: interaction.guild!.id } }; log(data); await interaction.channel.delete(); return; }