From 58a6bcde45b5e60a2bf0d817b66ba522269d2b25 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Sun, 24 May 2026 19:48:46 +0200 Subject: [PATCH] (v4.2.0) Added priority dropdown --- src/actions/updateTicketPriority.ts | 3 ++ src/actions/updateTicketTopic.ts | 3 ++ src/builders/dropdowns.ts | 28 +++++++++++++++++- src/builders/messages.ts | 3 ++ src/commands/priority.ts | 45 +++++++++++++++++++++++++++++ src/core/api/priority.ts | 2 +- src/core/mappings/builder.ts | 1 + src/core/mappings/responder.ts | 1 + src/index.ts | 1 + 9 files changed, 85 insertions(+), 2 deletions(-) diff --git a/src/actions/updateTicketPriority.ts b/src/actions/updateTicketPriority.ts index 76be4ec..de3c041 100644 --- a/src/actions/updateTicketPriority.ts +++ b/src/actions/updateTicketPriority.ts @@ -46,6 +46,9 @@ export async function registerActions(){ //update channel topic await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null}) + + //update ticket message (no await) + openticketUtils.updateTicketMessage(guild,channel,user,ticket) }), new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,origin,cancel) => { const {guild,channel,user,ticket} = params diff --git a/src/actions/updateTicketTopic.ts b/src/actions/updateTicketTopic.ts index 207a5d7..15a6855 100644 --- a/src/actions/updateTicketTopic.ts +++ b/src/actions/updateTicketTopic.ts @@ -46,6 +46,9 @@ export async function registerActions(){ if (params.sendMessage && newTopic) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:topic-set").build(origin,{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]) + + //update ticket message (no await) + openticketUtils.updateTicketMessage(guild,channel,user,ticket) }), new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,origin,cancel) => { const {guild,channel,user,ticket} = params diff --git a/src/builders/dropdowns.ts b/src/builders/dropdowns.ts index 2bb2c04..91b99af 100644 --- a/src/builders/dropdowns.ts +++ b/src/builders/dropdowns.ts @@ -5,13 +5,14 @@ import {opendiscord, api, utilities} from "../index.js" import * as discord from "discord.js" const dropdowns = opendiscord.builders.dropdowns +const lang = opendiscord.languages export async function registerAllDropdowns(){ panelDropdowns() } const panelDropdowns = () => { - //TICKET OPTION + //PANEL DROPDOWN dropdowns.add(new api.ODDropdown("opendiscord:panel-dropdown")) dropdowns.get("opendiscord:panel-dropdown").workers.add( new api.ODWorker("opendiscord:panel-dropdown",0,async (instance,params) => { @@ -65,4 +66,29 @@ const panelDropdowns = () => { instance.setOptions(parsedOptions) }) ) + + //PRIORITY DROPDOWN + dropdowns.add(new api.ODDropdown("opendiscord:priority-dropdown")) + dropdowns.get("opendiscord:priority-dropdown").workers.add( + new api.ODWorker("opendiscord:priority-dropdown",0,async (instance,params) => { + const {ticket} = params + + const parsedOptions: api.ODDropdownData["options"] = opendiscord.priorities.getAll().sort((a,b) => b.priority-a.priority).map((prio) => ({ + label:prio.displayName, + emoji:prio.displayEmoji ?? undefined, + value:"od:select-priority|"+prio.rawName + })) + + const currentPriority = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value) + //TODO TRANSLATION!!! + const placeholder = (currentPriority.priority < 0) ? "Select priority level" : (lang.getTranslation("params.uppercase.priority")+": "+currentPriority.renderDisplayName()) + + instance.setCustomId("od:priority-dropdown") + instance.setType("string") + instance.setMaxValues(1) + instance.setMinValues(0) + instance.setPlaceholder(placeholder) + instance.setOptions(parsedOptions) + }) + ) } \ No newline at end of file diff --git a/src/builders/messages.ts b/src/builders/messages.ts index 7d6665a..e4637ae 100644 --- a/src/builders/messages.ts +++ b/src/builders/messages.ts @@ -438,6 +438,9 @@ const ticketMessages = () => { } //enable ticket deletion if (generalConfig.data.ticketSystem.enableTicketDeleteButtons) instance.addComponent(await buttons.getSafe("opendiscord:delete-ticket").build("ticket-message",{guild,channel,user,ticket})) + + //add priority dropdown + if (generalConfig.data.ticketSystem.askPriorityOnTicketCreation) instance.addComponent(await dropdowns.getSafe("opendiscord:priority-dropdown").build(origin,{guild,channel,user,ticket})) }), new api.ODWorker("opendiscord:ticket-message-disable-components",2,async (instance,params,origin) => { const {ticket} = params diff --git a/src/commands/priority.ts b/src/commands/priority.ts index 2125e41..771c3c5 100644 --- a/src/commands/priority.ts +++ b/src/commands/priority.ts @@ -60,4 +60,49 @@ export async function registerCommandResponders(){ ]) }) ]) +} + +export async function registerDropdownResponders(){ + //PRIORITY DROPDOWN RESPONDER + opendiscord.responders.dropdowns.add(new api.ODDropdownResponder("opendiscord:priority-dropdown",/^od:priority-dropdown/)) + opendiscord.responders.dropdowns.get("opendiscord:priority-dropdown").workers.add( + new api.ODWorker("opendiscord:priority-dropdown",0,async (instance,params,origin,cancel) => { + const {guild,channel,user,message} = instance + + const match = /^od:select-priority\|([^|]+)/.exec(instance.values.getStringValues()[0]) + if (!match) return + const priorityName = match[1] + + 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 select a valid priority level.",customTitle:"Unknown Priority Level"})) + return cancel() + } + + //responder checks + const hasPerms = await openticketUtils.replyHasPermissions(instance,origin,"priority") + if (!hasPerms) return cancel() + + const isInGuild = await openticketUtils.replyIsInGuild(instance,origin) + if (!isInGuild || !guild || channel.isDMBased()) return cancel() + + const state = await openticketUtils.replyInteractiveMessageState(instance,origin,channel,message,"/priority") + if (!state) return cancel() + + const ticket = await openticketUtils.replyIsTicket(instance,origin) + if (!ticket) return cancel() + + const isAvailable = await openticketUtils.replyTicketIsAvailable(instance,origin,ticket) + if (!isAvailable) return cancel() + + //fetch state details + const originalMsgOrigin = state.data.messageOrigin + const originalMsgType = state.data.messageType + + //start changing ticket priority + await instance.defer("reply",false) + await opendiscord.actions.get("opendiscord:update-ticket-priority").run("other",{guild,channel,user,ticket,newPriority:priority,sendMessage:false,reason:null}) + await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:priority-set").build("other",{guild,channel,user,ticket,priority,reason:null})) + }) + ) } \ No newline at end of file diff --git a/src/core/api/priority.ts b/src/core/api/priority.ts index 0ad414b..1b4dc91 100644 --- a/src/core/api/priority.ts +++ b/src/core/api/priority.ts @@ -36,7 +36,7 @@ export class ODPriorityManager lvl.priority === level) ?? new ODPriorityLevel("opendiscord:unknown",0,"unknown","UNKNOWN_PRIORITY","🚫","🚫") + return this.getAll().find((lvl) => lvl.priority === level) ?? new ODPriorityLevel("opendiscord:unknown",-1,"unknown","UNKNOWN_PRIORITY","🚫","🚫") } /**List the available priority levels. */ listAvailableLevels(){ diff --git a/src/core/mappings/builder.ts b/src/core/mappings/builder.ts index 0d409d1..f1dded3 100644 --- a/src/core/mappings/builder.ts +++ b/src/core/mappings/builder.ts @@ -53,6 +53,7 @@ export interface ODButtonManagerIdMappings extends api.ODButtonManagerIdConstrai */ export interface ODDropdownManagerIdMappings extends api.ODDropdownManagerIdConstraint { "opendiscord:panel-dropdown":{origin:"slash"|"text"|"sub-panel"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel,options:(ODTicketOption|ODRoleOption|ODSubPanelOption)[]},workers:"opendiscord:panel-dropdown"} + "opendiscord:priority-dropdown":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:priority-dropdown"} } /**## ODFileManagerIdMappings `interface` diff --git a/src/core/mappings/responder.ts b/src/core/mappings/responder.ts index 82c88b3..dc758fb 100644 --- a/src/core/mappings/responder.ts +++ b/src/core/mappings/responder.ts @@ -69,6 +69,7 @@ export interface ODButtonResponderManagerIdMappings extends api.ODButtonResponde */ export interface ODDropdownResponderManagerIdMappings extends api.ODDropdownResponderManagerIdConstraint { "opendiscord:panel-dropdown":{origin:"dropdown",params:{},workers:"opendiscord:dropdown-ticket"|"opendiscord:dropdown-role"|"opendiscord:dropdown-subpanel"}, + "opendiscord:priority-dropdown":{origin:"dropdown",params:{},workers:"opendiscord:priority-dropdown"}, } /**## ODModalResponderManagerIdMappings `interface` diff --git a/src/index.ts b/src/index.ts index 89d8697..29d6bb2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -744,6 +744,7 @@ const main = async () => { opendiscord.log("Loading dropdown responders...","system") if (opendiscord.sharedFuses.getFuse("dropdownRespondersLoading")){ await (await import("./commands/panel.js")).registerDropdownResponders() + await (await import("./commands/priority.js")).registerDropdownResponders() } await opendiscord.events.get("onDropdownResponderLoad").emit([opendiscord.responders.dropdowns,opendiscord.responders,opendiscord.actions]) await opendiscord.events.get("afterDropdownRespondersLoaded").emit([opendiscord.responders.dropdowns,opendiscord.responders,opendiscord.actions])