blob: 85e059f3e0e896c09205017d0d3225adf24ec643 [file] [log] [blame]
Skyler Greyf21323a2022-08-13 23:58:22 +01001import {
2 CommandInteraction,
3 GuildMember,
4 Message,
TheCodedProf21c08592022-09-13 14:14:43 -04005 ActionRowBuilder,
6 ButtonBuilder,
Skyler Greyf21323a2022-08-13 23:58:22 +01007 MessageComponentInteraction,
TheCodedProf21c08592022-09-13 14:14:43 -04008 TextChannel,
PineaFan538d3752023-01-12 21:48:23 +00009 ButtonStyle,
TheCodedProf2e54a772023-02-14 16:26:47 -050010 User,
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050011 ThreadChannel
Skyler Greyf21323a2022-08-13 23:58:22 +010012} from "discord.js";
pineafan813bdf42022-07-24 10:39:10 +010013import EmojiEmbed from "../utils/generateEmojiEmbed.js";
14import getEmojiByName from "../utils/getEmojiByName.js";
pineafan813bdf42022-07-24 10:39:10 +010015import client from "../utils/client.js";
TheCodedProf94ff6de2023-02-22 17:47:26 -050016import { messageException } from '../utils/createTemporaryStorage.js';
pineafan813bdf42022-07-24 10:39:10 +010017
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050018const noTopic = new EmojiEmbed()
19 .setTitle("User not found")
20 .setDescription("There is no user associated with this ticket.")
21 .setStatus("Danger")
22 .setEmoji("CONTROL.BLOCKCROSS")
23
pineafan0f5cc782022-08-12 21:55:42 +010024export default async function (interaction: CommandInteraction | MessageComponentInteraction) {
Skyler Grey11236ba2022-08-08 21:13:33 +010025 if (interaction.channel === null) return;
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050026 if (!(interaction.channel instanceof TextChannel || interaction.channel instanceof ThreadChannel)) return;
Skyler Grey11236ba2022-08-08 21:13:33 +010027 const { log, NucleusColors, entry, renderUser, renderDelta } = client.logger;
pineafan813bdf42022-07-24 10:39:10 +010028
Skyler Grey11236ba2022-08-08 21:13:33 +010029 let messages: Message[] = [];
30 let deletedCount: number;
pineafan813bdf42022-07-24 10:39:10 +010031
Skyler Grey11236ba2022-08-08 21:13:33 +010032 do {
33 const fetched = await (interaction.channel as TextChannel).messages.fetch({ limit: 100 });
34 const deleted = await (interaction.channel as TextChannel).bulkDelete(fetched, true);
35 deletedCount = deleted.size;
TheCodedProfbc94a5c2023-01-18 18:59:31 -050036 messages = messages.concat(Array.from(deleted.values() as Iterable<Message>));
TheCodedProf94ff6de2023-02-22 17:47:26 -050037 if (messages.length === 1) messageException(interaction.guild!.id, interaction.channel.id, messages[0]!.id)
Skyler Grey11236ba2022-08-08 21:13:33 +010038 } while (deletedCount === 100);
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050039 messages = messages.filter(message => !(
40 message.components.some(
41 component => component.components.some(
42 child => child.customId?.includes("transcript") ?? false
43 )
44 )
45 ));
Skyler Grey11236ba2022-08-08 21:13:33 +010046
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050047 let topic
TheCodedProf9c51a7e2023-02-27 17:11:13 -050048 let member: GuildMember = interaction.guild?.members.me!;
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050049 if (interaction.channel instanceof TextChannel) {
50 topic = interaction.channel.topic;
51 if (topic === null) return await interaction.reply({ embeds: [noTopic] });
TheCodedProf9c51a7e2023-02-27 17:11:13 -050052 const mem = interaction.guild!.members.cache.get(topic.split(" ")[1]!);
53 if (mem) member = mem;
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050054 } else {
55 topic = interaction.channel.name;
56 const split = topic.split("-").map(p => p.trim()) as [string, string, string];
TheCodedProf9c51a7e2023-02-27 17:11:13 -050057 const mem = interaction.guild!.members.cache.get(split[1])
58 if (mem) member = mem;
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050059 }
60
TheCodedProf9c51a7e2023-02-27 17:11:13 -050061 const newOut = await client.database.transcripts.createTranscript(messages, interaction, member);
TheCodedProf2e54a772023-02-14 16:26:47 -050062
TheCodedProfcfe8e9a2023-02-26 17:28:09 -050063 const code = await client.database.transcripts.create(newOut);
TheCodedProf9c51a7e2023-02-27 17:11:13 -050064 if(!code) return await interaction.reply({
65 embeds: [
66 new EmojiEmbed()
67 .setTitle("Error")
68 .setDescription("An error occurred while creating the transcript.")
69 .setStatus("Danger")
70 .setEmoji("CONTROL.BLOCKCROSS")
71 ]
72 })
73 const guildConfig = await client.database.guilds.read(interaction.guild!.id);
74 const m: Message = (await interaction.reply({
75 embeds: [
76 new EmojiEmbed()
77 .setTitle("Transcript")
78 .setDescription(
79 "You can view the transcript using the link below. You can save the link for later" +
80 (guildConfig.logging.logs.channel
81 ? ` or find it in <#${guildConfig.logging.logs.channel}> once you press delete below. After this the channel will be deleted.`
82 : ".")
83 )
84 .setStatus("Success")
85 .setEmoji("CONTROL.DOWNLOAD")
86 ],
87 components: [
88 new ActionRowBuilder<ButtonBuilder>().addComponents([
89 new ButtonBuilder().setLabel("View").setStyle(ButtonStyle.Link).setURL(`https://clicks.codes/nucleus/transcript?code=${code}`),
90 new ButtonBuilder()
91 .setLabel("Delete")
92 .setStyle(ButtonStyle.Danger)
93 .setCustomId("close")
94 .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
95 ])
96 ],
97 fetchReply: true
98 })) as Message;
pineafan813bdf42022-07-24 10:39:10 +010099 let i;
100 try {
PineaFan0d06edc2023-01-17 22:10:31 +0000101 i = await m.awaitMessageComponent({
102 time: 300000,
TheCodedProf267563a2023-01-21 17:00:57 -0500103 filter: (i) => { return i.user.id === interaction.user.id && i.channel!.id === interaction.channel!.id && i.message.id === m.id }
PineaFan0d06edc2023-01-17 22:10:31 +0000104 });
TheCodedProf267563a2023-01-21 17:00:57 -0500105 await i.deferUpdate();
Skyler Grey75ea9172022-08-06 10:22:23 +0100106 } catch {
107 return;
108 }
pineafan63fc5e22022-08-04 22:04:10 +0100109 const data = {
Skyler Grey75ea9172022-08-06 10:22:23 +0100110 meta: {
pineafan63fc5e22022-08-04 22:04:10 +0100111 type: "ticketDeleted",
112 displayName: "Ticket Deleted",
pineafan813bdf42022-07-24 10:39:10 +0100113 calculateType: "ticketUpdate",
114 color: NucleusColors.red,
pineafan63fc5e22022-08-04 22:04:10 +0100115 emoji: "GUILD.TICKET.CLOSE",
TheCodedProf6ec331b2023-02-20 12:13:06 -0500116 timestamp: Date.now()
pineafan813bdf42022-07-24 10:39:10 +0100117 },
118 list: {
TheCodedProf9c51a7e2023-02-27 17:11:13 -0500119 ticketFor: entry(member.id, renderUser(member.user)),
PineaFan538d3752023-01-12 21:48:23 +0000120 deletedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as User)),
TheCodedProf6ec331b2023-02-20 12:13:06 -0500121 deleted: entry(Date.now().toString(), renderDelta(Date.now()))
pineafan813bdf42022-07-24 10:39:10 +0100122 },
123 hidden: {
pineafan4e425942022-08-08 22:01:47 +0100124 guild: interaction.guild!.id
pineafan813bdf42022-07-24 10:39:10 +0100125 }
pineafan63fc5e22022-08-04 22:04:10 +0100126 };
pineafan813bdf42022-07-24 10:39:10 +0100127 log(data);
pineafan63fc5e22022-08-04 22:04:10 +0100128 await interaction.channel.delete();
129 return;
Skyler Grey75ea9172022-08-06 10:22:23 +0100130}