diff --git a/config/general.jsonc b/config/general.jsonc index ec0c4ba..a5830b9 100644 --- a/config/general.jsonc +++ b/config/general.jsonc @@ -78,7 +78,7 @@ "alwaysShowReason":false, //Show reason even if none is provided "emojiStyle":"before", //The style of emoji's in embeds. Choices: before, after, double, disabled "pinEmoji":"📌", //Channel emoji of pinned tickets (Leave empty to disable) - "closeEmoji":"🔒", //Channel emoji of closed tickets (Leave empty to disable) + "closeEmoji":"", //Channel emoji of closed tickets (Leave empty to disable) "replyOnTicketCreation":true, //Reply with a msg when a ticket is created "replyOnReactionRole":true, //Reply with a msg when a reaction role is used diff --git a/src/actions/calculateTicketName.ts b/src/actions/calculateTicketName.ts index f6d1777..57930fc 100644 --- a/src/actions/calculateTicketName.ts +++ b/src/actions/calculateTicketName.ts @@ -20,9 +20,10 @@ export async function registerActions(){ //calculate status emojis const pinEmoji = (ticket && ticket.get("opendiscord:pinned").value) ? generalConfig.data.ticketSystem.pinEmoji : "" + const closeEmoji = (ticket && ticket.get("opendiscord:closed").value) ? generalConfig.data.ticketSystem.closeEmoji : "" const priorityEmoji = (ticket) ? (opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? "") : "" - instance.newChannelName = pinEmoji+priorityEmoji+baseChannelName + instance.newChannelName = pinEmoji+closeEmoji+priorityEmoji+baseChannelName instance.newChannelSuffix = channelSuffix instance.shouldChangeName = (instance.newChannelName !== currentChannelName) }) diff --git a/src/actions/closeTicket.ts b/src/actions/closeTicket.ts index 0c1e959..a151a2f 100644 --- a/src/actions/closeTicket.ts +++ b/src/actions/closeTicket.ts @@ -58,6 +58,25 @@ export async function registerActions(){ } } + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("close-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 close","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while closing ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-close",{guild,channel,user,originalName,newName})).message) + setTimeout(() => {if (sentMsg.deletable) sentMsg.delete()},7000) //autodelete error message + } + } + //update permissions (non-staff => readonly) const permissions: discord.OverwriteResolvable[] = [{ type:discord.OverwriteType.Role, diff --git a/src/actions/reopenTicket.ts b/src/actions/reopenTicket.ts index 75d06da..76c06b7 100644 --- a/src/actions/reopenTicket.ts +++ b/src/actions/reopenTicket.ts @@ -63,6 +63,25 @@ export async function registerActions(){ } } + //calculate channel name + const channelNameResult = await opendiscord.actions.get("opendiscord:calculate-ticket-name").run("reopen-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 reopen","error") + }) + }catch(err){ + opendiscord.log("Unable to rename channel while reopening ticket! Waiting until ratelimit expires...","warning",[ + {key:"oldName",value:originalName}, + {key:"newName",value:newName} + ]) + const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-reopen",{guild,channel,user,originalName,newName})).message) + setTimeout(() => {if (sentMsg.deletable) sentMsg.delete()},7000) //autodelete error message + } + } + //update permissions const permissions: discord.OverwriteResolvable[] = [{ type:discord.OverwriteType.Role, diff --git a/src/builders/embeds.ts b/src/builders/embeds.ts index c5651fd..d3ce6a4 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,origin) => { const {channel,user,originalName,newName} = params - const method = (origin == "ticket-move" || origin == "ticket-pin" || origin == "ticket-rename" || origin == "ticket-unpin" || origin == "ticket-priority" || origin == "ticket-transfer") ? origin : getMethodFromOrigin(origin) + const method = (origin == "ticket-move" || origin == "ticket-pin" || origin == "ticket-close" || origin == "ticket-reopen" || origin == "ticket-rename" || origin == "ticket-unpin" || origin == "ticket-priority" || origin == "ticket-transfer") ? origin : getMethodFromOrigin(origin) instance.setColor(generalConfig.data.ticketSystem.useRedErrorEmbeds ? "Red" : generalConfig.data.mainColor) instance.setTitle(utilities.emojiTitle("❌",lang.getTranslation("errors.titles.channelRename"))) diff --git a/src/core/cli/quickSetup.ts b/src/core/cli/quickSetup.ts index 3b3b629..803dc6b 100644 --- a/src/core/cli/quickSetup.ts +++ b/src/core/cli/quickSetup.ts @@ -1253,7 +1253,7 @@ async function saveQuickSetupConfig(){ alwaysShowReason:false, emojiStyle:quickSetupStorage.emojiStyle ?? "before", pinEmoji:"📌", - closeEmoji:"🔒", + closeEmoji:"", replyOnTicketCreation:true, replyOnReactionRole:true, diff --git a/src/core/mappings/builder.ts b/src/core/mappings/builder.ts index 311b5d7..a4a2584 100644 --- a/src/core/mappings/builder.ts +++ b/src/core/mappings/builder.ts @@ -81,7 +81,7 @@ export interface ODEmbedManagerIdMappings extends api.ODEmbedManagerIdConstraint "opendiscord:error-option-unknown":{origin:"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":{origin:"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":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-not-in-guild"}, - "opendiscord:error-channel-rename":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"ticket-priority"|"ticket-transfer"|"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":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-close"|"ticket-reopen"|"ticket-rename"|"ticket-move"|"ticket-priority"|"ticket-transfer"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"opendiscord:error-channel-rename"}, "opendiscord:error-channel-category":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-create"|"ticket-close"|"ticket-reopen"|"ticket-claim"|"ticket-unclaim"|"ticket-move"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalCategory:string,newCategory:string},workers:"opendiscord:error-channel-category"}, "opendiscord:error-ticket-busy":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-ticket-busy"}, @@ -164,7 +164,7 @@ export interface ODMessageManagerIdMappings extends api.ODMessageManagerIdConstr "opendiscord:error-option-unknown":{origin:"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":{origin:"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":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-not-in-guild"}, - "opendiscord:error-channel-rename":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"ticket-priority"|"ticket-transfer"|"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":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-close"|"ticket-reopen"|"ticket-rename"|"ticket-move"|"ticket-priority"|"ticket-transfer"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"opendiscord:error-channel-rename"}, "opendiscord:error-channel-category":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-create"|"ticket-close"|"ticket-reopen"|"ticket-claim"|"ticket-unclaim"|"ticket-move"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalCategory:string,newCategory:string},workers:"opendiscord:error-channel-category"}, "opendiscord:error-ticket-busy":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"opendiscord:error-ticket-busy"}, diff --git a/src/core/startup/migration.ts b/src/core/startup/migration.ts index 4d1b9bf..9e6cd68 100644 --- a/src/core/startup/migration.ts +++ b/src/core/startup/migration.ts @@ -180,7 +180,7 @@ export const migrations = [ if (!generalConfig.data["system"]) throw new api.ODSystemError("Couldn't find general.jsonc 'system' category.") generalConfig.data.ticketSystem = generalConfig.data["system"] - generalConfig.data.ticketSystem.closeEmoji = "🔒" + generalConfig.data.ticketSystem.closeEmoji = "" generalConfig.data.ticketSystem.askPriorityOnTicketCreation = true generalConfig.data.ticketSystem.enableCreateTicketForOtherUser = true delete generalConfig.data["system"] diff --git a/src/index.ts b/src/index.ts index f6afe08..68417bc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -525,12 +525,16 @@ const main = async () => { await opendiscord.events.get("onStateLoad").emit([opendiscord.states]) await opendiscord.events.get("afterStatesLoaded").emit([opendiscord.states]) - //init states - await opendiscord.events.get("onStateInit").emit([opendiscord.states]) - if (opendiscord.sharedFuses.getFuse("stateInitiating")){ - await opendiscord.states.init() - await opendiscord.events.get("afterStatesInitiated").emit([opendiscord.states]) - } + //init states (async to prevent blocking startup) + utilities.runAsync(async () => { + opendiscord.log("Initiating states...","system") + await opendiscord.events.get("onStateInit").emit([opendiscord.states]) + if (opendiscord.sharedFuses.getFuse("stateInitiating")){ + await opendiscord.states.init() + await opendiscord.events.get("afterStatesInitiated").emit([opendiscord.states]) + } + opendiscord.log("Message states ready!","info") + }) //plugin loading before managers await opendiscord.events.get("onPluginBeforeManagerLoad").emit([])