Files
SupportBot/Commands/close.js
T
2021-10-29 19:12:11 +01:00

232 lines
8.1 KiB
JavaScript

// SupportBot | Emerald Services
// Close Ticket Command
const fs = require("fs");
const Discord = require("discord.js");
const yaml = require("js-yaml");
const supportbot = yaml.load(
fs.readFileSync("./Configs/supportbot.yml", "utf8")
);
const cmdconfig = yaml.load(fs.readFileSync("./Configs/commands.yml", "utf8"));
const Command = require("../Structures/Command.js");
const TicketNumberID = require("../Structures/TicketID.js");
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
module.exports = new Command({
name: cmdconfig.CloseTicket,
description: cmdconfig.CloseTicketDesc,
slashCommandOptions: [
{
name: "reason",
description: "Ticket Close Reason",
type: "STRING",
},
],
permission: "SEND_MESSAGES",
async run(interaction) {
if (!interaction.channel.name.startsWith(`${supportbot.TicketPrefix}`)) {
const Exists = new Discord.MessageEmbed()
.setTitle("No Ticket Found!")
.setDescription(`${supportbot.NoValidTicket}`)
.setColor(supportbot.WarningColour);
return interaction.reply({ embed: Exists });
}
if (supportbot.CloseConfirmation) {
const CloseTicketRequest = new Discord.MessageEmbed()
.setTitle(`**${supportbot.ClosingTicket}**`)
.setDescription(
`Please confirm by repeating the following word.. \`${supportbot.ClosingConfirmation_Word}\` `
)
.setColor(supportbot.EmbedColour);
interaction
.reply(CloseTicketRequest)
.then((m) => {
interaction.channel
.awaitMessages(
(response) =>
response.content.toLowerCase() ===
supportbot.ClosingConfirmation_Word,
{
max: 1,
time: 20000,
errors: ["time"],
}
)
.then((collected) => {
let logChannel =
interaction.guild.channels.cache.find(
(channel) => channel.name === supportbot.TranscriptLog
) ||
interaction.guild.channels.cache.find(
(channel) => channel.id === supportbot.TranscriptLog
);
let user = interaction.user;
let reason =
interaction.options.getString("reason") ||
"No Reason Provided.";
let name = interaction.channel.name;
let ticketChannel = interaction.channel;
interaction
.reply(`**${supportbot.ClosingTicket}**`)
.then(() => {
const logEmbed = new Discord.MessageEmbed()
.setTitle(supportbot.TranscriptTitle)
.setColor(supportbot.EmbedColour)
.setFooter(supportbot.EmbedFooter)
.addField("Closed By", interaction.user.tag)
.addField("Reason", reason);
interaction.channel.interactions
.fetch({ limit: 100 })
.then((msgs) => {
let html = "";
msgs = msgs.sort(
(a, b) => a.createdTimestamp - b.createdTimestamp
);
html += `<style>* {background-color: #2c2f33;color: #fff;font-family: Arial, Helvetica, sans-serif;}</style>`;
html += `<strong>Server Name:</strong> ${interaction.guild.name}<br>`;
html += `<strong>Ticket:</strong> ${ticketChannel.name}<br>`;
html += `<strong>Message:</strong> ${msgs.size} Messages<br><br><br>`;
msgs.forEach((msg) => {
if (msg.content) {
html += `<strong>User:</strong> ${msg.author.tag}<br>`;
html += `<strong>Message:</strong> ${msg.content}<br>`;
html += `-----<br><br>`;
}
});
logChannel.send({ embeds: [logEmbed] }).catch((err) => {
interaction.reply(err);
});
let file = new Discord.MessageAttachment(
Buffer.from(html),
`${name}.html`
);
logChannel
.send({ embeds: [logEmbed], files: [file] })
.catch((err) => {
interaction.reply(err);
});
interaction.channel.delete().catch((error) => {
if (
error.code !==
Discord.Constants.APIErrors.UNKNOWN_CHANNEL
) {
console.error(
"Failed to delete the interaction:",
error
);
}
});
});
});
});
})
.catch(() => {
interaction
.followUp({
content: "The request to close the ticket has timed out.",
})
.then((m2) => setTimeout(() => interaction.channel.delete(3000)));
});
}
if (!supportbot.CloseConfirmation) {
let logChannel =
interaction.guild.channels.cache.find(
(channel) => channel.name === supportbot.TranscriptLog
) ||
interaction.guild.channels.cache.find(
(channel) => channel.id === supportbot.TranscriptLog
);
let user = interaction.user;
let reason =
(await interaction.options.getString("reason")) ||
"No Reason Provided.";
let name = interaction.channel.name;
let ticketChannel = interaction.channel;
interaction
.reply(`**${supportbot.ClosingTicket}**`)
.then(() => {
const logEmbed = new Discord.MessageEmbed()
.setTitle(supportbot.TranscriptTitle)
.setColor(supportbot.EmbedColour)
.setFooter(supportbot.EmbedFooter)
.addField("Closed By", interaction.user.tag)
.addField("Reason", reason);
interaction.channel.interactions
.fetch({ limit: 100 })
.then((msgs) => {
let html = "";
msgs = msgs.sort(
(a, b) => a.createdTimestamp - b.createdTimestamp
);
html += `<style>* {background-color: #2c2f33;color: #fff;font-family: Arial, Helvetica, sans-serif;}</style>`;
html += `<strong>Server Name:</strong> ${interaction.guild.name}<br>`;
html += `<strong>Ticket:</strong> ${ticketChannel.name}<br>`;
html += `<strong>Message:</strong> ${msgs.size} Messages<br><br><br>`;
msgs.forEach((msg) => {
if (msg.content) {
html += `<strong>User:</strong> ${msg.author.tag}<br>`;
html += `<strong>Message:</strong> ${msg.content}<br>`;
html += `-----<br><br>`;
}
});
logChannel.send({ embeds: [logEmbed] }).catch((err) => {
interaction.reply(err);
});
let file = new Discord.MessageAttachment(
Buffer.from(html),
`${name}.html`
);
logChannel
.send({ embeds: [logEmbed], files: [file] })
.catch((err) => {
interaction.reply(err);
});
interaction.channel.delete().catch((error) => {
if (
error.code !== Discord.Constants.APIErrors.UNKNOWN_CHANNEL
) {
console.error("Failed to delete the interaction:", error);
}
});
});
})
.catch(() => {
interaction
.followUp({
content: "The request to close the ticket has timed out.",
})
.then((m2) => setTimeout(() => interaction.channel.delete(3000)));
});
}
},
});