From ca5faa3365682b2d359457fa90b781059a9a135f Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Fri, 15 May 2026 22:01:19 +0200 Subject: [PATCH] (v4.2.0) Reworked ticket channel name logic --- src/actions/calculateTicketName.ts | 30 +++++++++++++++++++++++++++ src/actions/createTicket.ts | 10 ++++++--- src/actions/moveTicket.ts | 32 ++++++++++++++--------------- src/actions/pinTicket.ts | 28 ++++++++++++++----------- src/actions/renameTicket.ts | 29 ++++++++++++++++---------- src/actions/transferTicket.ts | 32 ++++++++++++++--------------- src/actions/unpinTicket.ts | 28 ++++++++++++++----------- src/actions/updateTicketPriority.ts | 28 ++++++++++++++----------- src/core/api/ticket.ts | 1 + src/core/mappings/action.ts | 6 ++++++ src/index.ts | 1 + 11 files changed, 143 insertions(+), 82 deletions(-) create mode 100644 src/actions/calculateTicketName.ts diff --git a/src/actions/calculateTicketName.ts b/src/actions/calculateTicketName.ts new file mode 100644 index 0000000..864afb6 --- /dev/null +++ b/src/actions/calculateTicketName.ts @@ -0,0 +1,30 @@ +/////////////////////////////////////// +//CALCULATE TICKET NAME SYSTEM +/////////////////////////////////////// +import {opendiscord, api, utilities} from "../index.js" +import * as discord from "discord.js" + +const generalConfig = opendiscord.configs.get("opendiscord:general") + +export async function registerActions(){ + opendiscord.actions.add(new api.ODAction("opendiscord:calculate-ticket-name")) + opendiscord.actions.get("opendiscord:calculate-ticket-name").workers.add([ + new api.ODWorker("opendiscord:calculate-ticket-name",0,async (instance,params,origin,cancel) => { + const {guild,user,channel,option,ticket,currentChannelName} = params + + //calculate base channel name + const channelPrefix = option.get("opendiscord:channel-prefix").value + const channelSuffix = (ticket) ? ticket.get("opendiscord:channel-suffix").value : (await opendiscord.options.suffix.getSuffixFromOption(option,user,guild) ?? "unknown") + const channelRenamed = (ticket && ticket.exists("opendiscord:channel-renamed")) ? ticket.get("opendiscord:channel-renamed").value : null + const baseChannelName = (channelRenamed) ? channelRenamed : channelPrefix+channelSuffix + + //calculate status emojis + const pinEmoji = (ticket && ticket.get("opendiscord:pinned").value) ? generalConfig.data.system.pinEmoji : "" + const priorityEmoji = (ticket) ? (opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? "") : "" + + instance.newChannelName = pinEmoji+priorityEmoji+baseChannelName + instance.newChannelSuffix = channelSuffix + instance.shouldChangeName = (instance.newChannelName !== currentChannelName) + }) + ]) +} \ No newline at end of file diff --git a/src/actions/createTicket.ts b/src/actions/createTicket.ts index e87a285..f986260 100644 --- a/src/actions/createTicket.ts +++ b/src/actions/createTicket.ts @@ -18,11 +18,14 @@ export async function registerActions(){ await opendiscord.events.get("onTicketChannelCreation").emit([option,user]) //get channel properties - const channelPrefix = option.get("opendiscord:channel-prefix").value const channelTopicText = option.get("opendiscord:channel-topic").value - const channelSuffix = await opendiscord.options.suffix.getSuffixFromOption(option,user,guild) - const channelName = channelPrefix+channelSuffix + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("create-ticket",{guild,user,option,channel:null,ticket:null,currentChannelName:null}) + if (!channelNameResult) return opendiscord.log("Ticket Creation Error: Unable to calculate ticket name.","error") + const channelName = (channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined") ? channelNameResult.newChannelName : "ot-unnamed-ticket" + const channelSuffix = (typeof channelNameResult.newChannelSuffix !== "undefined") ? channelNameResult.newChannelSuffix : "unknown" + //calculate category const categoryResult = await opendiscord.actions.get("opendiscord:calculate-ticket-category").run("create-ticket",{guild,user,option,channel:null,ticket:null,currentCategoryId:null}) if (!categoryResult) return opendiscord.log("Ticket Creation Error: Unable to calculate ticket category.","error") @@ -118,6 +121,7 @@ export async function registerActions(){ new api.ODTicketData("opendiscord:ticket-message",null), new api.ODTicketData("opendiscord:participants",participants), new api.ODTicketData("opendiscord:channel-suffix",channelSuffix), + new api.ODTicketData("opendiscord:channel-renamed",null), new api.ODTicketData("opendiscord:previous-creators",[]), new api.ODTicketData("opendiscord:open",true), diff --git a/src/actions/moveTicket.ts b/src/actions/moveTicket.ts index a31308e..dafcd46 100644 --- a/src/actions/moveTicket.ts +++ b/src/actions/moveTicket.ts @@ -20,10 +20,6 @@ export async function registerActions(){ await opendiscord.statistics.get("opendiscord:global").setStat("opendiscord:tickets-moved",1,"increase") await opendiscord.statistics.get("opendiscord:user").setStat("opendiscord:tickets-moved",user.id,1,"increase") - //get new channel properties - const channelPrefix = ticket.option.get("opendiscord:channel-prefix").value - const channelSuffix = ticket.get("opendiscord:channel-suffix").value - //calculate & update category const categoryResult = await opendiscord.actions.get("opendiscord:calculate-ticket-category").run("move-ticket",{guild,user,option:ticket.option,channel,ticket,currentCategoryId:channel.parentId}) if (categoryResult && categoryResult.shouldChangeCategory && typeof categoryResult.newCategoryId !== "undefined" && typeof categoryResult.newCategoryMode !== "undefined" && typeof categoryResult.newCategory !== "undefined"){ @@ -109,18 +105,22 @@ export async function registerActions(){ ticket.get("opendiscord:participants").value = participants ticket.get("opendiscord:participants").refreshDatabase() - //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(channelPrefix+channelSuffix) - try{ - await utilities.timedAwait(channel.setName(newName),2500,(err) => { - opendiscord.log("Failed to rename channel on ticket move","error") - }) - }catch(err){ - await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:newName})).message) + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("move-ticket",{guild,user,option:ticket.option,channel,ticket,currentChannelName:channel.name}) + if (channelNameResult && channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined"){ + const originalName = channel.name + const newName = channelNameResult.newChannelName + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket move","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while moving ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName})).message) + } } //update ticket message diff --git a/src/actions/pinTicket.ts b/src/actions/pinTicket.ts index a55484e..9590f4e 100644 --- a/src/actions/pinTicket.ts +++ b/src/actions/pinTicket.ts @@ -31,18 +31,22 @@ export async function registerActions(){ await channel.setPosition(0,{reason:"Ticket Pinned!"}) } - //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(channel.name) - try{ - await utilities.timedAwait(channel.setName(newName),2500,(err) => { - opendiscord.log("Failed to rename channel on ticket pin","error") - }) - }catch(err){ - await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-pin",{guild,channel,user,originalName,newName})).message) + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("pin-ticket",{guild,user,option:ticket.option,channel,ticket,currentChannelName:channel.name}) + if (channelNameResult && channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined"){ + const originalName = channel.name + const newName = channelNameResult.newChannelName + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket pin","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while pinning ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-pin",{guild,channel,user,originalName,newName})).message) + } } //update ticket message diff --git a/src/actions/renameTicket.ts b/src/actions/renameTicket.ts index 422a987..1213842 100644 --- a/src/actions/renameTicket.ts +++ b/src/actions/renameTicket.ts @@ -15,18 +15,25 @@ export async function registerActions(){ 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 ?? "" + //update ticket + ticket.get("opendiscord:channel-renamed").value = data - const originalName = channel.name - const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(data) - try{ - await utilities.timedAwait(channel.setName(newName),2500,(err) => { - opendiscord.log("Failed to rename channel on ticket rename","error") - }) - }catch(err){ - await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-rename",{guild,channel,user,originalName,newName:data})).message) + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("rename-ticket",{guild,user,option:ticket.option,channel,ticket,currentChannelName:channel.name}) + if (channelNameResult && channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined"){ + const originalName = channel.name + const newName = channelNameResult.newChannelName + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket rename","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while renaming ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-rename",{guild,channel,user,originalName,newName})).message) + } } //update ticket message diff --git a/src/actions/transferTicket.ts b/src/actions/transferTicket.ts index 0215ceb..218cc92 100644 --- a/src/actions/transferTicket.ts +++ b/src/actions/transferTicket.ts @@ -36,10 +36,6 @@ export async function registerActions(){ await opendiscord.statistics.get("opendiscord:global").setStat("opendiscord:tickets-transferred",1,"increase") await opendiscord.statistics.get("opendiscord:user").setStat("opendiscord:tickets-transferred",user.id,1,"increase") - //get new channel properties - const channelPrefix = ticket.option.get("opendiscord:channel-prefix").value - const channelSuffix = ticket.get("opendiscord:channel-suffix").value - //handle permissions const permissions: discord.OverwriteResolvable[] = [{ type:discord.OverwriteType.Role, @@ -93,18 +89,22 @@ export async function registerActions(){ opendiscord.log("Failed to reset channel permissions on ticket transfer!","error") } - //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(channelPrefix+channelSuffix) - try{ - await utilities.timedAwait(channel.setName(newName),2500,(err) => { - opendiscord.log("Failed to rename channel on ticket transfer","error") - }) - }catch(err){ - await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-transfer",{guild,channel,user,originalName,newName:newName})).message) + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("transfer-ticket",{guild,user,option:ticket.option,channel,ticket,currentChannelName:channel.name}) + if (channelNameResult && channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined"){ + const originalName = channel.name + const newName = channelNameResult.newChannelName + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket transfer","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while transferring ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-transfer",{guild,channel,user,originalName,newName})).message) + } } //update ticket message diff --git a/src/actions/unpinTicket.ts b/src/actions/unpinTicket.ts index 7cc2d06..62f0162 100644 --- a/src/actions/unpinTicket.ts +++ b/src/actions/unpinTicket.ts @@ -22,18 +22,22 @@ export async function registerActions(){ ticket.get("opendiscord:pinned-on").value = null 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 - 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) + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("unpin-ticket",{guild,user,option:ticket.option,channel,ticket,currentChannelName:channel.name}) + if (channelNameResult && channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined"){ + const originalName = channel.name + const newName = channelNameResult.newChannelName + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on ticket unpin","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while unpinning ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + 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 index 8642c8e..23de01f 100644 --- a/src/actions/updateTicketPriority.ts +++ b/src/actions/updateTicketPriority.ts @@ -20,18 +20,22 @@ export async function registerActions(){ 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) + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("priority-change",{guild,user,option:ticket.option,channel,ticket,currentChannelName:channel.name}) + if (channelNameResult && channelNameResult.shouldChangeName && typeof channelNameResult.newChannelName !== "undefined"){ + const originalName = channel.name + const newName = channelNameResult.newChannelName + try{ + await utilities.timedAwait(channel.setName(newName),2500,(err) => { + opendiscord.log("Failed to rename channel on priority change","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while updating ticket priority! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + 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 diff --git a/src/core/api/ticket.ts b/src/core/api/ticket.ts index f68adb5..be33d65 100644 --- a/src/core/api/ticket.ts +++ b/src/core/api/ticket.ts @@ -19,6 +19,7 @@ export interface ODTicketIdMappings extends ODTicketIdConstraint { "opendiscord:ticket-message":ODTicketData, "opendiscord:participants":ODTicketData<{type:"role"|"user",id:string}[]>, "opendiscord:channel-suffix":ODTicketData, + "opendiscord:channel-renamed":ODTicketData, "opendiscord:previous-creators":ODTicketData, "opendiscord:open":ODTicketData, diff --git a/src/core/mappings/action.ts b/src/core/mappings/action.ts index 8ef5780..b7a3478 100644 --- a/src/core/mappings/action.ts +++ b/src/core/mappings/action.ts @@ -134,6 +134,12 @@ export interface ODActionManagerIdMappings extends api.ODActionManagerIdConstrai result:{newCategoryId:string|null,newCategoryMode:string|null,newCategory:discord.CategoryChannel|null,shouldChangeCategory:boolean}, workers:"opendiscord:default-category"|"opendiscord:close-category"|"opendiscord:claim-category"|"opendiscord:backup-category" }, + "opendiscord:calculate-ticket-name":{ + origin:"create-ticket"|"close-ticket"|"reopen-ticket"|"claim-ticket"|"unclaim-ticket"|"move-ticket"|"pin-ticket"|"unpin-ticket"|"rename-ticket"|"transfer-ticket"|"priority-change"|"other", + params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel|null,user:discord.User,option:ODTicketOption,ticket:ODTicket|null,currentChannelName:string|null}, + result:{newChannelName:string,newChannelSuffix:string,shouldChangeName:boolean}, + workers:"opendiscord:calculate-ticket-name" + }, } ///////////////////////////// diff --git a/src/index.ts b/src/index.ts index f279efb..1a4752c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -783,6 +783,7 @@ const main = async () => { if (opendiscord.sharedFuses.getFuse("actionsLoading")){ await (await import("./actions/createTicketPermissions.js")).registerActions() await (await import("./actions/calculateTicketCategory.js")).registerActions() + await (await import("./actions/calculateTicketName.js")).registerActions() await (await import("./actions/createTranscript.js")).registerActions() await (await import("./actions/createTicket.js")).registerActions() await (await import("./actions/closeTicket.js")).registerActions()