changes to how deleting tickets works, and UI when creating mod tickets

pull/5/head
pineafan 4 years ago
parent 5be5eca351
commit 4092b86a1e
No known key found for this signature in database
GPG Key ID: 0BC8D3DCC20E96FE

@ -3,7 +3,7 @@ import readConfig from '../utils/readConfig.js'
import generateEmojiEmbed from '../utils/generateEmojiEmbed.js'; import generateEmojiEmbed from '../utils/generateEmojiEmbed.js';
import getEmojiByName from "../utils/getEmojiByName.js"; import getEmojiByName from "../utils/getEmojiByName.js";
export async function create(guild: Discord.Guild, member: Discord.User, client) { export async function create(guild: Discord.Guild, member: Discord.User, createdBy: Discord.User, client) {
let config = await readConfig(guild.id); let config = await readConfig(guild.id);
// @ts-ignore // @ts-ignore
const { log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger const { log, NucleusColors, entry, renderUser, renderChannel, renderDelta } = client.logger
@ -70,6 +70,7 @@ export async function create(guild: Discord.Guild, member: Discord.User, client)
}, },
list: { list: {
ticketFor: entry(member.id, renderUser(member)), ticketFor: entry(member.id, renderUser(member)),
createdBy: entry(createdBy.id, renderUser(createdBy)),
created: entry(new Date().getTime(), renderDelta(new Date().getTime())), created: entry(new Date().getTime(), renderDelta(new Date().getTime())),
ticketChannel: entry(c.id, renderChannel(c)), ticketChannel: entry(c.id, renderChannel(c)),
}, },

@ -11,7 +11,7 @@ export default async function (interaction) {
let channel = (interaction.channel as Discord.TextChannel) let channel = (interaction.channel as Discord.TextChannel)
if (!channel.parent || config.tickets.category != channel.parent.id) { if (!channel.parent || config.tickets.category != channel.parent.id) {
return interaction.reply({embeds: [new generateEmojiEmbed() return interaction.reply({embeds: [new generateEmojiEmbed()
.setTitle("Close Ticket") .setTitle("Deleting Ticket...")
.setDescription("This ticket is not in your tickets category, so cannot be deleted. You cannot run close in a thread.") // TODO bridge to cross later! .setDescription("This ticket is not in your tickets category, so cannot be deleted. You cannot run close in a thread.") // TODO bridge to cross later!
.setStatus("Danger") .setStatus("Danger")
.setEmoji("CONTROL.BLOCKCROSS") .setEmoji("CONTROL.BLOCKCROSS")
@ -19,17 +19,16 @@ export default async function (interaction) {
} }
let status = channel.topic.split(" ")[1]; let status = channel.topic.split(" ")[1];
if (status == "Archived") { if (status == "Archived") {
interaction.reply({embeds: [new generateEmojiEmbed() await interaction.reply({embeds: [new generateEmojiEmbed()
.setTitle("Close Ticket") .setTitle("Delete Ticket")
.setDescription("This ticket will be deleted in 3 seconds.") .setDescription("Your ticket is being deleted...")
.setStatus("Danger") .setStatus("Danger")
.setEmoji("GUILD.TICKET.CLOSE") .setEmoji("GUILD.TICKET.CLOSE")
]}); ]});
setTimeout(async () => {
let data = { let data = {
meta:{ meta:{
type: 'ticketClosed', type: 'ticketDeleted',
displayName: 'Ticket Closed', displayName: 'Ticket Deleted',
calculateType: true, calculateType: true,
color: NucleusColors.red, color: NucleusColors.red,
emoji: 'GUILD.TICKET.CLOSE', emoji: 'GUILD.TICKET.CLOSE',
@ -37,7 +36,7 @@ export default async function (interaction) {
}, },
list: { list: {
ticketFor: entry(channel.topic.split(" ")[0], renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)), 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)), deletedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
closed: entry(new Date().getTime(), renderDelta(new Date().getTime())) closed: entry(new Date().getTime(), renderDelta(new Date().getTime()))
}, },
hidden: { hidden: {
@ -46,16 +45,14 @@ export default async function (interaction) {
} }
log(data, interaction.client); log(data, interaction.client);
interaction.channel.delete(); interaction.channel.delete();
}, 3000);
return; return;
} else if (status == "Active") { } else if (status == "Active") {
interaction.reply({embeds: [new generateEmojiEmbed() await interaction.reply({embeds: [new generateEmojiEmbed()
.setTitle("Close Ticket") .setTitle("Close Ticket")
.setDescription("This ticket will be archived in 3 seconds.") .setDescription("Your ticket is being closed...")
.setStatus("Warning") .setStatus("Warning")
.setEmoji("GUILD.TICKET.ARCHIVED") .setEmoji("GUILD.TICKET.ARCHIVED")
]}); ]});
setTimeout(async () =>{
let overwrites = [ let overwrites = [
{ {
id: channel.topic.split(" ")[0], id: channel.topic.split(" ")[0],
@ -79,8 +76,8 @@ export default async function (interaction) {
channel.setTopic(`${channel.topic.split(" ")[0]} Archived`); channel.setTopic(`${channel.topic.split(" ")[0]} Archived`);
let data = { let data = {
meta:{ meta:{
type: 'ticketArchive', type: 'ticketClosed',
displayName: 'Ticket Archived', displayName: 'Ticket Closed',
calculateType: true, calculateType: true,
color: NucleusColors.yellow, color: NucleusColors.yellow,
emoji: 'GUILD.TICKET.ARCHIVED', emoji: 'GUILD.TICKET.ARCHIVED',
@ -88,8 +85,8 @@ export default async function (interaction) {
}, },
list: { list: {
ticketFor: entry(channel.topic.split(" ")[0], renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)), ticketFor: entry(channel.topic.split(" ")[0], renderUser((await interaction.guild.members.fetch(channel.topic.split(" ")[0])).user)),
archivedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)), closedBy: entry(interaction.member.user.id, renderUser(interaction.member.user)),
archived: entry(new Date().getTime(), renderDelta(new Date().getTime())), closed: entry(new Date().getTime(), renderDelta(new Date().getTime())),
ticketChannel: entry(channel.id, renderChannel(channel)), ticketChannel: entry(channel.id, renderChannel(channel)),
}, },
hidden: { hidden: {
@ -99,16 +96,15 @@ export default async function (interaction) {
log(data, interaction.client); log(data, interaction.client);
await interaction.editReply({embeds: [new generateEmojiEmbed() await interaction.editReply({embeds: [new generateEmojiEmbed()
.setTitle("Close Ticket") .setTitle("Close Ticket")
.setDescription("This ticket has been archived.\nType `/ticket close` to delete it.") .setDescription("This ticket has been closed.\nType `/ticket close` again to delete it.")
.setStatus("Warning") .setStatus("Warning")
.setEmoji("GUILD.TICKET.ARCHIVED") // TODO:[Premium] Add a transcript option ||\----/|| <- the bridge we will cross when we come to it .setEmoji("GUILD.TICKET.ARCHIVED") // TODO:[Premium] Add a transcript option ||\----/|| <- the bridge we will cross when we come to it
], components: [new MessageActionRow().addComponents([new MessageButton() ], components: [new MessageActionRow().addComponents([new MessageButton()
.setLabel("Close") .setLabel("Delete")
.setStyle("DANGER") .setStyle("DANGER")
.setCustomId("closeticket") .setCustomId("closeticket")
.setEmoji(getEmojiByName("CONTROL.CROSS", "id")) .setEmoji(getEmojiByName("CONTROL.CROSS", "id"))
])]}); ])]});
}, 3000);
return; return;
} }
} }

@ -6,7 +6,6 @@ import getEmojiByName from "../../utils/getEmojiByName.js";
import confirmationMessage from "../../utils/confirmationMessage.js"; import confirmationMessage from "../../utils/confirmationMessage.js";
import keyValueList from "../../utils/generateKeyValueList.js"; import keyValueList from "../../utils/generateKeyValueList.js";
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
import { create, areTicketsEnabled } from "../../automations/createModActionTicket.js";
import readConfig from "../../utils/readConfig.js"; import readConfig from "../../utils/readConfig.js";
const command = (builder: SlashCommandSubcommandBuilder) => const command = (builder: SlashCommandSubcommandBuilder) =>

@ -29,10 +29,10 @@ const callback = async (interaction: CommandInteraction) => {
+ `The user **will${interaction.options.getString("notify") == "yes" ? '' : ' not'}** be notified\n\n` + `The user **will${interaction.options.getString("notify") == "yes" ? '' : ' not'}** be notified\n\n`
+ `Are you sure you want to ${interaction.options.getString("name") ? "change" : "clear"} <@!${(interaction.options.getMember("user") as GuildMember).id}>'s nickname?`) + `Are you sure you want to ${interaction.options.getString("name") ? "change" : "clear"} <@!${(interaction.options.getMember("user") as GuildMember).id}>'s nickname?`)
.setColor("Danger") .setColor("Danger")
.addCustomCallback( .addCustomBoolean(
"Create appeal ticket", !(await areTicketsEnabled(interaction.guild.id)), "Create appeal ticket", !(await areTicketsEnabled(interaction.guild.id)),
() => { create(interaction.guild, interaction.options.getUser("user"), interaction.client)}, async () => await create(interaction.guild, interaction.options.getUser("user"), interaction.user, interaction.client),
"An appeal ticket was created") "An appeal ticket will be created when Confirm is clicked")
// pluralize("day", interaction.options.getInteger("delete")) // pluralize("day", interaction.options.getInteger("delete"))
// const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" } // const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" }
.send() .send()
@ -96,7 +96,7 @@ const callback = async (interaction: CommandInteraction) => {
await interaction.editReply({embeds: [new generateEmojiEmbed() await interaction.editReply({embeds: [new generateEmojiEmbed()
.setEmoji(`PUNISH.NICKNAME.${failed ? "YELLOW" : "GREEN"}`) .setEmoji(`PUNISH.NICKNAME.${failed ? "YELLOW" : "GREEN"}`)
.setTitle(`Nickname`) .setTitle(`Nickname`)
.setDescription("The members nickname was changed" + (failed ? ", but was not notified" : "")) .setDescription("The members nickname was changed" + (failed ? ", but was not notified" : "") + (confirmation.response ? ` and an appeal ticket was opened in <#${confirmation.response}>` : ``))
.setStatus(failed ? "Warning" : "Success") .setStatus(failed ? "Warning" : "Success")
], components: []}) ], components: []})
} else { } else {

@ -5,7 +5,6 @@ import confirmationMessage from "../../utils/confirmationMessage.js";
import generateEmojiEmbed from "../../utils/generateEmojiEmbed.js"; import generateEmojiEmbed from "../../utils/generateEmojiEmbed.js";
import keyValueList from "../../utils/generateKeyValueList.js"; import keyValueList from "../../utils/generateKeyValueList.js";
import getEmojiByName from "../../utils/getEmojiByName.js"; import getEmojiByName from "../../utils/getEmojiByName.js";
import { create, areTicketsEnabled } from "../../automations/createModActionTicket.js";
const command = (builder: SlashCommandSubcommandBuilder) => const command = (builder: SlashCommandSubcommandBuilder) =>
builder builder

@ -129,10 +129,10 @@ const callback = async (interaction: CommandInteraction) => {
+ `The user **will${interaction.options.getString("notify") === "no" ? ' not' : ''}** be notified\n\n` + `The user **will${interaction.options.getString("notify") === "no" ? ' not' : ''}** be notified\n\n`
+ `Are you sure you want to mute <@!${(interaction.options.getMember("user") as GuildMember).id}>?`) // TODO + `Are you sure you want to mute <@!${(interaction.options.getMember("user") as GuildMember).id}>?`) // TODO
.setColor("Danger") .setColor("Danger")
.addCustomCallback( .addCustomBoolean(
"Create appeal ticket", !(await areTicketsEnabled(interaction.guild.id)), "Create appeal ticket", !(await areTicketsEnabled(interaction.guild.id)),
() => { create(interaction.guild, interaction.options.getUser("user"), interaction.client)}, async () => await create(interaction.guild, interaction.options.getUser("user"), interaction.user, interaction.client),
"An appeal ticket was created") "An appeal ticket will be created when Confirm is clicked")
// pluralize("day", interaction.options.getInteger("delete")) // pluralize("day", interaction.options.getInteger("delete"))
// const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" } // const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" }
.send() .send()

@ -30,10 +30,10 @@ const callback = async (interaction: CommandInteraction) => {
+ `The user **will${interaction.options.getString("notify") === "no" ? ' not' : ''}** be notified\n\n` + `The user **will${interaction.options.getString("notify") === "no" ? ' not' : ''}** be notified\n\n`
+ `Are you sure you want to warn <@!${(interaction.options.getMember("user") as GuildMember).id}>?`) + `Are you sure you want to warn <@!${(interaction.options.getMember("user") as GuildMember).id}>?`)
.setColor("Danger") .setColor("Danger")
.addCustomCallback( .addCustomBoolean(
"Create appeal ticket", !(await areTicketsEnabled(interaction.guild.id)), "Create appeal ticket", !(await areTicketsEnabled(interaction.guild.id)),
() => { create(interaction.guild, interaction.options.getUser("user"), interaction.client)}, async () => await create(interaction.guild, interaction.options.getUser("user"), interaction.user, interaction.client),
"An appeal ticket was created") "An appeal ticket will be created when Confirm is clicked")
// pluralize("day", interaction.options.getInteger("delete")) // pluralize("day", interaction.options.getInteger("delete"))
// const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" } // const pluralize = (word: string, count: number) => { return count === 1 ? word : word + "s" }
.send() .send()
@ -85,7 +85,7 @@ const callback = async (interaction: CommandInteraction) => {
await interaction.editReply({embeds: [new generateEmojiEmbed() await interaction.editReply({embeds: [new generateEmojiEmbed()
.setEmoji(`PUNISH.WARN.GREEN`) .setEmoji(`PUNISH.WARN.GREEN`)
.setTitle(`Warn`) .setTitle(`Warn`)
.setDescription("The user was warned") .setDescription("The user was warned" + (confirmation.response ? ` and an appeal ticket was opened in <#${confirmation.response}>` : ``))
.setStatus("Success") .setStatus("Success")
], components: []}) ], components: []})
} else { } else {
@ -135,7 +135,7 @@ const callback = async (interaction: CommandInteraction) => {
return await interaction.editReply({embeds: [new generateEmojiEmbed() return await interaction.editReply({embeds: [new generateEmojiEmbed()
.setEmoji(`PUNISH.WARN.GREEN`) .setEmoji(`PUNISH.WARN.GREEN`)
.setTitle(`Warn`) .setTitle(`Warn`)
.setDescription("The user was warned") .setDescription("The user was warned" + (confirmation.response ? ` and an appeal ticket was opened in <#${confirmation.response}>` : ``))
.setStatus("Success") .setStatus("Success")
], components: []}) ], components: []})
} else { } else {

@ -14,6 +14,8 @@ class confirmationMessage {
customCallbackString: string = ""; customCallbackString: string = "";
customCallbackClicked: boolean = false; customCallbackClicked: boolean = false;
customCallbackResponse: any = null; customCallbackResponse: any = null;
customBoolean: () => any;
customBooleanClicked: boolean = null;
inverted: boolean; inverted: boolean;
constructor(interaction: CommandInteraction) { constructor(interaction: CommandInteraction) {
@ -23,8 +25,9 @@ class confirmationMessage {
this.emoji = ""; this.emoji = "";
this.description = ""; this.description = "";
this.color = ""; this.color = "";
this.inverted = false this.inverted = false;
this.customCallback = () => {} this.customCallback = () => {};
this.customBoolean = () => {};
} }
setTitle(title: string) { this.title = title; return this } setTitle(title: string) { this.title = title; return this }
@ -33,12 +36,23 @@ class confirmationMessage {
setColor(color: string) { this.color = color; return this } setColor(color: string) { this.color = color; return this }
setInverted(inverted: boolean) { this.inverted = inverted; return this } setInverted(inverted: boolean) { this.inverted = inverted; return this }
addCustomCallback(title: string, disabled: boolean, callback: () => any, callbackClicked: string) { addCustomCallback(title: string, disabled: boolean, callback: () => any, callbackClicked: string) {
if (this.customButtonTitle) return this
this.customButtonTitle = title; this.customButtonTitle = title;
this.customButtonDisabled = disabled; this.customButtonDisabled = disabled;
this.customCallback = callback; this.customCallback = callback;
this.customCallbackString = callbackClicked; this.customCallbackString = callbackClicked;
return this; return this;
} }
addCustomBoolean(title: string, disabled: boolean, callback: () => any, callbackClicked: string) {
if (this.customButtonTitle) return this
this.customButtonTitle = title;
this.customButtonDisabled = disabled;
this.customBoolean = callback;
this.customCallbackString = callbackClicked;
this.customBooleanClicked = false;
return this;
}
async send(editOnly?: boolean) { async send(editOnly?: boolean) {
while (true) { while (true) {
@ -49,7 +63,7 @@ class confirmationMessage {
.setTitle(this.title) .setTitle(this.title)
.setDescription(this.description) .setDescription(this.description)
.setStatus(this.color) .setStatus(this.color)
.setFooter({text: this.customCallbackClicked ? this.customCallbackString : ""}) .setFooter({text: (this.customBooleanClicked ?? this.customCallbackClicked) ? this.customCallbackString : ""})
], ],
components: [ components: [
new MessageActionRow().addComponents([ new MessageActionRow().addComponents([
@ -66,7 +80,10 @@ class confirmationMessage {
].concat(this.customButtonTitle ? [new Discord.MessageButton() ].concat(this.customButtonTitle ? [new Discord.MessageButton()
.setCustomId("custom") .setCustomId("custom")
.setLabel(this.customButtonTitle) .setLabel(this.customButtonTitle)
.setStyle("PRIMARY") .setStyle(this.customBooleanClicked !== null ?
( this.customBooleanClicked ? "SUCCESS" : "PRIMARY" ) :
"PRIMARY"
)
.setDisabled(this.customButtonDisabled) .setDisabled(this.customButtonDisabled)
.setEmoji(getEmojiByName("CONTROL.TICKET", "id")) .setEmoji(getEmojiByName("CONTROL.TICKET", "id"))
] : [])) ] : []))
@ -84,19 +101,36 @@ class confirmationMessage {
try { try {
component = await (m as Message).awaitMessageComponent({filter: (m) => m.user.id === this.interaction.user.id, time: 2.5 * 60 * 1000}); component = await (m as Message).awaitMessageComponent({filter: (m) => m.user.id === this.interaction.user.id, time: 2.5 * 60 * 1000});
} catch (e) { } catch (e) {
return { success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse }; return {
success: false,
buttonClicked: this.customBooleanClicked ?? this.customCallbackClicked,
response: this.customCallbackResponse
};
} }
if (component.customId === "yes") { if (component.customId === "yes") {
component.deferUpdate(); component.deferUpdate();
return { success: true, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse }; if (this.customBooleanClicked === true) this.customCallbackResponse = await this.customBoolean();
return {
success: true,
buttonClicked: this.customBooleanClicked ?? this.customCallbackClicked,
response: this.customCallbackResponse
};
} else if (component.customId === "no") { } else if (component.customId === "no") {
component.deferUpdate(); component.deferUpdate();
return { success: false, buttonClicked: this.customCallbackClicked, response: this.customCallbackResponse }; return {
success: false,
buttonClicked: this.customBooleanClicked ?? this.customCallbackClicked,
response: this.customCallbackResponse
};
} else if (component.customId === "custom") { } else if (component.customId === "custom") {
component.deferUpdate(); component.deferUpdate();
this.customCallbackResponse = this.customCallback(); if (this.customBooleanClicked !== null) {
this.customBooleanClicked = !this.customBooleanClicked;
} else {
this.customCallbackResponse = await this.customCallback();
this.customCallbackClicked = true; this.customCallbackClicked = true;
this.customButtonDisabled = true; this.customButtonDisabled = true;
}
editOnly = true; editOnly = true;
} }
} }

Loading…
Cancel
Save