diff --git a/src/actions/pinTicket.ts b/src/actions/pinTicket.ts index ddfea98..a388ae0 100644 --- a/src/actions/pinTicket.ts +++ b/src/actions/pinTicket.ts @@ -31,8 +31,11 @@ export const registerActions = async () => { } //rename channel (and give error when crashed) + const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : "" + const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? "" + const originalName = channel.name - const newName = "📌"+channel.name + const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channel.name) try{ await utilities.timedAwait(channel.setName(newName),2500,(err) => { opendiscord.log("Failed to rename channel on ticket pin","error") diff --git a/src/actions/renameTicket.ts b/src/actions/renameTicket.ts index 47cef4c..a110f16 100644 --- a/src/actions/renameTicket.ts +++ b/src/actions/renameTicket.ts @@ -16,9 +16,13 @@ export const registerActions = async () => { await opendiscord.events.get("onTicketRename").emit([ticket,user,channel,reason]) //rename channel (and give error when crashed) + const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : "" + const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? "" + const originalName = channel.name + const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(data) try{ - await utilities.timedAwait(channel.setName(data),2500,(err) => { + await utilities.timedAwait(channel.setName(newName),2500,(err) => { opendiscord.log("Failed to rename channel on ticket rename","error") }) }catch(err){ diff --git a/src/actions/unpinTicket.ts b/src/actions/unpinTicket.ts index 6c608fb..931ef38 100644 --- a/src/actions/unpinTicket.ts +++ b/src/actions/unpinTicket.ts @@ -22,16 +22,17 @@ export const registerActions = async () => { ticket.get("opendiscord:busy").value = true //rename channel (and give error when crashed) + const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : "" + const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? "" + const originalName = channel.name - if (originalName.startsWith("📌")){ - const newName = originalName.replace("📌",""); - try{ - await utilities.timedAwait(channel.setName(newName),2500,(err) => { - opendiscord.log("Failed to rename channel on ticket unpin","error") - }) - }catch(err){ - await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message) - } + const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channel.name) + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket unpin","error") + }) + }catch(err){ + await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message) } //update ticket message diff --git a/src/actions/updateTicketPriority.ts b/src/actions/updateTicketPriority.ts new file mode 100644 index 0000000..50c16d0 --- /dev/null +++ b/src/actions/updateTicketPriority.ts @@ -0,0 +1,61 @@ +/////////////////////////////////////// +//TICKET TOPIC SYSTEM +/////////////////////////////////////// +import {opendiscord, api, utilities} from "../index" +import * as discord from "discord.js" + +const generalConfig = opendiscord.configs.get("opendiscord:general") + +export const registerActions = async () => { + opendiscord.actions.add(new api.ODAction("opendiscord:update-ticket-priority")) + opendiscord.actions.get("opendiscord:update-ticket-priority").workers.add([ + new api.ODWorker("opendiscord:update-ticket-priority",2,async (instance,params,source,cancel) => { + const {guild,channel,user,ticket,newPriority,reason} = params + if (channel.isThread() || !(channel instanceof discord.TextChannel)) throw new api.ODSystemError("Unable to set priority of ticket! Open Ticket doesn't support threads!") + + const oldPriority = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value) + await opendiscord.events.get("onTicketPriorityChange").emit([ticket,user,channel,oldPriority,newPriority]) + + //update ticket + ticket.get("opendiscord:busy").value = true + if (newPriority) ticket.get("opendiscord:priority").value = newPriority.priority + + //rename channel (and give error when crashed) + const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : "" + const priorityEmoji = newPriority.channelEmoji ?? "" + + const originalName = channel.name + const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channel.name) + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket priority update","error") + }) + }catch(err){ + await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-priority",{guild,channel,user,originalName,newName})).message) + } + + //reply with new message + if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:priority-set").build(source,{guild,channel,user,ticket,priority:newPriority,reason})).message) + ticket.get("opendiscord:busy").value = false + await opendiscord.events.get("afterTicketPriorityChanged").emit([ticket,user,channel,oldPriority,newPriority]) + + //update channel topic + await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null}) + }), + new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => { + const {guild,channel,user,ticket} = params + }), + new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => { + const {guild,channel,user,ticket,newPriority} = params + + opendiscord.log(user.displayName+" changed the priority of a ticket!","info",[ + {key:"user",value:user.username}, + {key:"userid",value:user.id,hidden:true}, + {key:"channel",value:"#"+channel.name}, + {key:"channelid",value:channel.id,hidden:true}, + {key:"priority",value:newPriority.id.value}, + {key:"method",value:source} + ]) + }) + ]) +} \ No newline at end of file diff --git a/src/actions/updateTicketTopic.ts b/src/actions/updateTicketTopic.ts index acc5d06..f01637b 100644 --- a/src/actions/updateTicketTopic.ts +++ b/src/actions/updateTicketTopic.ts @@ -13,6 +13,9 @@ export const registerActions = async () => { const {guild,channel,user,ticket,newTopic} = params if (channel.isThread() || !(channel instanceof discord.TextChannel)) throw new api.ODSystemError("Unable to set topic of ticket! Open Ticket doesn't support threads!") + const oldTopic = ticket.get("opendiscord:topic").value + if (newTopic) await opendiscord.events.get("onTicketTopicChange").emit([ticket,user,channel,oldTopic,newTopic]) + //update ticket ticket.get("opendiscord:busy").value = true if (newTopic) ticket.get("opendiscord:topic").value = newTopic @@ -27,7 +30,7 @@ export const registerActions = async () => { if (generalConfig.data.system.channelTopic.showOptionName) channelTopics.push(ticket.option.get("opendiscord:name").value) if (generalConfig.data.system.channelTopic.showOptionDescription) channelTopics.push(ticket.option.get("opendiscord:description").value) if (generalConfig.data.system.channelTopic.showOptionTopic) channelTopics.push(ticket.get("opendiscord:topic").value) - if (generalConfig.data.system.channelTopic.showPriority) channelTopics.push("**Priority:** "+opendiscord.priorities.get("opendiscord:none").renderDisplayName()) //TODO TRANSLATION!!! + if (generalConfig.data.system.channelTopic.showPriority) channelTopics.push("**Priority:** "+opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).renderDisplayName()) //TODO TRANSLATION!!! if (generalConfig.data.system.channelTopic.showClosed) channelTopics.push("**Status:** "+(closed ? "Closed" : "Opened")) //TODO TRANSLATION!!! if (generalConfig.data.system.channelTopic.showClaimed) channelTopics.push("**Claimed By:** "+(claimedBy ? discord.userMention(claimedBy) : "No-one")) //TODO TRANSLATION!!! if (generalConfig.data.system.channelTopic.showPinned) channelTopics.push("**Pinned:** "+(pinned ? "Yes" : "No")) //TODO TRANSLATION!!! @@ -40,6 +43,7 @@ export const registerActions = async () => { //reply with new message if (params.sendMessage && newTopic) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:topic-set").build(source,{guild,channel,user,ticket,topic:newTopic})).message) ticket.get("opendiscord:busy").value = false + if (newTopic) await opendiscord.events.get("afterTicketTopicChanged").emit([ticket,user,channel,oldTopic,newTopic]) }), new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => { const {guild,channel,user,ticket} = params diff --git a/src/builders/embeds.ts b/src/builders/embeds.ts index 52c2b12..dfa5992 100644 --- a/src/builders/embeds.ts +++ b/src/builders/embeds.ts @@ -330,7 +330,7 @@ const errorEmbeds = () => { new api.ODWorker("opendiscord:error-channel-rename",0,async (instance,params,source) => { const {channel,user,originalName,newName} = params - const method = (source == "ticket-move" || source == "ticket-pin" || source == "ticket-rename" || source == "ticket-unpin") ? source : getMethodFromSource(source) + const method = (source == "ticket-move" || source == "ticket-pin" || source == "ticket-rename" || source == "ticket-unpin" || source == "ticket-priority") ? source : getMethodFromSource(source) instance.setColor(generalConfig.data.system.useRedErrorEmbeds ? "Red" : generalConfig.data.mainColor) instance.setTitle(utilities.emojiTitle("❌",lang.getTranslation("errors.titles.channelRename"))) @@ -1349,7 +1349,7 @@ const extraEmbeds = () => { instance.setAuthor(user.displayName,user.displayAvatarURL()) instance.setColor(generalConfig.data.mainColor) - instance.setTitle(utilities.emojiTitle("🚨","Priority Changed")) //TODO TRANSLATION!!! + instance.setTitle(utilities.emojiTitle("🚨","Ticket Priority")) //TODO TRANSLATION!!! instance.setDescription("The current priority of this ticket is **"+priority.renderDisplayName()+"**!") //TODO TRANSLATION!!! }) ) diff --git a/src/commands/priority.ts b/src/commands/priority.ts new file mode 100644 index 0000000..cbf6744 --- /dev/null +++ b/src/commands/priority.ts @@ -0,0 +1,96 @@ +/////////////////////////////////////// +//PRIORITY COMMAND +/////////////////////////////////////// +import {opendiscord, api, utilities} from "../index" +import * as discord from "discord.js" + +const generalConfig = opendiscord.configs.get("opendiscord:general") + +export const registerCommandResponders = async () => { + //PRIORITY COMMAND RESPONDER + opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:priority",generalConfig.data.prefix,"priority")) + opendiscord.responders.commands.get("opendiscord:priority").workers.add([ + new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { + const permissionMode = generalConfig.data.system.permissions.priority + + if (permissionMode == "none"){ + //no permissions + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) + return cancel() + }else if (permissionMode == "everyone") return + else if (permissionMode == "admin"){ + if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){ + //no permissions + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) + return cancel() + }else return + }else{ + if (!instance.guild || !instance.member){ + //error + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) + return cancel() + } + const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) + if (!role){ + //error + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) + return cancel() + } + if (!role.members.has(instance.member.id)){ + //no permissions + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) + return cancel() + }else return + } + }), + new api.ODWorker("opendiscord:priority",0,async (instance,params,source,cancel) => { + const {guild,channel,user} = instance + if (!guild){ + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user})) + return cancel() + } + const ticket = opendiscord.tickets.get(channel.id) + if (!ticket || channel.isDMBased()){ + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user})) + return cancel() + } + //return when busy + if (ticket.get("opendiscord:busy").value){ + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user})) + return cancel() + } + + const scope = instance.options.getSubCommand() + if (!scope || (scope != "set" && scope != "get")) return + + if (scope == "set"){ + const priorityName = instance.options.getString("priority",true) + const reason = instance.options.getString("reason",false) + + const priority = opendiscord.priorities.getAll().find((lvl) => lvl.rawName === priorityName) ?? null + if (!priority){ + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:"Please provide a valid priority level.",customTitle:"Unknown Priority Level"})) + return cancel() + } + + //start changing ticket priority + await instance.defer(false) + await opendiscord.actions.get("opendiscord:update-ticket-priority").run(source,{guild,channel,user,ticket,newPriority:priority,sendMessage:false,reason}) + await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:priority-set").build(source,{guild,channel,user,ticket,priority,reason})) + + }else if (scope == "get"){ + const priority = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value) + await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:priority-get").build(source,{guild,channel,user,ticket,priority})) + } + }), + new api.ODWorker("opendiscord:logs",-1,(instance,params,source,cancel) => { + const scope = instance.options.getSubCommand() + opendiscord.log(instance.user.displayName+" used the 'priority "+scope+"' command!","info",[ + {key:"user",value:instance.user.username}, + {key:"userid",value:instance.user.id,hidden:true}, + {key:"channelid",value:instance.channel.id,hidden:true}, + {key:"method",value:source} + ]) + }) + ]) +} \ No newline at end of file diff --git a/src/core/api/defaults/action.ts b/src/core/api/defaults/action.ts index 7b0d01a..a3387ed 100644 --- a/src/core/api/defaults/action.ts +++ b/src/core/api/defaults/action.ts @@ -10,6 +10,7 @@ import { ODTicket, ODTicketClearFilter } from "../openticket/ticket" import { ODTranscriptCompiler, ODTranscriptCompilerCompileResult } from "../openticket/transcript" import { ODMessageBuildSentResult } from "../modules/builder" import { ODRole, ODRoleUpdateMode, ODRoleUpdateResult } from "../openticket/role" +import { ODPriorityLevel } from "../openticket/priority" /**## ODActionManagerIds_Default `interface` * This interface is a list of ids available in the `ODActionManager_Default` class. @@ -118,6 +119,12 @@ export interface ODActionManagerIds_Default { result:{}, workers:"opendiscord:update-ticket-topic"|"opendiscord:discord-logs"|"opendiscord:logs" }, + "opendiscord:update-ticket-priority":{ + source:"slash"|"text"|"other", + params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,newPriority:ODPriorityLevel,reason:string|null,sendMessage:boolean}, + result:{}, + workers:"opendiscord:update-ticket-priority"|"opendiscord:discord-logs"|"opendiscord:logs" + }, } /**## ODActionManager_Default `default_class` diff --git a/src/core/api/defaults/builder.ts b/src/core/api/defaults/builder.ts index 1702e6f..39e3b02 100644 --- a/src/core/api/defaults/builder.ts +++ b/src/core/api/defaults/builder.ts @@ -239,7 +239,7 @@ export interface ODEmbedManagerIds_Default { "opendiscord:error-option-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-option-unknown"}, "opendiscord:error-panel-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-panel-unknown"}, "opendiscord:error-not-in-guild":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-not-in-guild"}, - "opendiscord:error-channel-rename":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"opendiscord:error-channel-rename"}, + "opendiscord:error-channel-rename":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"ticket-priority"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"opendiscord:error-channel-rename"}, "opendiscord:error-ticket-busy":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-ticket-busy"}, "opendiscord:help-menu":{source:"text"|"slash"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"opendiscord:help-menu"}, @@ -375,7 +375,7 @@ export interface ODMessageManagerIds_Default { "opendiscord:error-option-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-option-unknown"}, "opendiscord:error-panel-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-panel-unknown"}, "opendiscord:error-not-in-guild":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-not-in-guild"}, - "opendiscord:error-channel-rename":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"opendiscord:error-channel-rename"}, + "opendiscord:error-channel-rename":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"ticket-priority"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"opendiscord:error-channel-rename"}, "opendiscord:error-ticket-busy":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-ticket-busy"}, "opendiscord:help-menu":{source:"slash"|"text"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"opendiscord:help-menu"}, diff --git a/src/core/api/defaults/event.ts b/src/core/api/defaults/event.ts index 169c757..3315d08 100644 --- a/src/core/api/defaults/event.ts +++ b/src/core/api/defaults/event.ts @@ -42,7 +42,7 @@ import { ODQuestionManager } from "../openticket/question" import { ODBlacklistManager } from "../openticket/blacklist" import { ODTranscriptManager_Default } from "../openticket/transcript" import { ODRole, ODRoleManager } from "../openticket/role" -import { ODPriorityManager_Default } from "../openticket/priority" +import { ODPriorityLevel, ODPriorityManager_Default } from "../openticket/priority" /**## ODEventIds_Default `interface` * This interface is a list of ids available in the `ODEvent_Default` class. @@ -202,7 +202,11 @@ export interface ODEventIds_Default { "afterTicketRenamed": ODEvent_Default<(ticket:ODTicket, renamer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid> "onTicketsClear": ODEvent_Default<(tickets:ODTicket[], clearer:discord.User, channel:discord.GuildTextBasedChannel, filter:ODTicketClearFilter) => ODPromiseVoid> "afterTicketsCleared": ODEvent_Default<(tickets:ODTicket[], clearer:discord.User, channel:discord.GuildTextBasedChannel, filter:ODTicketClearFilter) => ODPromiseVoid> - + "onTicketTopicChange": ODEvent_Default<(ticket:ODTicket, changer:discord.User, channel:discord.GuildTextBasedChannel, oldTopic:string, newTopic:string) => ODPromiseVoid> + "afterTicketTopicChanged": ODEvent_Default<(ticket:ODTicket, changer:discord.User, channel:discord.GuildTextBasedChannel, oldTopic:string, newTopic:string) => ODPromiseVoid> + "onTicketPriorityChange": ODEvent_Default<(ticket:ODTicket, changer:discord.User, channel:discord.GuildTextBasedChannel, oldPriority:ODPriorityLevel, newPriority:ODPriorityLevel) => ODPromiseVoid> + "afterTicketPriorityChanged": ODEvent_Default<(ticket:ODTicket, changer:discord.User, channel:discord.GuildTextBasedChannel, oldPriority:ODPriorityLevel, newPriority:ODPriorityLevel) => ODPromiseVoid> + //roles "onRoleLoad": ODEvent_Default<(roles:ODRoleManager) => ODPromiseVoid> "afterRolesLoaded": ODEvent_Default<(roles:ODRoleManager) => ODPromiseVoid> diff --git a/src/core/api/defaults/responder.ts b/src/core/api/defaults/responder.ts index d445249..6023033 100644 --- a/src/core/api/defaults/responder.ts +++ b/src/core/api/defaults/responder.ts @@ -45,6 +45,7 @@ export interface ODCommandResponderManagerIds_Default { "opendiscord:remove":{source:"slash"|"text",params:{},workers:"opendiscord:permissions"|"opendiscord:remove"|"opendiscord:logs"}, "opendiscord:clear":{source:"slash"|"text",params:{},workers:"opendiscord:permissions"|"opendiscord:clear"|"opendiscord:logs"}, "opendiscord:topic":{source:"slash"|"text",params:{},workers:"opendiscord:permissions"|"opendiscord:topic"|"opendiscord:logs"}, + "opendiscord:priority":{source:"slash"|"text",params:{},workers:"opendiscord:permissions"|"opendiscord:priority"|"opendiscord:logs"}, "opendiscord:autoclose":{source:"slash"|"text",params:{},workers:"opendiscord:permissions"|"opendiscord:autoclose"|"opendiscord:logs"}, "opendiscord:autodelete":{source:"slash"|"text",params:{},workers:"opendiscord:permissions"|"opendiscord:autodelete"|"opendiscord:logs"}, diff --git a/src/core/api/openticket/priority.ts b/src/core/api/openticket/priority.ts index 300f61d..90ea38a 100644 --- a/src/core/api/openticket/priority.ts +++ b/src/core/api/openticket/priority.ts @@ -20,6 +20,15 @@ export class ODPriorityManager extends ODManager { super(debug,"priority") this.#debug = debug } + + /**Get an `ODPriorityLevel` from the priority level value. Returns a dummy value when the level doesn't exist. */ + getFromPriorityLevel(level:number){ + return this.getAll().find((lvl) => lvl.priority === level) ?? new ODPriorityLevel("opendiscord:unknown",0,"unknown","UNKNOWN_PRIORITY","🚫","🚫") + } + /**List the available priority levels. */ + listAvailableLevels(){ + return this.getAll().map((lvl) => lvl.priority) + } } /**## ODPriorityManagerIds `type` diff --git a/src/core/startup/init.ts b/src/core/startup/init.ts index 6d1478d..8287218 100644 --- a/src/core/startup/init.ts +++ b/src/core/startup/init.ts @@ -122,6 +122,10 @@ export interface ODUtilities { * Get a human readable ordinal number (e.g. 1st, 2nd, 3rd, 4th, ...) from a Javascript number. */ ordinalNumber(num:number): string, + /**## trimEmojis `utility function` + * Trim/remove all emoji's from a Javascript string. + */ + trimEmojis(text:string): string, } /**## ODVersionMigration `utility class` @@ -268,5 +272,8 @@ export const utilities: ODUtilities = { if (dec === 2) return i+'nd' if (dec === 3) return i+'rd' return i+'th' - } + }, + trimEmojis(text){ + return text.replace(/(\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?(?:\u200D\p{Extended_Pictographic}(?:\uFE0F|\uFE0E)?)*)/gu,"") + }, } \ No newline at end of file diff --git a/src/data/framework/eventLoader.ts b/src/data/framework/eventLoader.ts index c7c0dd6..257aa5e 100644 --- a/src/data/framework/eventLoader.ts +++ b/src/data/framework/eventLoader.ts @@ -155,6 +155,10 @@ export const loadAllEvents = () => { "afterTicketRenamed", "onTicketsClear", "afterTicketsCleared", + "onTicketTopicChange", + "afterTicketTopicChanged", + "onTicketPriorityChange", + "afterTicketPriorityChanged", //roles "onRoleLoad", diff --git a/src/index.ts b/src/index.ts index 0170f4c..39f29fc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -672,6 +672,7 @@ const main = async () => { await (await import("./commands/autoclose.js")).registerCommandResponders() await (await import("./commands/autodelete.js")).registerCommandResponders() await (await import("./commands/topic.js")).registerCommandResponders() + await (await import("./commands/priority.js")).registerCommandResponders() } await opendiscord.events.get("onCommandResponderLoad").emit([opendiscord.responders.commands,opendiscord.responders,opendiscord.actions]) await opendiscord.events.get("afterCommandRespondersLoaded").emit([opendiscord.responders.commands,opendiscord.responders,opendiscord.actions]) @@ -759,6 +760,7 @@ const main = async () => { await (await import("./actions/reactionRole.js")).registerActions() await (await import("./actions/clearTickets.js")).registerActions() await (await import("./actions/updateTicketTopic.js")).registerActions() + await (await import("./actions/updateTicketPriority.js")).registerActions() } await opendiscord.events.get("onActionLoad").emit([opendiscord.actions]) await opendiscord.events.get("afterActionsLoaded").emit([opendiscord.actions])