Tickets! and a lot of bug fixes
diff --git a/src/actions/tickets/create.ts b/src/actions/tickets/create.ts
index 595a5b3..3c2dd2c 100644
--- a/src/actions/tickets/create.ts
+++ b/src/actions/tickets/create.ts
@@ -3,16 +3,16 @@
import client from "../../utils/client.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
+import { getCommandMentionByName } from "../../utils/getCommandMentionByName.js";
function capitalize(s: string) {
s = s.replace(/([A-Z])/g, " $1");
- return s.length < 3 ? s.toUpperCase() : s[0].toUpperCase() + s.slice(1).toLowerCase();
+ return s.length < 3 ? s.toUpperCase() : s[0]!.toUpperCase() + s.slice(1).toLowerCase();
}
export default async function (interaction: CommandInteraction | ButtonInteraction) {
if (!interaction.guild) return;
const { log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger;
-
const config = await client.database.guilds.read(interaction.guild.id);
if (!config.tickets.enabled || !config.tickets.category) {
return await interaction.reply({
@@ -21,7 +21,7 @@
.setTitle("Tickets are disabled")
.setDescription("Please enable tickets in the configuration to use this command.")
.setFooter({
- text: interaction.member.permissions.has("MANAGE_GUILD")
+ text: (interaction.member!.permissions as Discord.PermissionsBitField).has("ManageGuild")
? "You can enable it by running /settings tickets"
: ""
})
@@ -31,16 +31,26 @@
ephemeral: true
});
}
- const category = interaction.guild.channels.cache.get(config.tickets.category) as Discord.CategoryChannel;
let count = 0;
- category.children.forEach((element) => {
- if (!(element.type === "GUILD_TEXT")) return;
- if ((element as Discord.TextChannel).topic.includes(`${interaction.member.user.id}`)) {
- if ((element as Discord.TextChannel).topic.endsWith("Active")) {
- count++;
+ const targetChannel: Discord.CategoryChannel | Discord.TextChannel = (await interaction.guild.channels.fetch(config.tickets.category))! as Discord.CategoryChannel | Discord.TextChannel;
+ if (targetChannel.type === Discord.ChannelType.GuildCategory) {
+ // For channels, the topic is the user ID, then the word Active
+ const category = targetChannel as Discord.CategoryChannel;
+ category.children.cache.forEach((element) => {
+ if (!(element.type === Discord.ChannelType.GuildText)) return;
+ if (((element as Discord.TextChannel).topic ?? "").includes(`${interaction.member!.user.id}`)) {
+ if (((element as Discord.TextChannel).topic ?? "").endsWith("Active")) { count++; }
}
- }
- });
+ });
+ } else {
+ // For threads, the name is the users name, id, then the word Active
+ const channel = targetChannel as Discord.TextChannel;
+ channel.threads.cache.forEach((element: Discord.ThreadChannel) => {
+ if (element.name.includes(`${interaction.member!.user.id}`)) {
+ if (element.name.endsWith("Active")) { count++; }
+ }
+ });
+ }
if (count >= config.tickets.maxTickets) {
return await interaction.reply({
embeds: [
@@ -55,15 +65,15 @@
ephemeral: true
});
}
- let ticketTypes;
+ let ticketTypes: string[];
let custom = false;
if (config.tickets.customTypes && config.tickets.useCustom) {
ticketTypes = config.tickets.customTypes;
custom = true;
} else if (config.tickets.types) ticketTypes = toHexArray(config.tickets.types, tickets);
else ticketTypes = [];
- let chosenType;
- let splitFormattedTicketTypes = [];
+ let chosenType: string | null;
+ let splitFormattedTicketTypes: ActionRowBuilder<ButtonBuilder>[] = [];
if (ticketTypes.length > 0) {
let formattedTicketTypes = [];
formattedTicketTypes = ticketTypes.map((type) => {
@@ -78,7 +88,7 @@
}
});
for (let i = 0; i < formattedTicketTypes.length; i += 5) {
- splitFormattedTicketTypes.push(new ActionRowBuilder().addComponents(formattedTicketTypes.slice(i, i + 5)));
+ splitFormattedTicketTypes.push(new ActionRowBuilder<ButtonBuilder>().addComponents(formattedTicketTypes.slice(i, i + 5)));
}
const m = await interaction.reply({
embeds: [
@@ -94,7 +104,10 @@
});
let component;
try {
- component = await m.awaitMessageComponent({ time: 300000 });
+ component = await m.awaitMessageComponent({
+ time: 300000,
+ filter: (i) => { return i.user.id === interaction.user.id && i.channel!.id === interaction.channel!.id }
+ });
} catch (e) {
return;
}
@@ -118,7 +131,7 @@
}
});
for (let i = 0; i < formattedTicketTypes.length; i += 5) {
- splitFormattedTicketTypes.push(new ActionRowBuilder().addComponents(formattedTicketTypes.slice(i, i + 5)));
+ splitFormattedTicketTypes.push(new ActionRowBuilder<ButtonBuilder>().addComponents(formattedTicketTypes.slice(i, i + 5)));
}
component.update({
embeds: [
@@ -138,107 +151,190 @@
components: splitFormattedTicketTypes
});
}
- const overwrites = [
- {
- id: interaction.member,
- allow: ["VIEW_CHANNEL", "SEND_MESSAGES", "ATTACH_FILES", "ADD_REACTIONS", "READ_MESSAGE_HISTORY"],
- type: "member"
- }
- ] as Discord.OverwriteResolvable[];
- overwrites.push({
- id: interaction.guild.roles.everyone,
- deny: ["VIEW_CHANNEL"],
- type: "role"
- });
- if (config.tickets.supportRole !== null) {
+ let c: Discord.TextChannel | Discord.PrivateThreadChannel;
+ if (targetChannel.type === Discord.ChannelType.GuildCategory) {
+ const overwrites = [
+ {
+ id: interaction.member,
+ allow: ["ViewChannel", "SendMessages", "AttachFiles", "AddReactions", "ReadMessageHistory"],
+ type: Discord.OverwriteType.Member
+ }
+ ] as Discord.OverwriteResolvable[];
overwrites.push({
- id: interaction.guild.roles.cache.get(config.tickets.supportRole),
- allow: ["VIEW_CHANNEL", "SEND_MESSAGES", "ATTACH_FILES", "ADD_REACTIONS", "READ_MESSAGE_HISTORY"],
- type: "role"
+ id: interaction.guild.roles.everyone,
+ deny: ["ViewChannel"],
+ type: Discord.OverwriteType.Role
});
- }
+ if (config.tickets.supportRole !== null) {
+ overwrites.push({
+ id: interaction.guild.roles.cache.get(config.tickets.supportRole)!,
+ allow: ["ViewChannel", "SendMessages", "AttachFiles", "AddReactions", "ReadMessageHistory"],
+ type: Discord.OverwriteType.Role
+ });
+ }
- let c;
- try {
- c = await interaction.guild.channels.create(interaction.member.user.username, {
- type: "GUILD_TEXT",
- topic: `${interaction.member.user.id} Active`,
- parent: config.tickets.category,
- nsfw: false,
- permissionOverwrites: overwrites as Discord.OverwriteResolvable[],
- reason: "Creating ticket"
- });
- } catch (e) {
- return await interaction.editReply({
- embeds: [
- new EmojiEmbed()
- .setTitle("Create Ticket")
- .setDescription("Failed to create ticket")
- .setStatus("Danger")
- .setEmoji("CONTROL.BLOCKCROSS")
- ]
- });
- }
- try {
- await c.send({
- content:
- `<@${interaction.member.user.id}>` +
- (config.tickets.supportRole !== null ? ` • <@&${config.tickets.supportRole}>` : ""),
- allowedMentions: {
- users: [(interaction.member as Discord.GuildMember).id],
- roles: config.tickets.supportRole !== null ? [config.tickets.supportRole] : []
+ try {
+ c = await interaction.guild.channels.create({
+ name: `${interaction.member!.user.username.toLowerCase()}`,
+ type: Discord.ChannelType.GuildText,
+ topic: `${interaction.member!.user.id} Active`,
+ parent: config.tickets.category,
+ nsfw: false,
+ permissionOverwrites: overwrites as Discord.OverwriteResolvable[],
+ reason: "Creating ticket"
+ });
+ } catch (e) {
+ return await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Create Ticket")
+ .setDescription("Failed to create ticket")
+ .setStatus("Danger")
+ .setEmoji("CONTROL.BLOCKCROSS")
+ ]
+ });
+ }
+ try {
+ await c.send({
+ content:
+ `<@${interaction.member!.user.id}>` +
+ (config.tickets.supportRole !== null ? ` • <@&${config.tickets.supportRole}>` : ""),
+ allowedMentions: {
+ users: [(interaction.member as Discord.GuildMember).id],
+ roles: config.tickets.supportRole !== null ? [config.tickets.supportRole] : []
+ }
+ });
+ let content: string | null = null;
+ if (interaction.isCommand()) {
+ content = interaction.options.get("message")?.value as string;
}
- });
- let content = interaction.options ? interaction.options.getString("message") || "" : "";
- if (content) content = `**Message:**\n> ${content}\n`;
- const emoji = custom ? "" : getEmojiByName("TICKETS." + chosenType.toUpperCase());
- await c.send({
- embeds: [
- new EmojiEmbed()
- .setTitle("New Ticket")
- .setDescription(
- `Ticket created by <@${interaction.member.user.id}>\n` +
- `**Support type:** ${
- chosenType !== null ? emoji + " " + capitalize(chosenType) : "General"
- }\n` +
- `**Ticket ID:** \`${c.id}\`\n${content}\n` +
- "Type `/ticket close` to close this ticket."
- )
- .setStatus("Success")
- .setEmoji("GUILD.TICKET.OPEN")
- ],
- components: [
- new ActionRowBuilder().addComponents([
- new ButtonBuilder()
- .setLabel("Close")
- .setStyle(ButtonStyle.Danger)
- .setCustomId("closeticket")
- .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
- ])
- ]
- });
- const data = {
- meta: {
- type: "ticketCreate",
- displayName: "Ticket Created",
- calculateType: "ticketUpdate",
- color: NucleusColors.green,
- emoji: "GUILD.TICKET.OPEN",
- timestamp: new Date().getTime()
- },
- list: {
- ticketFor: entry(interaction.member.user.id, renderUser(interaction.member.user)),
- created: entry(new Date().getTime(), renderDelta(new Date().getTime())),
- ticketChannel: entry(c.id, renderChannel(c))
- },
- hidden: {
- guild: interaction.guild.id
+ if (content) content = `**Message:**\n> ${content}\n`;
+ let emoji;
+ if (chosenType) {
+ emoji = custom ? "" : getEmojiByName("TICKETS." + chosenType.toUpperCase());
+ } else {
+ emoji = "";
}
- };
- log(data);
- } catch (e) {
- console.log(e);
+ await c.send({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("New Ticket")
+ .setDescription(
+ `Ticket created by <@${interaction.member!.user.id}>\n` +
+ `**Support type:** ${
+ chosenType !== null ? emoji + " " + capitalize(chosenType) : "General"
+ }\n` +
+ `**Ticket ID:** \`${c.id}\`\n${content ?? ""}\n` +
+ `Type ${await getCommandMentionByName("ticket/close")} to close this ticket.`
+ )
+ .setStatus("Success")
+ .setEmoji("GUILD.TICKET.OPEN")
+ ],
+ components: [
+ new ActionRowBuilder<ButtonBuilder>().addComponents([
+ new ButtonBuilder()
+ .setLabel("Close")
+ .setStyle(ButtonStyle.Danger)
+ .setCustomId("closeticket")
+ .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
+ ])
+ ]
+ });
+ } catch (e) {
+ return await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Create Ticket")
+ .setDescription("Failed to create ticket")
+ .setStatus("Danger")
+ .setEmoji("GUILD.TICKET.CLOSE")
+ ]
+ });
+ }
+ } else {
+ c = await targetChannel.threads.create({name: `${interaction.member!.user.username} - ${interaction.member!.user.id} - Active`,
+ autoArchiveDuration: 60 * 24 * 7,
+ type: Discord.ChannelType.PrivateThread,
+ reason: "Creating ticket"
+ }) as Discord.PrivateThreadChannel;
+ c.members.add(interaction.member!.user.id); // TODO: When a thread is used, and a support role is added, automatically set channel permissions
+ try {
+ await c.send({
+ content:
+ `<@${interaction.member!.user.id}>` +
+ (config.tickets.supportRole !== null ? ` • <@&${config.tickets.supportRole}>` : ""),
+ allowedMentions: {
+ users: [(interaction.member as Discord.GuildMember).id],
+ roles: config.tickets.supportRole !== null ? [config.tickets.supportRole] : []
+ }
+ });
+ let content: string | null = null;
+ if (interaction.isCommand()) {
+ content = interaction.options.get("message")?.value as string;
+ }
+ if (content) content = `**Message:**\n> ${content}\n`;
+ let emoji;
+ if (chosenType) {
+ emoji = custom ? "" : getEmojiByName("TICKETS." + chosenType.toUpperCase());
+ } else {
+ emoji = "";
+ }
+ await c.send({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("New Ticket")
+ .setDescription(
+ `Ticket created by <@${interaction.member!.user.id}>\n` +
+ `**Support type:** ${
+ chosenType !== null ? emoji + " " + capitalize(chosenType) : "General"
+ }\n` +
+ `**Ticket ID:** \`${c.id}\`\n${content ?? ""}\n` +
+ `Type ${await getCommandMentionByName("ticket/close")} to close this ticket.`
+ )
+ .setStatus("Success")
+ .setEmoji("GUILD.TICKET.OPEN")
+ ],
+ components: [
+ new ActionRowBuilder<ButtonBuilder>().addComponents([
+ new ButtonBuilder()
+ .setLabel("Close")
+ .setStyle(ButtonStyle.Danger)
+ .setCustomId("closeticket")
+ .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
+ ])
+ ]
+ });
+ } catch (e) {
+ return await interaction.editReply({
+ embeds: [
+ new EmojiEmbed()
+ .setTitle("Create Ticket")
+ .setDescription("Failed to create ticket")
+ .setStatus("Danger")
+ .setEmoji("GUILD.TICKET.CLOSE")
+ ]
+ });
+ }
}
+ const data = {
+ meta: {
+ type: "ticketCreate",
+ displayName: "Ticket Created",
+ calculateType: "ticketUpdate",
+ color: NucleusColors.green,
+ emoji: "GUILD.TICKET.OPEN",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ ticketFor: entry(interaction.member!.user.id, renderUser(interaction.member!.user! as Discord.User)),
+ created: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+ ticketChannel: entry(c.id, renderChannel(c))
+ },
+ hidden: {
+ guild: interaction.guild.id
+ }
+ };
+ log(data);
await interaction.editReply({
embeds: [
new EmojiEmbed()
diff --git a/src/actions/tickets/delete.ts b/src/actions/tickets/delete.ts
index cab38ec..48d2a51 100644
--- a/src/actions/tickets/delete.ts
+++ b/src/actions/tickets/delete.ts
@@ -1,50 +1,52 @@
-import Discord, { ButtonBuilder, ActionRowBuilder, ButtonStyle, ButtonInteraction } from "discord.js";
+import { getCommandMentionByName } from '../../utils/getCommandMentionByName.js';
+import Discord, { ActionRowBuilder, ButtonBuilder, ButtonInteraction, PrivateThreadChannel, TextChannel, ButtonStyle } from "discord.js";
import client from "../../utils/client.js";
import EmojiEmbed from "../../utils/generateEmojiEmbed.js";
import getEmojiByName from "../../utils/getEmojiByName.js";
+import { preloadPage } from '../../utils/createTemporaryStorage.js';
export default async function (interaction: Discord.CommandInteraction | ButtonInteraction) {
if (!interaction.guild) return;
+ const config = await client.database.guilds.read(interaction.guild.id);
const { log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger;
- const config = await client.database.guilds.read(interaction.guild.id);
- let thread = false;
- if (interaction.channel instanceof Discord.ThreadChannel) thread = true;
- const threadChannel = interaction.channel as Discord.ThreadChannel;
- const channel = interaction.channel as Discord.TextChannel;
- if (
- !channel.parent ||
- config.tickets.category !== channel.parent.id ||
- (thread ? threadChannel.parent.parent.id !== config.tickets.category : false)
- ) {
- return interaction.reply({
+ const ticketChannel = config.tickets.category;
+ if (!("parent" in interaction.channel!)) {
+ return await interaction.reply({
embeds: [
new EmojiEmbed()
- .setTitle("Deleting Ticket...")
- .setDescription(
- "This ticket is not in your tickets category, so cannot be deleted. You cannot run close in a thread."
- )
+ .setTitle("Not a ticket")
+ .setDescription("This channel isn't a ticket, so you can't delete it.")
.setStatus("Danger")
.setEmoji("CONTROL.BLOCKCROSS")
- ],
- ephemeral: true
+ ], ephemeral: true
});
- }
- const status = channel.topic.split(" ")[1];
- if (status === "Archived") {
- await interaction.reply({
+ } else if (interaction.channel!.parent!.id !== ticketChannel) {
+ return await interaction.reply({
embeds: [
new EmojiEmbed()
- .setTitle("Delete Ticket")
- .setDescription("Your ticket is being deleted...")
+ .setTitle("Not a ticket")
+ .setDescription("This channel isn't a ticket, so you can't delete it.")
.setStatus("Danger")
- .setEmoji("GUILD.TICKET.CLOSE")
- ]
+ .setEmoji("CONTROL.BLOCKCROSS")
+ ], ephemeral: true
});
+ }
+ const channel: PrivateThreadChannel | TextChannel = interaction.channel as PrivateThreadChannel | TextChannel;
+ let status: string | null = ("topic" in interaction.channel) ? interaction.channel!.topic : interaction.channel.name;
+ status = status ?? "";
+ if (status.endsWith("Archived")) { status = "Archived"; }
+ else { status = "Active"; }
+
+ const uID = channel.type === Discord.ChannelType.PrivateThread ? channel.name.split(" - ")[1] : channel.topic!.split(" ")[0];
+
+ if (status === "Archived") {
+ // Delete the ticket
+
const data = {
meta: {
- type: "ticketDeleted",
- displayName: "Ticket Deleted",
+ type: "ticketClosed",
+ displayName: "Ticket Closed",
calculateType: "ticketUpdate",
color: NucleusColors.red,
emoji: "GUILD.TICKET.CLOSE",
@@ -52,85 +54,45 @@
},
list: {
ticketFor: entry(
- channel.topic.split(" ")[0],
- renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)
+ uID!,
+ renderUser((await interaction.guild.members.fetch(uID!)).user)
),
- deletedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
- deleted: entry(new Date().getTime(), renderDelta(new Date().getTime()))
+ closedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as Discord.User)),
+ closed: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+ ticketChannel: entry(channel.id, channel.name)
},
hidden: {
guild: interaction.guild.id
}
};
log(data);
- interaction.channel.delete();
- return;
+
+ await channel.delete();
} else if (status === "Active") {
+ // Close the ticket
+
+ if (channel.isThread()) {
+ channel.setName(`${channel.name.replace("Active", "Archived")}`);
+ channel.members.remove(channel.name.split(" - ")[1]!);
+ } else {
+ channel.setTopic(`${(channel.topic ?? "").replace("Active", "Archived")}`);
+ if (!channel.topic!.includes("Archived")) { channel.setTopic("0 Archived"); }
+ await channel.permissionOverwrites.delete(channel.topic!.split(" ")[0]!);
+ }
+ preloadPage(interaction.channel.id, "privacy", "2")
await interaction.reply({
embeds: [
new EmojiEmbed()
- .setTitle("Close Ticket")
- .setDescription("Your ticket is being closed...")
- .setStatus("Warning")
- .setEmoji("GUILD.TICKET.ARCHIVED")
- ]
- });
- const overwrites = [
- {
- id: channel.topic.split(" ")[0],
- deny: ["VIEW_CHANNEL"],
- type: "member"
- },
- {
- id: interaction.guild.id,
- deny: ["VIEW_CHANNEL"],
- type: "role"
- }
- ] as Discord.OverwriteResolvable[];
- if (config.tickets.supportRole !== null) {
- overwrites.push({
- id: interaction.guild.roles.cache.get(config.tickets.supportRole),
- allow: ["VIEW_CHANNEL", "SEND_MESSAGES", "ATTACH_FILES", "ADD_REACTIONS", "READ_MESSAGE_HISTORY"],
- type: "role"
- });
- }
- channel.edit({ permissionOverwrites: overwrites });
- channel.setTopic(`${channel.topic.split(" ")[0]} Archived`);
- const data = {
- meta: {
- type: "ticketClosed",
- displayName: "Ticket Closed",
- calculateType: "ticketUpdate",
- color: NucleusColors.yellow,
- emoji: "GUILD.TICKET.ARCHIVED",
- timestamp: new Date().getTime()
- },
- list: {
- ticketFor: entry(
- channel.topic.split(" ")[0],
- renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)
- ),
- closedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
- closed: entry(new Date().getTime(), renderDelta(new Date().getTime())),
- ticketChannel: entry(channel.id, renderChannel(channel))
- },
- hidden: {
- guild: interaction.guild.id
- }
- };
- log(data);
- await interaction.editReply({
- embeds: [
- new EmojiEmbed()
- .setTitle("Close Ticket")
- .setDescription(
- "This ticket has been closed.\nType `/ticket close` again to delete it.\n\nNote: Check `/privacy` for details about transcripts."
- )
+ .setTitle("Archived Ticket")
+ .setDescription(`This ticket has been Archived. Type ${await getCommandMentionByName("ticket/close")} to delete it.` +
+ await client.database.premium.hasPremium(interaction.guild.id) ?
+ `\n\nFor more info on transcripts, check ${await getCommandMentionByName("privacy")}` :
+ "")
.setStatus("Warning")
.setEmoji("GUILD.TICKET.ARCHIVED")
],
components: [
- new ActionRowBuilder().addComponents(
+ new ActionRowBuilder<ButtonBuilder>().addComponents(
[
new ButtonBuilder()
.setLabel("Delete")
@@ -138,27 +100,52 @@
.setCustomId("closeticket")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
].concat(
- client.database.premium.hasPremium(interaction.guild.id)
+ await client.database.premium.hasPremium(interaction.guild.id)
? [
- new ButtonBuilder()
- .setLabel("Create Transcript and Delete")
- .setStyle(ButtonStyle.Primary)
- .setCustomId("createtranscript")
- .setEmoji(getEmojiByName("CONTROL.DOWNLOAD", "id"))
- ]
+ new ButtonBuilder()
+ .setLabel("Create Transcript and Delete")
+ .setStyle(ButtonStyle.Primary)
+ .setCustomId("createtranscript")
+ .setEmoji(getEmojiByName("CONTROL.DOWNLOAD", "id"))
+ ]
: []
)
)
]
});
- return;
+ const data = {
+ meta: {
+ type: "ticketClosed",
+ displayName: "Ticket Archived",
+ calculateType: "ticketUpdate",
+ color: NucleusColors.yellow,
+ emoji: "GUILD.TICKET.ARCHIVED",
+ timestamp: new Date().getTime()
+ },
+ list: {
+ ticketFor: entry(
+ uID!,
+ renderUser((await interaction.guild.members.fetch(uID!)).user)
+ ),
+ archivedBy: entry(interaction.member!.user.id, renderUser(interaction.member!.user as Discord.User)),
+ archived: entry(new Date().getTime(), renderDelta(new Date().getTime())),
+ ticketChannel: entry(channel.id, renderChannel(channel))
+ },
+ hidden: {
+ guild: interaction.guild.id
+ }
+ };
+ log(data);
}
+ return;
}
-async function purgeByUser(member, guild) {
+
+async function purgeByUser(member: string, guild: string) {
const config = await client.database.guilds.read(guild.id);
+ const fetchedGuild = await client.guilds.fetch(guild);
if (!config.tickets.category) return;
- const tickets = guild.channels.cache.get(config.tickets.category);
+ const tickets = fetchedGuild.channels.cache.get(config.tickets.category);
if (!tickets) return;
const ticketChannels = tickets.children;
let deleted = 0;
@@ -198,4 +185,4 @@
}
}
-export { purgeByUser };
+export { purgeByUser };
\ No newline at end of file