Added all the new config variables for v4.1.0!

This commit is contained in:
DJj123dj
2025-08-05 10:42:15 +02:00
parent adc2433216
commit 549c161830
18 changed files with 455 additions and 86 deletions
+51 -20
View File
@@ -5,7 +5,7 @@
"version":"open-ticket-v4.0.7" "version":"open-ticket-v4.0.7"
}, },
"token":"your bot token here! (or leave empty when using 'tokenFromENV')", "token":"insert your bot token here! (or leave empty when using 'tokenFromENV')",
"tokenFromENV":false, "tokenFromENV":false,
"mainColor":"#f8ba00", "mainColor":"#f8ba00",
@@ -20,21 +20,35 @@
"status":{ "status":{
"enabled":true, "enabled":true,
"type":"listening OR watching OR playing OR custom", "type":"listening OR watching OR playing OR custom",
"mode":"online OR invisible OR idle OR dnd",
"text":"/help", "text":"/help",
"status":"online OR invisible OR idle OR dnd" "state":"(additional text or leave empty)"
}, },
"system":{ "system":{
"removeParticipantsOnClose":false,
"replyOnTicketCreation":true,
"replyOnReactionRole":true,
"useTranslatedConfigChecker":true,
"preferSlashOverText":true, "preferSlashOverText":true,
"sendErrorOnUnknownCommand":true, "sendErrorOnUnknownCommand":true,
"questionFieldsInCodeBlock":true, "questionFieldsInCodeBlock":true,
"displayFieldsWithQuestions":false,
"showGlobalAdminsInPanelRoles":false,
"disableVerifyBars":false, "disableVerifyBars":false,
"useRedErrorEmbeds":true, "useRedErrorEmbeds":true,
"alwaysShowReason":false,
"emojiStyle":"before (OR after OR double OR disabled)", "emojiStyle":"before (OR after OR double OR disabled)",
"pinEmoji":"📌",
"replyOnTicketCreation":true,
"replyOnReactionRole":true,
"showPreAutocloseWarning":false,
"askPriorityOnTicketCreation":false,
"removeParticipantsOnClose":false,
"disableAutocloseAfterReopen":true,
"autodeleteRequiresClosedTicket":true,
"adminOnlyDeleteWithoutTranscript":true,
"allowCloseBeforeMessage":false,
"allowCloseBeforeAdminMessage":true,
"useTranslatedConfigChecker":true,
"pinFirstTicketMessage":false,
"enableTicketClaimButtons":true, "enableTicketClaimButtons":true,
"enableTicketCloseButtons":true, "enableTicketCloseButtons":true,
@@ -54,6 +68,18 @@
"userMaximum":3 "userMaximum":3
}, },
"channelTopic":{
"showOptionName":true,
"showOptionDescription":false,
"showOptionTopic":true,
"showClosed":true,
"showClaimed":false,
"showPinned":false,
"showPriority":false,
"showCreator":false,
"showParticipants":false
},
"permissions":{ "permissions":{
"help":"everyone (OR admin OR none OR role id)", "help":"everyone (OR admin OR none OR role id)",
"panel":"admin (OR everyone OR none OR role id)", "panel":"admin (OR everyone OR none OR role id)",
@@ -73,23 +99,28 @@
"stats":"everyone (OR admin OR none OR role id)", "stats":"everyone (OR admin OR none OR role id)",
"clear":"admin (OR everyone OR none OR role id)", "clear":"admin (OR everyone OR none OR role id)",
"autoclose":"admin (OR everyone OR none OR role id)", "autoclose":"admin (OR everyone OR none OR role id)",
"autodelete":"admin (OR everyone OR none OR role id)" "autodelete":"admin (OR everyone OR none OR role id)",
"transfer":"admin (OR everyone OR none OR role id)",
"topic":"admin (OR everyone OR none OR role id)",
"priority":"admin (OR everyone OR none OR role id)"
}, },
"messages":{ "messages":{
"creation":{"dm":false, "logs":true}, "creation":{"dm":false,"logs":true},
"closing":{"dm":false, "logs":true}, "closing":{"dm":false,"logs":true},
"deleting":{"dm":false, "logs":true}, "deleting":{"dm":false,"logs":true},
"reopening":{"dm":false, "logs":true}, "reopening":{"dm":false,"logs":true},
"claiming":{"dm":false, "logs":true}, "claiming":{"dm":false,"logs":true},
"pinning":{"dm":false, "logs":true}, "pinning":{"dm":false,"logs":true},
"adding":{"dm":false, "logs":true}, "adding":{"dm":false,"logs":true},
"removing":{"dm":false, "logs":true}, "removing":{"dm":false,"logs":true},
"renaming":{"dm":false, "logs":true}, "renaming":{"dm":false,"logs":true},
"moving":{"dm":false, "logs":true}, "moving":{"dm":false,"logs":true},
"blacklisting":{"dm":false, "logs":true}, "blacklisting":{"dm":false,"logs":true},
"roleAdding":{"dm":false, "logs":true}, "transferring":{"dm":false,"logs":true},
"roleRemoving":{"dm":false, "logs":true} "topicChange":{"dm":false,"logs":true},
"priorityChange":{"dm":false,"logs":true},
"reactionRole":{"dm":false,"logs":true}
} }
} }
} }
+5 -1
View File
@@ -25,7 +25,7 @@
"claimedCategory":[ "claimedCategory":[
{"user":"user id","category":"category id"} {"user":"user id","category":"category id"}
], ],
"description":"This is a question ticket (or leave empty)" "topic":"This is the topic of this ticket channel and is visible to everyone! (or leave empty)"
}, },
"dmMessage":{ "dmMessage":{
@@ -87,6 +87,10 @@
"enabled":false, "enabled":false,
"globalMaximum":20, "globalMaximum":20,
"userMaximum":3 "userMaximum":3
},
"slowMode":{
"enabled":false,
"slowModeSeconds":20
} }
}, },
{ {
+1 -1
View File
@@ -14,7 +14,7 @@ process.argv.push(...flags)
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║ ██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║ ╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
v4.0.7 - Made by DJj123dj & Contributors v4.1.0 - Made by DJj123dj & Contributors
Discord: https://discord.dj-dj.be Discord: https://discord.dj-dj.be
Docs: https://otdocs.dj-dj.be Docs: https://otdocs.dj-dj.be
+11 -3
View File
@@ -19,7 +19,7 @@ export const registerActions = async () => {
const channelPrefix = option.get("opendiscord:channel-prefix").value const channelPrefix = option.get("opendiscord:channel-prefix").value
const channelCategory = option.get("opendiscord:channel-category").value const channelCategory = option.get("opendiscord:channel-category").value
const channelBackupCategory = option.get("opendiscord:channel-category-backup").value const channelBackupCategory = option.get("opendiscord:channel-category-backup").value
const channelDescription = option.get("opendiscord:channel-description").value const channelTopic = option.get("opendiscord:channel-topic").value
const channelSuffix = await opendiscord.options.suffix.getSuffixFromOption(option,user) const channelSuffix = await opendiscord.options.suffix.getSuffixFromOption(option,user)
const channelName = channelPrefix+channelSuffix const channelName = channelPrefix+channelSuffix
@@ -108,7 +108,7 @@ export const registerActions = async () => {
type:discord.ChannelType.GuildText, type:discord.ChannelType.GuildText,
name:channelName, name:channelName,
nsfw:false, nsfw:false,
topic:channelDescription, topic:channelTopic,
parent:category, parent:category,
reason:"Ticket Created By "+user.displayName, reason:"Ticket Created By "+user.displayName,
permissionOverwrites:permissions permissionOverwrites:permissions
@@ -131,6 +131,7 @@ export const registerActions = async () => {
new api.ODTicketData("opendiscord:ticket-message",null), new api.ODTicketData("opendiscord:ticket-message",null),
new api.ODTicketData("opendiscord:participants",participants), new api.ODTicketData("opendiscord:participants",participants),
new api.ODTicketData("opendiscord:channel-suffix",channelSuffix), new api.ODTicketData("opendiscord:channel-suffix",channelSuffix),
new api.ODTicketData("opendiscord:previous-creators",[]),
new api.ODTicketData("opendiscord:open",true), new api.ODTicketData("opendiscord:open",true),
new api.ODTicketData("opendiscord:opened-by",user.id), new api.ODTicketData("opendiscord:opened-by",user.id),
@@ -138,6 +139,9 @@ export const registerActions = async () => {
new api.ODTicketData("opendiscord:closed",false), new api.ODTicketData("opendiscord:closed",false),
new api.ODTicketData("opendiscord:closed-by",null), new api.ODTicketData("opendiscord:closed-by",null),
new api.ODTicketData("opendiscord:closed-on",null), new api.ODTicketData("opendiscord:closed-on",null),
new api.ODTicketData("opendiscord:reopened",false),
new api.ODTicketData("opendiscord:reopened-by",null),
new api.ODTicketData("opendiscord:reopened-on",null),
new api.ODTicketData("opendiscord:claimed",false), new api.ODTicketData("opendiscord:claimed",false),
new api.ODTicketData("opendiscord:claimed-by",null), new api.ODTicketData("opendiscord:claimed-by",null),
new api.ODTicketData("opendiscord:claimed-on",null), new api.ODTicketData("opendiscord:claimed-on",null),
@@ -155,7 +159,11 @@ export const registerActions = async () => {
new api.ODTicketData("opendiscord:autodelete-enabled",option.get("opendiscord:autodelete-enable-days").value), new api.ODTicketData("opendiscord:autodelete-enabled",option.get("opendiscord:autodelete-enable-days").value),
new api.ODTicketData("opendiscord:autodelete-days",(option.get("opendiscord:autodelete-enable-days").value ? option.get("opendiscord:autodelete-days").value : 0)), new api.ODTicketData("opendiscord:autodelete-days",(option.get("opendiscord:autodelete-enable-days").value ? option.get("opendiscord:autodelete-days").value : 0)),
new api.ODTicketData("opendiscord:answers",answers) new api.ODTicketData("opendiscord:answers",answers),
new api.ODTicketData("opendiscord:priority",-1),
new api.ODTicketData("opendiscord:topic",option.get("opendiscord:channel-topic").value),
new api.ODTicketData("opendiscord:message-sent",false),
new api.ODTicketData("opendiscord:admin-message-sent",false),
]) ])
//manage stats //manage stats
+2 -2
View File
@@ -28,7 +28,7 @@ export const registerActions = async () => {
const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id) const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id)
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value
const channelDescription = ticket.option.get("opendiscord:channel-description").value const channelTopic = ticket.option.get("opendiscord:channel-topic").value
const channelName = channelPrefix+channelSuffix const channelName = channelPrefix+channelSuffix
//handle category //handle category
@@ -164,7 +164,7 @@ export const registerActions = async () => {
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:channelName})).message) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:channelName})).message)
} }
try{ try{
if (channel.type == discord.ChannelType.GuildText) channel.setTopic(channelDescription) if (channel.type == discord.ChannelType.GuildText) channel.setTopic(channelTopic)
}catch{} }catch{}
//update ticket message //update ticket message
+2 -2
View File
@@ -88,13 +88,13 @@ export const registerActions = async () => {
if (!instance.role || !instance.result) return if (!instance.role || !instance.result) return
//to logs //to logs
if (generalConfig.data.system.logs.enabled && (generalConfig.data.system.messages.roleAdding.logs || generalConfig.data.system.messages.roleRemoving.logs)){ if (generalConfig.data.system.logs.enabled && (generalConfig.data.system.messages.reactionRole.logs)){
const logChannel = opendiscord.posts.get("opendiscord:logs") const logChannel = opendiscord.posts.get("opendiscord:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-logs").build(source,{guild,user,role:instance.role,result:instance.result})) if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-logs").build(source,{guild,user,role:instance.role,result:instance.result}))
} }
//to dm //to dm
if (generalConfig.data.system.messages.roleAdding.dm || generalConfig.data.system.messages.roleRemoving.dm) await opendiscord.client.sendUserDm(user,await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-dm").build(source,{guild,user,role:instance.role,result:instance.result})) if (generalConfig.data.system.messages.reactionRole.dm) await opendiscord.client.sendUserDm(user,await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-dm").build(source,{guild,user,role:instance.role,result:instance.result}))
}), }),
new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => { new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => {
const {guild,user,option} = params const {guild,user,option} = params
+83 -17
View File
@@ -76,10 +76,12 @@ export interface ODJsonConfig_DefaultStatusType {
enabled:boolean, enabled:boolean,
/**The type of status (e.g. playing, listening, custom, ...) */ /**The type of status (e.g. playing, listening, custom, ...) */
type:Exclude<ODClientActivityType,false>, type:Exclude<ODClientActivityType,false>,
/**The mode/status of the bot (e.g. online, invisible, idle, do not disturb) */
mode:ODClientActivityStatus
/**The text for the status. */ /**The text for the status. */
text:string, text:string,
/**The status of the bot (e.g. online, invisible, idle, do not disturb) */ /**Additional text for the status. (visible below 'text') */
status:ODClientActivityStatus state:string,
} }
/**## ODJsonConfig_DefaultMessageSettingsType `interface` /**## ODJsonConfig_DefaultMessageSettingsType `interface`
@@ -131,6 +133,30 @@ export interface ODJsonConfig_DefaultSystemLimits {
userMaximum:number userMaximum:number
} }
/**## ODJsonConfig_DefaultSystemChannelTopic `interface`
* All global channel topic settings.
*/
export interface ODJsonConfig_DefaultSystemChannelTopic {
/**Show the option name in the channel topic. */
showOptionName:boolean,
/**Show the option description in the channel topic. */
showOptionDescription:boolean,
/**Show the option topic text in the channel topic (configured in the options config). */
showOptionTopic:boolean,
/**Show the current close/reopen status in the channel topic (auto-updated). */
showClosed:boolean,
/**Show the current claim status in the channel topic (auto-updated). */
showClaimed:boolean,
/**Show the current pin status in the channel topic (auto-updated). */
showPinned:boolean,
/**Show the current priority in the channel topic (auto-updated). */
showPriority:boolean,
/**Show the creator of the ticket in the channel topic (auto-updated on transfer). */
showCreator:boolean,
/**Show the first 5 participants of the ticket in the channel topic (auto-updated). */
showParticipants:boolean
}
/**## ODJsonConfig_DefaultSystemPermissions `interface` /**## ODJsonConfig_DefaultSystemPermissions `interface`
* Configure permissions for all Open Ticket commands & actions. * Configure permissions for all Open Ticket commands & actions.
*/ */
@@ -153,7 +179,10 @@ export interface ODJsonConfig_DefaultSystemPermissions {
stats:ODJsonConfig_DefaultCmdPermissionSettingsType, stats:ODJsonConfig_DefaultCmdPermissionSettingsType,
clear:ODJsonConfig_DefaultCmdPermissionSettingsType, clear:ODJsonConfig_DefaultCmdPermissionSettingsType,
autoclose:ODJsonConfig_DefaultCmdPermissionSettingsType, autoclose:ODJsonConfig_DefaultCmdPermissionSettingsType,
autodelete:ODJsonConfig_DefaultCmdPermissionSettingsType autodelete:ODJsonConfig_DefaultCmdPermissionSettingsType,
transfer:ODJsonConfig_DefaultCmdPermissionSettingsType,
topic:ODJsonConfig_DefaultCmdPermissionSettingsType,
priority:ODJsonConfig_DefaultCmdPermissionSettingsType,
} }
/**## ODJsonConfig_DefaultSystemMessages `interface` /**## ODJsonConfig_DefaultSystemMessages `interface`
@@ -171,34 +200,61 @@ export interface ODJsonConfig_DefaultSystemMessages {
renaming:ODJsonConfig_DefaultMessageSettingsType, renaming:ODJsonConfig_DefaultMessageSettingsType,
moving:ODJsonConfig_DefaultMessageSettingsType, moving:ODJsonConfig_DefaultMessageSettingsType,
blacklisting:ODJsonConfig_DefaultMessageSettingsType, blacklisting:ODJsonConfig_DefaultMessageSettingsType,
roleAdding:ODJsonConfig_DefaultMessageSettingsType, transferring:ODJsonConfig_DefaultMessageSettingsType,
roleRemoving:ODJsonConfig_DefaultMessageSettingsType topicChange:ODJsonConfig_DefaultMessageSettingsType,
priorityChange:ODJsonConfig_DefaultMessageSettingsType,
reactionRole:ODJsonConfig_DefaultMessageSettingsType,
} }
/**## ODJsonConfig_DefaultSystem `interface` /**## ODJsonConfig_DefaultSystem `interface`
* All settings related to the ticket system. * All settings related to the ticket system.
*/ */
export interface ODJsonConfig_DefaultSystem { export interface ODJsonConfig_DefaultSystem {
/**Remove all participants (except admins) from the ticket when it's closed. */
removeParticipantsOnClose:boolean,
/**Reply with an ephemeral message when a ticket is created. */
replyOnTicketCreation:boolean,
/**Reply with an ephemeral message when reaction roles are changed. */
replyOnReactionRole:boolean,
/**Use a translated config checker in the console. */
useTranslatedConfigChecker:boolean,
/**Prefer slash-commands over text-commands when displaying them in menu's and messages. */ /**Prefer slash-commands over text-commands when displaying them in menu's and messages. */
preferSlashOverText:boolean, preferSlashOverText:boolean,
/**Reply with "unknown command" when the prefix is used without a valid command. */ /**Reply with "unknown command" when the prefix is used without a valid command. */
sendErrorOnUnknownCommand:boolean, sendErrorOnUnknownCommand:boolean,
/**Display the question fields (in a ticket message) in code blocks. */ /**Display the question fields (in a ticket message) in code blocks. */
questionFieldsInCodeBlock:boolean, questionFieldsInCodeBlock:boolean,
/**Display embed fields together with question fields (in a ticket message). */
displayFieldsWithQuestions:boolean,
/**Show global admins roles together with ticket admins in panel embeds. */
showGlobalAdminsInPanelRoles:boolean,
/**Disable the (✅❌) buttons and directly run the action. */ /**Disable the (✅❌) buttons and directly run the action. */
disableVerifyBars:boolean, disableVerifyBars:boolean,
/**Display error embeds/messages with red instead of the default bot color. */ /**Display error embeds/messages with red instead of the default bot color. */
useRedErrorEmbeds:boolean, useRedErrorEmbeds:boolean,
/**Always show the reason field in embeds, even when there is no reason provided. */
alwaysShowReason:boolean,
/**The emoji style used in the bot. This will affect all embeds, titles & messages in the bot. */ /**The emoji style used in the bot. This will affect all embeds, titles & messages in the bot. */
emojiStyle:"before"|"after"|"double"|"disabled", emojiStyle:"before"|"after"|"double"|"disabled",
/**The emoji used when pinning tickets. This is '📌' by default. */
pinEmoji:string,
/**Reply with an ephemeral message when a ticket is created. */
replyOnTicketCreation:boolean,
/**Reply with an ephemeral message when reaction roles are changed. */
replyOnReactionRole:boolean,
/**Show a warning message before the ticket gets autoclosed. This will happen when only 1/4th of the autoclose time remains. */
showPreAutocloseWarning:boolean,
/**Ask for the priority of this ticket on ticket creation. This will happen in a dropdown in the ticket message. */
askPriorityOnTicketCreation:boolean,
/**Remove all participants (except admins) from the ticket when it's closed. */
removeParticipantsOnClose:boolean,
/**Disable autoclose for a ticket when it has been closed and re-opened. */
disableAutocloseAfterReopen:boolean,
/**Only allow autodelete when the ticket is already closed. */
autodeleteRequiresClosedTicket:boolean,
/**When enabled, only global admins are able to delete a ticket without transcript. */
adminOnlyDeleteWithoutTranscript:boolean,
/**Only allow ticket closing when at least 1 message has been sent by the creator. (admins are able to bypass) */
allowCloseBeforeMessage:boolean,
/**Only allow ticket closing when at least 1 message has been sent by a global or ticket admin. (admins are able to bypass) */
allowCloseBeforeAdminMessage:boolean,
/**Use a translated config checker in the console. */
useTranslatedConfigChecker:boolean,
/**Pin the (first) ticket message in the channel. This simulates old behaviour like Open Ticket v1, v2 & v3. */
pinFirstTicketMessage:boolean,
/**Enable/disable the ticket claim & unclaim button in the ticket message. */ /**Enable/disable the ticket claim & unclaim button in the ticket message. */
enableTicketClaimButtons:boolean, enableTicketClaimButtons:boolean,
@@ -219,6 +275,9 @@ export interface ODJsonConfig_DefaultSystem {
/**All settings related to global ticket limits. */ /**All settings related to global ticket limits. */
limits:ODJsonConfig_DefaultSystemLimits, limits:ODJsonConfig_DefaultSystemLimits,
/**All global channel topic settings. */
channelTopic:ODJsonConfig_DefaultSystemChannelTopic,
/**Configure permissions for all Open Ticket commands & actions. */ /**Configure permissions for all Open Ticket commands & actions. */
permissions:ODJsonConfig_DefaultSystemPermissions, permissions:ODJsonConfig_DefaultSystemPermissions,
@@ -366,8 +425,8 @@ export interface ODJsonConfig_DefaultOptionTicketChannelType {
/**The category to move the ticket to when claimed by this user. */ /**The category to move the ticket to when claimed by this user. */
category:string category:string
}[], }[],
/**The channel description/topic shown at the top of the channel in discord. */ /**The channel topic shown at the top of the channel in discord. */
description:string topic:string
} }
/**## ODJsonConfig_DefaultOptionTicketType `interface` /**## ODJsonConfig_DefaultOptionTicketType `interface`
@@ -428,14 +487,14 @@ export interface ODJsonConfig_DefaultOptionTicketType extends ODJsonConfig_Defau
/**Disable autodeleting when the ticket is claimed by someone. */ /**Disable autodeleting when the ticket is claimed by someone. */
disableOnClaim:boolean disableOnClaim:boolean
}, },
/**All settings related to the cooldown of this ticket type */ /**All settings related to the cooldown of this ticket type. */
cooldown:{ cooldown:{
/**Enable cooldown (per user) */ /**Enable cooldown (per user) */
enabled:boolean, enabled:boolean,
/**The amount of minutes a user needs to wait before being able to create a ticket again. */ /**The amount of minutes a user needs to wait before being able to create a ticket again. */
cooldownMinutes:number cooldownMinutes:number
}, },
/**All settings related to the limits of this ticket type */ /**All settings related to the limits of this ticket type. */
limits:{ limits:{
/**Enable option ticket limits. */ /**Enable option ticket limits. */
enabled:boolean, enabled:boolean,
@@ -443,6 +502,13 @@ export interface ODJsonConfig_DefaultOptionTicketType extends ODJsonConfig_Defau
globalMaximum:number, globalMaximum:number,
/**The maximum amount of tickets of this type that a user is allowed to create at the same time. */ /**The maximum amount of tickets of this type that a user is allowed to create at the same time. */
userMaximum:number userMaximum:number
},
/**All settings related to the slow mode of this ticket type. */
slowMode:{
/**Enable channel slow mode. */
enabled:boolean,
/**The amount of seconds users need to wait between sending messages. */
slowModeSeconds:number
} }
} }
+4 -1
View File
@@ -156,7 +156,7 @@ export interface ODTicketOptionIds {
"opendiscord:channel-category-closed":ODOptionData<string>, "opendiscord:channel-category-closed":ODOptionData<string>,
"opendiscord:channel-category-backup":ODOptionData<string>, "opendiscord:channel-category-backup":ODOptionData<string>,
"opendiscord:channel-categories-claimed":ODOptionData<{user:string,category:string}[]>, "opendiscord:channel-categories-claimed":ODOptionData<{user:string,category:string}[]>,
"opendiscord:channel-description":ODOptionData<string>, "opendiscord:channel-topic":ODOptionData<string>,
"opendiscord:dm-message-enabled":ODOptionData<boolean>, "opendiscord:dm-message-enabled":ODOptionData<boolean>,
"opendiscord:dm-message-text":ODOptionData<string>, "opendiscord:dm-message-text":ODOptionData<string>,
@@ -183,6 +183,9 @@ export interface ODTicketOptionIds {
"opendiscord:limits-enabled":ODOptionData<boolean>, "opendiscord:limits-enabled":ODOptionData<boolean>,
"opendiscord:limits-maximum-global":ODOptionData<number>, "opendiscord:limits-maximum-global":ODOptionData<number>,
"opendiscord:limits-maximum-user":ODOptionData<number> "opendiscord:limits-maximum-user":ODOptionData<number>
"opendiscord:slowmode-enabled":ODOptionData<boolean>,
"opendiscord:slowmode-seconds":ODOptionData<number>,
} }
/**## ODTicketOption `class` /**## ODTicketOption `class`
+8
View File
@@ -158,6 +158,7 @@ export interface ODTicketIds {
"opendiscord:ticket-message":ODTicketData<string|null>, "opendiscord:ticket-message":ODTicketData<string|null>,
"opendiscord:participants":ODTicketData<{type:"role"|"user",id:string}[]>, "opendiscord:participants":ODTicketData<{type:"role"|"user",id:string}[]>,
"opendiscord:channel-suffix":ODTicketData<string>, "opendiscord:channel-suffix":ODTicketData<string>,
"opendiscord:previous-creators":ODTicketData<string[]>,
"opendiscord:open":ODTicketData<boolean>, "opendiscord:open":ODTicketData<boolean>,
"opendiscord:opened-by":ODTicketData<string|null>, "opendiscord:opened-by":ODTicketData<string|null>,
@@ -165,6 +166,9 @@ export interface ODTicketIds {
"opendiscord:closed":ODTicketData<boolean>, "opendiscord:closed":ODTicketData<boolean>,
"opendiscord:closed-by":ODTicketData<string|null>, "opendiscord:closed-by":ODTicketData<string|null>,
"opendiscord:closed-on":ODTicketData<number|null>, "opendiscord:closed-on":ODTicketData<number|null>,
"opendiscord:reopened":ODTicketData<boolean>,
"opendiscord:reopened-by":ODTicketData<string|null>,
"opendiscord:reopened-on":ODTicketData<number|null>,
"opendiscord:claimed":ODTicketData<boolean>, "opendiscord:claimed":ODTicketData<boolean>,
"opendiscord:claimed-by":ODTicketData<string|null>, "opendiscord:claimed-by":ODTicketData<string|null>,
"opendiscord:claimed-on":ODTicketData<number|null>, "opendiscord:claimed-on":ODTicketData<number|null>,
@@ -183,6 +187,10 @@ export interface ODTicketIds {
"opendiscord:autodelete-days":ODTicketData<number>, "opendiscord:autodelete-days":ODTicketData<number>,
"opendiscord:answers":ODTicketData<{id:string,name:string,type:"short"|"paragraph",value:string|null}[]>, "opendiscord:answers":ODTicketData<{id:string,name:string,type:"short"|"paragraph",value:string|null}[]>,
"opendiscord:priority":ODTicketData<number>,
"opendiscord:topic":ODTicketData<string>,
"opendiscord:message-sent":ODTicketData<boolean>,
"opendiscord:admin-message-sent":ODTicketData<boolean>,
} }
/**## ODTicket `class` /**## ODTicket `class`
+48 -14
View File
@@ -457,11 +457,11 @@ async function renderQuickSetupStatusType(backFn:() => api.ODPromiseVoid){
}).promise }).promise
if (answer.canceled) return await backFn() if (answer.canceled) return await backFn()
else if (answer.selectedIndex == 0) quickSetupStorage.status = {enabled:false,status:"online",type:"custom",text:""} else if (answer.selectedIndex == 0) quickSetupStorage.status = {enabled:false,mode:"online",type:"custom",text:"",state:""}
else if (answer.selectedIndex == 1) quickSetupStorage.status = {enabled:true,status:"online",type:"custom",text:""} else if (answer.selectedIndex == 1) quickSetupStorage.status = {enabled:true,mode:"online",type:"custom",text:"",state:""}
else if (answer.selectedIndex == 2) quickSetupStorage.status = {enabled:true,status:"online",type:"listening",text:""} else if (answer.selectedIndex == 2) quickSetupStorage.status = {enabled:true,mode:"online",type:"listening",text:"",state:""}
else if (answer.selectedIndex == 3) quickSetupStorage.status = {enabled:true,status:"online",type:"watching",text:""} else if (answer.selectedIndex == 3) quickSetupStorage.status = {enabled:true,mode:"online",type:"watching",text:"",state:""}
else if (answer.selectedIndex == 4) quickSetupStorage.status = {enabled:true,status:"online",type:"playing",text:""} else if (answer.selectedIndex == 4) quickSetupStorage.status = {enabled:true,mode:"online",type:"playing",text:"",state:""}
if (answer.selectedIndex == 0) return await renderQuickSetupLogs(async () => {await renderQuickSetupStatusType(backFn)}) if (answer.selectedIndex == 0) return await renderQuickSetupLogs(async () => {await renderQuickSetupStatusType(backFn)})
else return await renderQuickSetupStatusText(async () => {await renderQuickSetupStatusType(backFn)}) else return await renderQuickSetupStatusText(async () => {await renderQuickSetupStatusType(backFn)})
@@ -1223,19 +1223,32 @@ async function saveQuickSetupConfig(){
slashCommands:quickSetupStorage.slashCommands ?? false, slashCommands:quickSetupStorage.slashCommands ?? false,
textCommands:quickSetupStorage.textCommands ?? false, textCommands:quickSetupStorage.textCommands ?? false,
status:quickSetupStorage.status ?? {enabled:false,status:"online",text:"",type:"custom"}, status:quickSetupStorage.status ?? {enabled:false,mode:"online",type:"custom",text:"",state:""},
system:{ system:{
removeParticipantsOnClose:quickSetupStorage.removeParticipantsOnClose ?? false,
replyOnTicketCreation:false,
replyOnReactionRole:true,
useTranslatedConfigChecker:true,
preferSlashOverText:quickSetupStorage.slashCommands ?? false, preferSlashOverText:quickSetupStorage.slashCommands ?? false,
sendErrorOnUnknownCommand:true, sendErrorOnUnknownCommand:true,
questionFieldsInCodeBlock:true, questionFieldsInCodeBlock:true,
displayFieldsWithQuestions:false,
showGlobalAdminsInPanelRoles:false,
disableVerifyBars:false, disableVerifyBars:false,
useRedErrorEmbeds:true, useRedErrorEmbeds:true,
alwaysShowReason:false,
emojiStyle:quickSetupStorage.emojiStyle ?? "before", emojiStyle:quickSetupStorage.emojiStyle ?? "before",
pinEmoji:"📌",
replyOnTicketCreation:false,
replyOnReactionRole:true,
showPreAutocloseWarning:false,
askPriorityOnTicketCreation:false,
removeParticipantsOnClose:quickSetupStorage.removeParticipantsOnClose ?? false,
disableAutocloseAfterReopen:true,
autodeleteRequiresClosedTicket:true,
adminOnlyDeleteWithoutTranscript:true,
allowCloseBeforeMessage:false,
allowCloseBeforeAdminMessage:true,
useTranslatedConfigChecker:true,
pinFirstTicketMessage:false,
enableTicketClaimButtons:true, enableTicketClaimButtons:true,
enableTicketCloseButtons:true, enableTicketCloseButtons:true,
@@ -1255,6 +1268,18 @@ async function saveQuickSetupConfig(){
userMaximum:quickSetupStorage.globalUserLimit ?? 3 userMaximum:quickSetupStorage.globalUserLimit ?? 3
}, },
channelTopic:{
showOptionName:true,
showOptionDescription:false,
showOptionTopic:true,
showClosed:true,
showClaimed:false,
showPinned:false,
showPriority:false,
showCreator:false,
showParticipants:false
},
permissions:{ permissions:{
help:"everyone", help:"everyone",
panel:"admin", panel:"admin",
@@ -1274,7 +1299,10 @@ async function saveQuickSetupConfig(){
stats:"everyone", stats:"everyone",
clear:"admin", clear:"admin",
autoclose:"admin", autoclose:"admin",
autodelete:"admin" autodelete:"admin",
transfer:"admin",
topic:"admin",
priority:"admin",
}, },
messages:{ messages:{
@@ -1289,8 +1317,10 @@ async function saveQuickSetupConfig(){
renaming:{dm:false,logs:true}, renaming:{dm:false,logs:true},
moving:{dm:true,logs:true}, moving:{dm:true,logs:true},
blacklisting:{dm:true,logs:true}, blacklisting:{dm:true,logs:true},
roleAdding:{dm:false,logs:true}, transferring:{dm:true,logs:true},
roleRemoving:{dm:false,logs:true} topicChange:{dm:false,logs:true},
priorityChange:{dm:false,logs:true},
reactionRole:{dm:false,logs:true}
} }
} }
} }
@@ -1360,7 +1390,7 @@ async function saveQuickSetupConfig(){
closedCategory:"", closedCategory:"",
backupCategory:"", backupCategory:"",
claimedCategory:[], claimedCategory:[],
description:ticket.description topic:ticket.description
}, },
dmMessage:{ dmMessage:{
@@ -1418,6 +1448,10 @@ async function saveQuickSetupConfig(){
enabled:false, enabled:false,
globalMaximum:20, globalMaximum:20,
userMaximum:3 userMaximum:3
},
slowMode:{
enabled:false,
slowModeSeconds:20
} }
} }
}) })
+4 -2
View File
@@ -147,7 +147,8 @@ export class ODVersionMigration {
try{ try{
await this.#func() await this.#func()
return true return true
}catch{ }catch(err){
process.emit("uncaughtException",err)
return false return false
} }
} }
@@ -156,7 +157,8 @@ export class ODVersionMigration {
try{ try{
await this.#afterInitFunc() await this.#afterInitFunc()
return true return true
}catch{ }catch(err){
process.emit("uncaughtException",err)
return false return false
} }
} }
+29
View File
@@ -1,4 +1,5 @@
import {opendiscord, api, utilities} from "../../index" import {opendiscord, api, utilities} from "../../index"
import fs from "fs"
/**Check if migration is required. Returns the last version used in the database. */ /**Check if migration is required. Returns the last version used in the database. */
async function isMigrationRequired(): Promise<false|api.ODVersion> { async function isMigrationRequired(): Promise<false|api.ODVersion> {
@@ -81,6 +82,22 @@ async function unloadMigrationContext(){
opendiscord.debug.debug("-- MIGRATION CONTEXT END --") opendiscord.debug.debug("-- MIGRATION CONTEXT END --")
} }
/**Create a backup of the (dev)config & database before migrating. */
function createMigrationBackup(){
if (fs.existsSync("./.backup/")) fs.rmSync("./.backup/",{force:true,recursive:true})
fs.mkdirSync("./.backup/")
const devconfigFlag = opendiscord.flags.get("opendiscord:dev-config")
const isDevConfig = devconfigFlag ? devconfigFlag.value : false
const devDatabaseFlag = opendiscord.flags.get("opendiscord:dev-database")
const isDevDatabase = devDatabaseFlag ? devDatabaseFlag.value : false
if (isDevConfig) fs.cpSync("./devconfig/","./.backup/devconfig/",{force:true,recursive:true})
else fs.cpSync("./config/","./.backup/config/",{force:true,recursive:true})
if (isDevDatabase) fs.cpSync("./devdatabase/","./.backup/devdatabase/",{force:true,recursive:true})
else fs.cpSync("./database/","./.backup/database/",{force:true,recursive:true})
}
/**Execute all version migration functions which are handled in the restricted migration context. */ /**Execute all version migration functions which are handled in the restricted migration context. */
async function loadAllVersionMigrations(lastVersion:api.ODVersion){ async function loadAllVersionMigrations(lastVersion:api.ODVersion){
const migrations = (await import("./migration.js")).migrations const migrations = (await import("./migration.js")).migrations
@@ -90,6 +107,11 @@ async function loadAllVersionMigrations(lastVersion:api.ODVersion){
else if (comparison == "higher") return 1 else if (comparison == "higher") return 1
else return -1 else return -1
}) })
if (migrations.length > 0){
//create backup of config & database
createMigrationBackup()
}
for (const migration of migrations){ for (const migration of migrations){
if (migration.version.compare(lastVersion) == "higher"){ if (migration.version.compare(lastVersion) == "higher"){
const success = await migration.migrate() const success = await migration.migrate()
@@ -97,6 +119,7 @@ async function loadAllVersionMigrations(lastVersion:api.ODVersion){
{key:"success",value:success ? "true" : "false"}, {key:"success",value:success ? "true" : "false"},
{key:"afterInit",value:"false"} {key:"afterInit",value:"false"}
]) ])
else throw new api.ODSystemError("Migration Error: Unable to migrate database & config to the new version of the bot.")
} }
} }
} }
@@ -110,6 +133,11 @@ export async function loadAllAfterInitVersionMigrations(lastVersion:api.ODVersio
else if (comparison == "higher") return 1 else if (comparison == "higher") return 1
else return -1 else return -1
}) })
if (migrations.length > 0){
//create backup of config & database
createMigrationBackup()
}
for (const migration of migrations){ for (const migration of migrations){
if (migration.version.compare(lastVersion) == "higher"){ if (migration.version.compare(lastVersion) == "higher"){
const success = await migration.migrateAfterInit() const success = await migration.migrateAfterInit()
@@ -117,6 +145,7 @@ export async function loadAllAfterInitVersionMigrations(lastVersion:api.ODVersio
{key:"success",value:success ? "true" : "false"}, {key:"success",value:success ? "true" : "false"},
{key:"afterInit",value:"true"} {key:"afterInit",value:"true"}
]) ])
else throw new api.ODSystemError("Migration Error: Unable to migrate database & config to the new version of the bot.")
} }
} }
} }
+105 -1
View File
@@ -31,5 +31,109 @@ export const migrations = [
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.6"),async () => {},async () => {}), new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.6"),async () => {},async () => {}),
//MIGRATE TO v4.0.7 //MIGRATE TO v4.0.7
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.7"),async () => {},async () => {}) new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.7"),async () => {},async () => {}),
//MIGRATE TO v4.1.0
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.1.0"),async () => {},async () => {
//AFTER INIT MIGRATION
//migrate config
const generalConfig = opendiscord.configs.get("opendiscord:general")
const optionConfig = opendiscord.configs.get("opendiscord:options")
if (!generalConfig.data.status.state){
//only migrate config when it hasn't been done manually by the user.
if (!generalConfig.data._INFO) throw new api.ODSystemError("Couldn't find general.json '_INFO' category.")
generalConfig.data._INFO.version = "open-ticket-v4.1.0"
if (!generalConfig.data.status) throw new api.ODSystemError("Couldn't find general.json 'status' category.")
generalConfig.data.status.mode = generalConfig.data.status["status"] ?? "online"
generalConfig.data.status.state = ""
delete generalConfig.data.status["status"]
if (!generalConfig.data.system) throw new api.ODSystemError("Couldn't find general.json 'system' category.")
generalConfig.data.system.displayFieldsWithQuestions = false
generalConfig.data.system.showGlobalAdminsInPanelRoles = false
generalConfig.data.system.alwaysShowReason = false
generalConfig.data.system.pinEmoji = "📌"
generalConfig.data.system.showPreAutocloseWarning = false
generalConfig.data.system.askPriorityOnTicketCreation = false
generalConfig.data.system.disableAutocloseAfterReopen = true
generalConfig.data.system.autodeleteRequiresClosedTicket = true
generalConfig.data.system.adminOnlyDeleteWithoutTranscript = true
generalConfig.data.system.allowCloseBeforeMessage = false
generalConfig.data.system.allowCloseBeforeAdminMessage = true
generalConfig.data.system.pinFirstTicketMessage = false
generalConfig.data.system.channelTopic = {
showOptionName:true,
showOptionDescription:false,
showOptionTopic:true,
showClosed:true,
showClaimed:false,
showPinned:false,
showPriority:false,
showCreator:false,
showParticipants:false
}
if (!generalConfig.data.system.permissions) throw new api.ODSystemError("Couldn't find general.json 'system.permissions' category.")
generalConfig.data.system.permissions.transfer = "admin"
generalConfig.data.system.permissions.topic = "admin"
generalConfig.data.system.permissions.priority = "admin"
if (!generalConfig.data.system.messages) throw new api.ODSystemError("Couldn't find general.json 'system.messages' category.")
generalConfig.data.system.messages.transferring = {dm:false,logs:true}
generalConfig.data.system.messages.topicChange = {dm:false,logs:true}
generalConfig.data.system.messages.priorityChange = {dm:false,logs:true}
generalConfig.data.system.messages.reactionRole = generalConfig.data.system.messages["roleAdding"] ?? {dm:false,logs:true}
delete generalConfig.data.system.messages["roleAdding"]
delete generalConfig.data.system.messages["roleRemoving"]
for (const option of optionConfig.data){
if (option.type != "ticket") continue
option.channel.topic = option.channel["description"] ?? ""
delete option.channel["description"]
option.slowMode = {
enabled:false,
slowModeSeconds:20
}
}
await generalConfig.save()
await optionConfig.save()
}
//migrate database
const optionDatabase = opendiscord.databases.get("opendiscord:options")
const ticketDatabase = opendiscord.databases.get("opendiscord:tickets")
for (const option of (await optionDatabase.getCategory("opendiscord:used-option") ?? [])){
const optionData = option.value
const topicData = optionData.data.find((d) => d.id == "opendiscord:channel-description")
if (topicData) topicData.id = "opendiscord:channel-topic"
if (!optionData.data.find((d) => d.id == "opendiscord:slowmode-enabled")) optionData.data.push({id:"opendiscord:slowmode-enabled",value:false})
if (!optionData.data.find((d) => d.id == "opendiscord:slowmode-seconds")) optionData.data.push({id:"opendiscord:slowmode-seconds",value:20})
optionDatabase.set("opendiscord:used-option",option.key,optionData)
}
for (const ticket of (await ticketDatabase.getCategory("opendiscord:ticket") ?? [])){
const ticketData = ticket.value
if (!ticketData.data.find((d) => d.id == "opendiscord:previous-creators")) ticketData.data.push({id:"opendiscord:previous-creators",value:[]})
if (!ticketData.data.find((d) => d.id == "opendiscord:reopened")) ticketData.data.push({id:"opendiscord:reopened",value:false})
if (!ticketData.data.find((d) => d.id == "opendiscord:reopened-by")) ticketData.data.push({id:"opendiscord:reopened-by",value:null})
if (!ticketData.data.find((d) => d.id == "opendiscord:reopened-on")) ticketData.data.push({id:"opendiscord:reopened-on",value:null})
if (!ticketData.data.find((d) => d.id == "opendiscord:priority")) ticketData.data.push({id:"opendiscord:priority",value:-1})
if (!ticketData.data.find((d) => d.id == "opendiscord:topic")) ticketData.data.push({id:"opendiscord:topic",value:""})
if (!ticketData.data.find((d) => d.id == "opendiscord:message-sent")) ticketData.data.push({id:"opendiscord:message-sent",value:true})
if (!ticketData.data.find((d) => d.id == "opendiscord:admin-message-sent")) ticketData.data.push({id:"opendiscord:admin-message-sent",value:true})
ticketDatabase.set("opendiscord:ticket",ticket.key,ticketData)
}
})
] ]
+48 -9
View File
@@ -245,8 +245,9 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opendis
checker:new api.ODCheckerObjectStructure("opendiscord:status",{children:[ checker:new api.ODCheckerObjectStructure("opendiscord:status",{children:[
{key:"enabled",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:status-enabled",{cliDisplayName:"Enabled",cliDisplayDescription:"Enable/disable the status. When disabled, the bot will be online without any status."})}, {key:"enabled",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:status-enabled",{cliDisplayName:"Enabled",cliDisplayDescription:"Enable/disable the status. When disabled, the bot will be online without any status."})},
{key:"type",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-type",{choices:["listening","watching","playing","custom"],cliDisplayName:"Type",cliDisplayDescription:"The type of status: Listening, Watching, Playing or Custom."})}, {key:"type",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-type",{choices:["listening","watching","playing","custom"],cliDisplayName:"Type",cliDisplayDescription:"The type of status: Listening, Watching, Playing or Custom."})},
{key:"mode",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-mode",{choices:["online","invisible","idle","dnd"],cliDisplayName:"Mode",cliDisplayDescription:"The profile status/mode of the bot: Online, Invisible, Idle or Do Not Disturb."})},
{key:"text",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-text",{minLength:1,maxLength:128,cliDisplayName:"Text",cliDisplayDescription:"The text displayed in the status."})}, {key:"text",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-text",{minLength:1,maxLength:128,cliDisplayName:"Text",cliDisplayDescription:"The text displayed in the status."})},
{key:"status",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-status",{choices:["online","invisible","idle","dnd"],cliDisplayName:"Status",cliDisplayDescription:"The profile status of the bot: Online, Invisible, Idle or Do Not Disturb."})}, {key:"state",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:status-state",{maxLength:128,cliDisplayName:"State",cliDisplayDescription:"Additional text displayed below the status 'text'."})},
],cliDisplayName:"Bot Status",cliDisplayDescription:"Manage the status of the bot."}), ],cliDisplayName:"Bot Status",cliDisplayDescription:"Manage the status of the bot."}),
cliDisplayName:"Bot Status", cliDisplayName:"Bot Status",
cliDisplayDescription:"Manage the status of the bot." cliDisplayDescription:"Manage the status of the bot."
@@ -254,16 +255,29 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opendis
//SYSTEM //SYSTEM
{key:"system",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:system",{children:[ {key:"system",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:system",{children:[
{key:"removeParticipantsOnClose",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:remove-participants-on-close",{cliDisplayName:"Remove Participants On Close",cliDisplayDescription:"When enabled, all participants except admins will be removed from the ticket."})},
{key:"replyOnTicketCreation",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:reply-on-ticket-creation",{cliDisplayName:"Reply On Ticket Creation",cliDisplayDescription:"When enabled, the bot will send an ephemeral reply in the channel of the panel when creating a ticket."})},
{key:"replyOnReactionRole",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:reply-on-reaction-role",{cliDisplayName:"Reply On Reaction Role",cliDisplayDescription:"When enabled, the bot will send an ephemeral reply in the channel of the panel when using a role button."})},
{key:"useTranslatedConfigChecker",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:use-translated-config-checker",{cliDisplayName:"Use Translated Config Checker",cliDisplayDescription:"Use a translated config checker to better understand the errors the bot gives."})},
{key:"preferSlashOverText",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:prefer-slash-over-text",{cliDisplayName:"Prefer Slash Over Text",cliDisplayDescription:"Prefer displaying slash commands over text commands in help menus."})}, {key:"preferSlashOverText",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:prefer-slash-over-text",{cliDisplayName:"Prefer Slash Over Text",cliDisplayDescription:"Prefer displaying slash commands over text commands in help menus."})},
{key:"sendErrorOnUnknownCommand",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:send-error-on-unknown-command",{cliDisplayName:"Send Error On Unknown Command",cliDisplayDescription:"Send an error when using the text-command prefix without a valid command."})}, {key:"sendErrorOnUnknownCommand",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:send-error-on-unknown-command",{cliDisplayName:"Send Error On Unknown Command",cliDisplayDescription:"Send an error when using the text-command prefix without a valid command."})},
{key:"questionFieldsInCodeBlock",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:question-fields-in-code-block",{cliDisplayName:"Questions Fields In Code Blocks",cliDisplayDescription:"Display question fields in code blocks instead of plain text."})}, {key:"questionFieldsInCodeBlock",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:question-fields-in-code-block",{cliDisplayName:"Questions Fields In Code Blocks",cliDisplayDescription:"Display question fields in code blocks instead of plain text."})},
{key:"displayFieldsWithQuestions",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:display-fields-with-questions",{cliDisplayName:"Display Fields With Questions",cliDisplayDescription:"Display embed fields together with question fields (in a ticket message)."})},
{key:"showGlobalAdminsInPanelRoles",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:global-admins-in-panel-roles",{cliDisplayName:"Show Global Admins In Panel Roles",cliDisplayDescription:"Show global admins roles together with ticket admins in panel embeds."})},
{key:"disableVerifyBars",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:disable-verify-bars",{cliDisplayName:"Disable Verifybars",cliDisplayDescription:"Disable the (✅/❌) verify buttons in all commands. (Not recommended)"})}, {key:"disableVerifyBars",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:disable-verify-bars",{cliDisplayName:"Disable Verifybars",cliDisplayDescription:"Disable the (✅/❌) verify buttons in all commands. (Not recommended)"})},
{key:"useRedErrorEmbeds",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:use-red-error-embeds",{cliDisplayName:"Use Red Error Embeds",cliDisplayDescription:"Display all error messages with a red border instead of the default color of the bot."})}, {key:"useRedErrorEmbeds",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:use-red-error-embeds",{cliDisplayName:"Use Red Error Embeds",cliDisplayDescription:"Display all error messages with a red border instead of the default color of the bot."})},
{key:"alwaysShowReason",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:always-show-reason",{cliDisplayName:"Always Show Reason",cliDisplayDescription:"Always show the reason field in embeds, even when there is no reason provided."})},
{key:"emojiStyle",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:emoji-style",{choices:["before","after","double","disabled"],cliDisplayName:"Emoji Style",cliDisplayDescription:"Choose how the bot will display emojis in message titles. (Visit docs for more info)"})}, {key:"emojiStyle",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:emoji-style",{choices:["before","after","double","disabled"],cliDisplayName:"Emoji Style",cliDisplayDescription:"Choose how the bot will display emojis in message titles. (Visit docs for more info)"})},
{key:"pinEmoji",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_EmojiString("opendiscord:pin-emoji",1,1,false,{cliDisplayName:"Pin Emoji",cliDisplayDescription:"The emoji used when pinning tickets. This is '📌' by default."})},
{key:"replyOnTicketCreation",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:reply-on-ticket-creation",{cliDisplayName:"Reply On Ticket Creation",cliDisplayDescription:"When enabled, the bot will send an ephemeral reply in the channel of the panel when creating a ticket."})},
{key:"replyOnReactionRole",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:reply-on-reaction-role",{cliDisplayName:"Reply On Reaction Role",cliDisplayDescription:"When enabled, the bot will send an ephemeral reply in the channel of the panel when using a role button."})},
{key:"showPreAutocloseWarning",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:show-pre-autoclose-warning",{cliDisplayName:"Show Pre-Autoclose Warning",cliDisplayDescription:"Show a warning message before the ticket gets autoclosed. This will happen when only 1/4th of the autoclose time remains."})},
{key:"askPriorityOnTicketCreation",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:ask-priority-creation",{cliDisplayName:"Ask Priority On Ticket Creation",cliDisplayDescription:"Ask for the priority of this ticket on ticket creation. This will happen in a dropdown in the ticket message."})},
{key:"removeParticipantsOnClose",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:remove-participants-on-close",{cliDisplayName:"Remove Participants On Close",cliDisplayDescription:"When enabled, all participants except admins will be removed from the ticket."})},
{key:"disableAutocloseAfterReopen",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:disable-autoclose-reopen",{cliDisplayName:"Disable Autoclose On Reopen",cliDisplayDescription:"Disable autoclose for a ticket when it has been closed and re-opened."})},
{key:"autodeleteRequiresClosedTicket",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:autodelete-requires-closed-ticket",{cliDisplayName:"Autodelete Requires Closed Ticket",cliDisplayDescription:"Only allow autodelete when the ticket is already closed."})},
{key:"adminOnlyDeleteWithoutTranscript",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:adminonly-delete-without-transcript",{cliDisplayName:"Admin-only Delete Without Transcript",cliDisplayDescription:"When enabled, only global admins are able to delete a ticket without transcript."})},
{key:"allowCloseBeforeMessage",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:allow-close-before-message",{cliDisplayName:"Allow Close Before Message",cliDisplayDescription:"Only allow ticket closing when at least 1 message has been sent by the creator. (admins are able to bypass)"})},
{key:"allowCloseBeforeAdminMessage",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:allow-close-before-admin-message",{cliDisplayName:"Allow Close Before Admin Message",cliDisplayDescription:"Only allow ticket closing when at least 1 message has been sent by a global or ticket admin. (admins are able to bypass)"})},
{key:"useTranslatedConfigChecker",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:use-translated-config-checker",{cliDisplayName:"Use Translated Config Checker",cliDisplayDescription:"Use a translated config checker to better understand the errors the bot gives."})},
{key:"pinFirstTicketMessage",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:pin-first-ticket-message",{cliDisplayName:"Pin First Ticket Message",cliDisplayDescription:"Pin the (first) ticket message in the channel. This simulates old behaviour like Open Ticket v1, v2 & v3."})},
{key:"enableTicketClaimButtons",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:enable-ticket-claim-buttons",{cliDisplayName:"Enable Ticket Claim Buttons",cliDisplayDescription:"Enable/disable buttons for claiming a ticket. Be aware that this doesn't disable the command!"})}, {key:"enableTicketClaimButtons",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:enable-ticket-claim-buttons",{cliDisplayName:"Enable Ticket Claim Buttons",cliDisplayDescription:"Enable/disable buttons for claiming a ticket. Be aware that this doesn't disable the command!"})},
{key:"enableTicketCloseButtons",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:enable-ticket-close-buttons",{cliDisplayName:"Enable Ticket Close Buttons",cliDisplayDescription:"Enable/disable buttons for closing a ticket. Be aware that this doesn't disable the command!"})}, {key:"enableTicketCloseButtons",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:enable-ticket-close-buttons",{cliDisplayName:"Enable Ticket Close Buttons",cliDisplayDescription:"Enable/disable buttons for closing a ticket. Be aware that this doesn't disable the command!"})},
@@ -283,6 +297,19 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opendis
{key:"userMaximum",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:limits-user",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliDisplayName:"User Maximum",cliDisplayDescription:"The maximum amount of tickets from a specific user that are able to exist in the server at the same time."})} {key:"userMaximum",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:limits-user",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliDisplayName:"User Maximum",cliDisplayDescription:"The maximum amount of tickets from a specific user that are able to exist in the server at the same time."})}
],cliDisplayName:"Global Limits",cliDisplayDescription:"Manage global limits for ticket creation to reduce the workload on your support team."}),cliDisplayName:"Global Limits",cliDisplayDescription:"Manage global limits for ticket creation to reduce the workload on your support team."})}, ],cliDisplayName:"Global Limits",cliDisplayDescription:"Manage global limits for ticket creation to reduce the workload on your support team."}),cliDisplayName:"Global Limits",cliDisplayDescription:"Manage global limits for ticket creation to reduce the workload on your support team."})},
{key:"channelTopic",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:channel-topic",{children:[
{key:"showOptionName",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-option-name",{cliDisplayName:"Show Option Name",cliDisplayDescription:"Show the option name in the channel topic."})},
{key:"showOptionDescription",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-option-description",{cliDisplayName:"Show Option Description",cliDisplayDescription:"Show the option description in the channel topic."})},
{key:"showOptionTopic",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-option-topic",{cliDisplayName:"Show Option Topic",cliDisplayDescription:"Show the option topic text in the channel topic (configured in the options.json config)."})},
{key:"showClosed",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-closed",{cliDisplayName:"Show Closed Status",cliDisplayDescription:"Show the current close/reopen status in the channel topic (auto-updated)."})},
{key:"showClaimed",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-claimed",{cliDisplayName:"Show Claimed Status",cliDisplayDescription:"Show the current claim status in the channel topic (auto-updated)."})},
{key:"showPinned",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-pinned",{cliDisplayName:"Show Pinned Status",cliDisplayDescription:"Show the current pin status in the channel topic (auto-updated)."})},
{key:"showPriority",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-priority",{cliDisplayName:"Show Priority",cliDisplayDescription:"Show the current priority in the channel topic (auto-updated)."})},
{key:"showCreator",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-creator",{cliDisplayName:"Show Creator",cliDisplayDescription:"Show the creator of the ticket in the channel topic (auto-updated on transfer)."})},
{key:"showParticipants",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:topic-show-participants",{cliDisplayName:"Show Participants",cliDisplayDescription:"Show the first 5 participants of the ticket in the channel topic (auto-updated)."})},
],cliDisplayName:"Channel Topic",cliDisplayDescription:"Manage stats and text of ticket channel topics."})},
{key:"permissions",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:system-permissions",{children:[ {key:"permissions",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:system-permissions",{children:[
{key:"help",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-help","role",false,["admin","everyone","none"],{cliDisplayName:"Help",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})}, {key:"help",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-help","role",false,["admin","everyone","none"],{cliDisplayName:"Help",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"panel",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-panel","role",false,["admin","everyone","none"],{cliDisplayName:"Panel",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})}, {key:"panel",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-panel","role",false,["admin","everyone","none"],{cliDisplayName:"Panel",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
@@ -302,7 +329,10 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opendis
{key:"stats",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-stats","role",false,["admin","everyone","none"],{cliDisplayName:"Stats",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})}, {key:"stats",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-stats","role",false,["admin","everyone","none"],{cliDisplayName:"Stats",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"clear",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-clear","role",false,["admin","everyone","none"],{cliDisplayName:"Clear Tickets",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})}, {key:"clear",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-clear","role",false,["admin","everyone","none"],{cliDisplayName:"Clear Tickets",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"autoclose",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-autoclose","role",false,["admin","everyone","none"],{cliDisplayName:"Autoclose",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})}, {key:"autoclose",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-autoclose","role",false,["admin","everyone","none"],{cliDisplayName:"Autoclose",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"autodelete",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-autodelete","role",false,["admin","everyone","none"],{cliDisplayName:"Autodelete",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})} {key:"autodelete",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-autodelete","role",false,["admin","everyone","none"],{cliDisplayName:"Autodelete",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"transfer",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-transfer","role",false,["admin","everyone","none"],{cliDisplayName:"Transfer",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"topic",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-topic","role",false,["admin","everyone","none"],{cliDisplayName:"Topic",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
{key:"priority",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:permissions-priority","role",false,["admin","everyone","none"],{cliDisplayName:"Priority",cliHideDescriptionInParent:true,cliDisplayDescription:"Set the permissions to 'everyone' for everyone, 'admin' for admin only, 'none' to disable or a custom discord role ID."})},
],cliDisplayName:"Permissions",cliDisplayDescription:"Manage all button & command permissions in the bot. (Visit docs for more info)"})}, ],cliDisplayName:"Permissions",cliDisplayDescription:"Manage all button & command permissions in the bot. (Visit docs for more info)"})},
{key:"messages",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:system-permissions",{children:[ {key:"messages",optional:false,priority:0,checker:new api.ODCheckerObjectStructure("opendiscord:system-permissions",{children:[
@@ -317,8 +347,10 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opendis
{key:"renaming",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-renaming","Ticket Renamed")}, {key:"renaming",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-renaming","Ticket Renamed")},
{key:"moving",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-moving","Ticket Moved")}, {key:"moving",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-moving","Ticket Moved")},
{key:"blacklisting",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-blacklisting","User Blacklisted")}, {key:"blacklisting",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-blacklisting","User Blacklisted")},
{key:"roleAdding",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-role-adding","Role Added")}, {key:"transferring",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-transferring","Ticket Transferred")},
{key:"roleRemoving",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-role-removing","Role Removed")} {key:"topicChange",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-topic-change","Topic Changed")},
{key:"priorityChange",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-priority-change","Priority Changed")},
{key:"reactionRole",optional:false,priority:0,checker:createMsgStructure("opendiscord:msg-reaction-role","Reaction Role")},
],cliDisplayName:"Messages",cliDisplayDescription:"Manage all messages & DM's for each action of the bot. (Visit docs for more info)"})}, ],cliDisplayName:"Messages",cliDisplayDescription:"Manage all messages & DM's for each action of the bot. (Visit docs for more info)"})},
],cliDisplayName:"System",cliDisplayDescription:"Configure everything related to the ticket system."})} ],cliDisplayName:"System",cliDisplayDescription:"Configure everything related to the ticket system."})}
],cliDisplayName:"General",cliDisplayDescription:"General settings for the bot."}) ],cliDisplayName:"General",cliDisplayDescription:"General settings for the bot."})
@@ -369,7 +401,7 @@ export const defaultOptionsStructure = new api.ODCheckerArrayStructure("opendisc
{key:"user",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:ticket-channel-claimed-user","user",false,[],{cliDisplayName:"User",cliDisplayDescription:"A discord user ID of the ticket claimer."})}, {key:"user",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:ticket-channel-claimed-user","user",false,[],{cliDisplayName:"User",cliDisplayDescription:"A discord user ID of the ticket claimer."})},
{key:"category",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:ticket-channel-claimed-category","category",false,[],{cliDisplayName:"Category",cliDisplayDescription:"A discord category ID to move the ticket to."})} {key:"category",optional:false,priority:0,checker:new api.ODCheckerCustomStructure_DiscordId("opendiscord:ticket-channel-claimed-category","category",false,[],{cliDisplayName:"Category",cliDisplayDescription:"A discord category ID to move the ticket to."})}
],cliDisplayName:"Claimed Category",cliDisplayDescription:"A collection of a user ID and a category ID. The ticket will be moved to the category when this user claims the ticket."}),cliDisplayName:"Claimed Categories",cliDisplayDescription:"Add categories to move the ticket to when a user claims a ticket."})}, ],cliDisplayName:"Claimed Category",cliDisplayDescription:"A collection of a user ID and a category ID. The ticket will be moved to the category when this user claims the ticket."}),cliDisplayName:"Claimed Categories",cliDisplayDescription:"Add categories to move the ticket to when a user claims a ticket."})},
{key:"description",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:ticket-channel-description",{cliDisplayName:"Channel Description",cliDisplayDescription:"The description of the ticket channel. Visible in the discord client."})}, {key:"topic",optional:false,priority:0,checker:new api.ODCheckerStringStructure("opendiscord:ticket-channel-topic",{cliDisplayName:"Channel Topic",cliDisplayDescription:"The topic text of the ticket channel. Visible in the discord client when general.json 'channelTopic'.'showOptionTopic' is enabled."})},
],cliDisplayName:"Channel",cliDisplayDescription:"Manage all settings related to the ticket channel and categories."})}, ],cliDisplayName:"Channel",cliDisplayDescription:"Manage all settings related to the ticket channel and categories."})},
//DM MESSAGE //DM MESSAGE
@@ -415,6 +447,13 @@ export const defaultOptionsStructure = new api.ODCheckerArrayStructure("opendisc
{key:"globalMaximum",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:ticket-limits-global",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliInitDefaultValue:10,cliDisplayName:"Global Maximum",cliDisplayDescription:"The maximum amount of tickets of this type/option that are able to exist in the server at the same time."})}, {key:"globalMaximum",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:ticket-limits-global",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliInitDefaultValue:10,cliDisplayName:"Global Maximum",cliDisplayDescription:"The maximum amount of tickets of this type/option that are able to exist in the server at the same time."})},
{key:"userMaximum",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:ticket-limits-user",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliInitDefaultValue:3,cliDisplayName:"User Maximum",cliDisplayDescription:"The maximum amount of tickets of this type/option from a specific user that are able to exist in the server at the same time."})} {key:"userMaximum",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:ticket-limits-user",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliInitDefaultValue:3,cliDisplayName:"User Maximum",cliDisplayDescription:"The maximum amount of tickets of this type/option from a specific user that are able to exist in the server at the same time."})}
],cliDisplayName:"Option Limits",cliDisplayDescription:"Manage option-based limits for ticket creation to reduce the workload on your support team."}),cliDisplayName:"Limits",cliDisplayDescription:"Manage option-based limits for ticket creation to reduce the workload on your support team."})}, ],cliDisplayName:"Option Limits",cliDisplayDescription:"Manage option-based limits for ticket creation to reduce the workload on your support team."}),cliDisplayName:"Limits",cliDisplayDescription:"Manage option-based limits for ticket creation to reduce the workload on your support team."})},
//SLOW MODE
{key:"slowMode",optional:false,priority:0,checker:new api.ODCheckerEnabledObjectStructure("opendiscord:ticket-slowmode",{property:"enabled",enabledValue:true,checker:new api.ODCheckerObjectStructure("opendiscord:ticket-limits",{children:[
{key:"enabled",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("opendiscord:ticket-slowmode-enabled",{cliDisplayName:"Enabled",cliDisplayDescription:"Enable/disable ticket slow mode."})},
{key:"slowModeSeconds",optional:false,priority:0,checker:new api.ODCheckerNumberStructure("opendiscord:ticket-slowmode-seconds",{zeroAllowed:false,negativeAllowed:false,floatAllowed:false,min:1,cliInitDefaultValue:20,cliDisplayName:"Slow Mode Seconds",cliDisplayDescription:"The amount of seconds users need to wait between sending messages."})},
],cliDisplayName:"Option Slow Mode",cliDisplayDescription:"Add slow mode to this ticket option to restrict the amount of message spam users can send."}),cliDisplayName:"Slow Mode",cliDisplayDescription:"Add slow mode to this ticket option to restrict the amount of message spam users can send."})},
],cliDisplayName:"Ticket Option",cliDisplayDescription:"Manage all ticket-specific settings of this option/type."})}, ],cliDisplayName:"Ticket Option",cliDisplayDescription:"Manage all ticket-specific settings of this option/type."})},
//WEBSITE //WEBSITE
+43 -8
View File
@@ -55,21 +55,35 @@ export const defaultGeneralFormatter = new fjs.ObjectFormatter(null,true,[
new fjs.ObjectFormatter("status",true,[ new fjs.ObjectFormatter("status",true,[
new fjs.PropertyFormatter("enabled"), new fjs.PropertyFormatter("enabled"),
new fjs.PropertyFormatter("type"), new fjs.PropertyFormatter("type"),
new fjs.PropertyFormatter("mode"),
new fjs.PropertyFormatter("text"), new fjs.PropertyFormatter("text"),
new fjs.PropertyFormatter("status"), new fjs.PropertyFormatter("state"),
]), ]),
new fjs.TextFormatter(""), new fjs.TextFormatter(""),
new fjs.ObjectFormatter("system",true,[ new fjs.ObjectFormatter("system",true,[
new fjs.PropertyFormatter("removeParticipantsOnClose"),
new fjs.PropertyFormatter("replyOnTicketCreation"),
new fjs.PropertyFormatter("replyOnReactionRole"),
new fjs.PropertyFormatter("useTranslatedConfigChecker"),
new fjs.PropertyFormatter("preferSlashOverText"), new fjs.PropertyFormatter("preferSlashOverText"),
new fjs.PropertyFormatter("sendErrorOnUnknownCommand"), new fjs.PropertyFormatter("sendErrorOnUnknownCommand"),
new fjs.PropertyFormatter("questionFieldsInCodeBlock"), new fjs.PropertyFormatter("questionFieldsInCodeBlock"),
new fjs.PropertyFormatter("displayFieldsWithQuestions"),
new fjs.PropertyFormatter("showGlobalAdminsInPanelRoles"),
new fjs.PropertyFormatter("disableVerifyBars"), new fjs.PropertyFormatter("disableVerifyBars"),
new fjs.PropertyFormatter("useRedErrorEmbeds"), new fjs.PropertyFormatter("useRedErrorEmbeds"),
new fjs.PropertyFormatter("alwaysShowReason"),
new fjs.PropertyFormatter("emojiStyle"), new fjs.PropertyFormatter("emojiStyle"),
new fjs.PropertyFormatter("pinEmoji"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("replyOnTicketCreation"),
new fjs.PropertyFormatter("replyOnReactionRole"),
new fjs.PropertyFormatter("showPreAutocloseWarning"),
new fjs.PropertyFormatter("askPriorityOnTicketCreation"),
new fjs.PropertyFormatter("removeParticipantsOnClose"),
new fjs.PropertyFormatter("disableAutocloseAfterReopen"),
new fjs.PropertyFormatter("autodeleteRequiresClosedTicket"),
new fjs.PropertyFormatter("adminOnlyDeleteWithoutTranscript"),
new fjs.PropertyFormatter("allowCloseBeforeMessage"),
new fjs.PropertyFormatter("allowCloseBeforeAdminMessage"),
new fjs.PropertyFormatter("useTranslatedConfigChecker"),
new fjs.PropertyFormatter("pinFirstTicketMessage"),
new fjs.TextFormatter(""), new fjs.TextFormatter(""),
new fjs.PropertyFormatter("enableTicketClaimButtons"), new fjs.PropertyFormatter("enableTicketClaimButtons"),
new fjs.PropertyFormatter("enableTicketCloseButtons"), new fjs.PropertyFormatter("enableTicketCloseButtons"),
@@ -89,6 +103,18 @@ export const defaultGeneralFormatter = new fjs.ObjectFormatter(null,true,[
new fjs.PropertyFormatter("userMaximum"), new fjs.PropertyFormatter("userMaximum"),
]), ]),
new fjs.TextFormatter(""), new fjs.TextFormatter(""),
new fjs.ObjectFormatter("channelTopic",true,[
new fjs.PropertyFormatter("showOptionName"),
new fjs.PropertyFormatter("showOptionDescription"),
new fjs.PropertyFormatter("showOptionTopic"),
new fjs.PropertyFormatter("showClosed"),
new fjs.PropertyFormatter("showClaimed"),
new fjs.PropertyFormatter("showPinned"),
new fjs.PropertyFormatter("showPriority"),
new fjs.PropertyFormatter("showCreator"),
new fjs.PropertyFormatter("showParticipants"),
]),
new fjs.TextFormatter(""),
new fjs.ObjectFormatter("permissions",true,[ new fjs.ObjectFormatter("permissions",true,[
new fjs.PropertyFormatter("help"), new fjs.PropertyFormatter("help"),
new fjs.PropertyFormatter("panel"), new fjs.PropertyFormatter("panel"),
@@ -109,6 +135,9 @@ export const defaultGeneralFormatter = new fjs.ObjectFormatter(null,true,[
new fjs.PropertyFormatter("clear"), new fjs.PropertyFormatter("clear"),
new fjs.PropertyFormatter("autoclose"), new fjs.PropertyFormatter("autoclose"),
new fjs.PropertyFormatter("autodelete"), new fjs.PropertyFormatter("autodelete"),
new fjs.PropertyFormatter("transfer"),
new fjs.PropertyFormatter("topic"),
new fjs.PropertyFormatter("priority"),
]), ]),
new fjs.TextFormatter(""), new fjs.TextFormatter(""),
new fjs.ObjectFormatter("messages",true,[ new fjs.ObjectFormatter("messages",true,[
@@ -123,8 +152,10 @@ export const defaultGeneralFormatter = new fjs.ObjectFormatter(null,true,[
new fjs.DefaultFormatter("renaming",false), new fjs.DefaultFormatter("renaming",false),
new fjs.DefaultFormatter("moving",false), new fjs.DefaultFormatter("moving",false),
new fjs.DefaultFormatter("blacklisting",false), new fjs.DefaultFormatter("blacklisting",false),
new fjs.DefaultFormatter("roleAdding",false), new fjs.DefaultFormatter("transferring",false),
new fjs.DefaultFormatter("roleRemoving",false), new fjs.DefaultFormatter("topicChange",false),
new fjs.DefaultFormatter("priorityChange",false),
new fjs.DefaultFormatter("reactionRole",false)
]), ]),
]), ]),
]) ])
@@ -187,7 +218,7 @@ export const defaultOptionsFormatter = new fjs.ArrayFormatter(null,true,new fjs.
new fjs.PropertyFormatter("user"), new fjs.PropertyFormatter("user"),
new fjs.PropertyFormatter("category"), new fjs.PropertyFormatter("category"),
])), ])),
new fjs.PropertyFormatter("description"), new fjs.PropertyFormatter("topic"),
]), ]),
new fjs.TextFormatter(""), new fjs.TextFormatter(""),
new fjs.ObjectFormatter("dmMessage",true,[ new fjs.ObjectFormatter("dmMessage",true,[
@@ -254,6 +285,10 @@ export const defaultOptionsFormatter = new fjs.ArrayFormatter(null,true,new fjs.
new fjs.PropertyFormatter("globalMaximum"), new fjs.PropertyFormatter("globalMaximum"),
new fjs.PropertyFormatter("userMaximum"), new fjs.PropertyFormatter("userMaximum"),
]), ]),
new fjs.ObjectFormatter("slowMode",true,[
new fjs.PropertyFormatter("enabled"),
new fjs.PropertyFormatter("slowModeSeconds"),
]),
])}, ])},
{key:"type",value:"website",formatter:new fjs.ObjectFormatter(null,true,[ {key:"type",value:"website",formatter:new fjs.ObjectFormatter(null,true,[
new fjs.PropertyFormatter("id"), new fjs.PropertyFormatter("id"),
+5 -2
View File
@@ -74,7 +74,7 @@ export const loadTicketOption = (option:api.ODJsonConfig_DefaultOptionTicketType
new api.ODOptionData("opendiscord:channel-category-closed",option.channel.closedCategory), new api.ODOptionData("opendiscord:channel-category-closed",option.channel.closedCategory),
new api.ODOptionData("opendiscord:channel-category-backup",option.channel.backupCategory), new api.ODOptionData("opendiscord:channel-category-backup",option.channel.backupCategory),
new api.ODOptionData("opendiscord:channel-categories-claimed",option.channel.claimedCategory), new api.ODOptionData("opendiscord:channel-categories-claimed",option.channel.claimedCategory),
new api.ODOptionData("opendiscord:channel-description",option.channel.description), new api.ODOptionData("opendiscord:channel-topic",option.channel.topic),
new api.ODOptionData("opendiscord:dm-message-enabled",option.dmMessage.enabled), new api.ODOptionData("opendiscord:dm-message-enabled",option.dmMessage.enabled),
new api.ODOptionData("opendiscord:dm-message-text",option.dmMessage.text), new api.ODOptionData("opendiscord:dm-message-text",option.dmMessage.text),
@@ -100,7 +100,10 @@ export const loadTicketOption = (option:api.ODJsonConfig_DefaultOptionTicketType
new api.ODOptionData("opendiscord:limits-enabled",option.limits.enabled), new api.ODOptionData("opendiscord:limits-enabled",option.limits.enabled),
new api.ODOptionData("opendiscord:limits-maximum-global",option.limits.globalMaximum), new api.ODOptionData("opendiscord:limits-maximum-global",option.limits.globalMaximum),
new api.ODOptionData("opendiscord:limits-maximum-user",option.limits.userMaximum) new api.ODOptionData("opendiscord:limits-maximum-user",option.limits.userMaximum),
new api.ODOptionData("opendiscord:slowmode-enabled",option.slowMode.enabled),
new api.ODOptionData("opendiscord:slowmode-seconds",option.slowMode.slowModeSeconds)
]) ])
} }
+4 -1
View File
@@ -27,7 +27,10 @@ export const loadTicket = async (ticket:api.ODTicketJson) => {
//manage backup option (+ sync version of options with latest OT version in database) //manage backup option (+ sync version of options with latest OT version in database)
if (configOption) await optionDatabase.set("opendiscord:used-option",configOption.id.value,configOption.toJson(opendiscord.versions.get("opendiscord:version"))) if (configOption) await optionDatabase.set("opendiscord:used-option",configOption.id.value,configOption.toJson(opendiscord.versions.get("opendiscord:version")))
else if (backupOption) opendiscord.options.add(backupOption) else if (backupOption){
opendiscord.options.add(backupOption)
await optionDatabase.set("opendiscord:used-option",backupOption.id.value,backupOption.toJson(opendiscord.versions.get("opendiscord:version")))
}
else throw new api.ODSystemError("Unable to use backup option! Normal option not found in config!") else throw new api.ODSystemError("Unable to use backup option! Normal option not found in config!")
//load ticket & option //load ticket & option
+1 -1
View File
@@ -412,7 +412,7 @@ const main = async () => {
opendiscord.log("Loading client activity...","system") opendiscord.log("Loading client activity...","system")
if (opendiscord.defaults.getDefault("clientActivityLoading")){ if (opendiscord.defaults.getDefault("clientActivityLoading")){
//load config status //load config status
if (generalConfig.data.status && generalConfig.data.status.enabled) opendiscord.client.activity.setStatus(generalConfig.data.status.type,generalConfig.data.status.text,generalConfig.data.status.status) if (generalConfig.data.status && generalConfig.data.status.enabled) opendiscord.client.activity.setStatus(generalConfig.data.status.type,generalConfig.data.status.text,generalConfig.data.status.mode)
} }
await opendiscord.events.get("onClientActivityLoad").emit([opendiscord.client.activity,opendiscord.client]) await opendiscord.events.get("onClientActivityLoad").emit([opendiscord.client.activity,opendiscord.client])
await opendiscord.events.get("afterClientActivityLoaded").emit([opendiscord.client.activity,opendiscord.client]) await opendiscord.events.get("afterClientActivityLoaded").emit([opendiscord.client.activity,opendiscord.client])