BREAKING: changed openticket to opendiscord in API

This commit is contained in:
DJj123dj
2025-02-01 10:22:27 +01:00
parent ce242741cd
commit 29f8e1452c
103 changed files with 2160 additions and 2175 deletions
+7 -7
View File
@@ -1,4 +1,4 @@
import {api, openticket, utilities} from "#opendiscord"
import {api, opendiscord, utilities} from "#opendiscord"
import * as discord from "discord.js"
/////////////////////////////////////////////
@@ -19,7 +19,7 @@ declare module "#opendiscord-types" {
}
//Let's register the example config. This way it's available for all plugins & systems.
openticket.events.get("onConfigLoad").listen((configManager) => {
opendiscord.events.get("onConfigLoad").listen((configManager) => {
configManager.add(new api.ODJsonConfig("example-plugin:config","config.json","./plugins/example-plugin/"))
/*===== What did we do? =====
- "example-plugin:config" Is the ID of this config. You can use this id troughout the bot to access this config file. Even in other plugins.
@@ -29,18 +29,18 @@ openticket.events.get("onConfigLoad").listen((configManager) => {
//Let's also log it to the console to let us know it worked!
const ourConfig = configManager.get("example-plugin:config")
openticket.log("The example config loaded successfully!","plugin",[
opendiscord.log("The example config loaded successfully!","plugin",[
{key:"var-1",value:ourConfig.data.testVariable1},
{key:"var-2",value:ourConfig.data.testVariable2.toString()},
{key:"var-3",value:ourConfig.data.testVariable3.toString()}
])
})
openticket.events.get("onTicketCreate").listen((creator) => {
opendiscord.events.get("onTicketCreate").listen((creator) => {
//This is logged before the ticket is created (after the button is pressed)
openticket.log("Ticket is getting created...","plugin")
opendiscord.log("Ticket is getting created...","plugin")
})
openticket.events.get("afterTicketCreated").listen((ticket,creator,channel) => {
opendiscord.events.get("afterTicketCreated").listen((ticket,creator,channel) => {
//This is logged after the ticket is created
openticket.log("Ticket ready!","plugin")
opendiscord.log("Ticket ready!","plugin")
})
+18 -18
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET ADD USER SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:add-ticket-user"))
openticket.actions.get("openticket:add-ticket-user").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:add-ticket-user"))
opendiscord.actions.get("openticket:add-ticket-user").workers.add([
new api.ODWorker("openticket:add-ticket-user",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to add user to ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketUserAdd").emit([ticket,user,data,channel,reason])
await opendiscord.events.get("onTicketUserAdd").emit([ticket,user,data,channel,reason])
//update ticket
ticket.get("openticket:participants").value.push({type:"user",id:data.id})
@@ -31,47 +31,47 @@ export const registerActions = async () => {
ReadMessageHistory:true
})
}catch{
openticket.log("Failed to add channel permission overwrites on add-ticket-user","error")
opendiscord.log("Failed to add channel permission overwrites on add-ticket-user","error")
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket user adding!","error",[
opendiscord.log("Unable to edit ticket message on ticket user adding!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value,hidden:true}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:add-message").build(source,{guild,channel,user,ticket,reason,data})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:add-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketUserAdded").emit([ticket,user,data,channel,reason])
await opendiscord.events.get("afterTicketUserAdded").emit([ticket,user,data,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.adding.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"add",reason,additionalData:data}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"add",reason,additionalData:data}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.adding.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"add",reason,additionalData:data}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.adding.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"add",reason,additionalData:data}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket,data} = params
openticket.log(user.displayName+" added "+data.displayName+" to a ticket!","info",[
opendiscord.log(user.displayName+" added "+data.displayName+" to a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -81,7 +81,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:add-ticket-user").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:add-ticket-user").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+65 -65
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET CLAIMING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:claim-ticket"))
openticket.actions.get("openticket:claim-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:claim-ticket"))
opendiscord.actions.get("openticket:claim-ticket").workers.add([
new api.ODWorker("openticket:claim-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to claim ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketClaim").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketClaim").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:claimed").value = true
@@ -22,8 +22,8 @@ export const registerActions = async () => {
ticket.get("openticket:busy").value = true
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-claimed",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-claimed",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-claimed",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-claimed",user.id,1,"increase")
//update category
const rawClaimCategory = ticket.option.get("openticket:channel-categories-claimed").value.find((c) => c.user == user.id)
@@ -34,53 +34,53 @@ export const registerActions = async () => {
ticket.get("openticket:category-mode").value = "claimed"
ticket.get("openticket:category").value = claimCategory
}catch(e){
openticket.log("Unable to move ticket to 'claimed category'!","error",[
opendiscord.log("Unable to move ticket to 'claimed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:claimCategory}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket claiming!","error",[
opendiscord.log("Unable to edit ticket message on ticket claiming!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:claim-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:claim-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketClaimed").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketClaimed").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.claiming.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"claim",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"claim",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.claiming.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"claim",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.claiming.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"claim",reason,additionalData:null}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" claimed a ticket!","info",[
opendiscord.log(user.displayName+" claimed a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -90,7 +90,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:claim-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:claim-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
@@ -98,37 +98,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//CLAIM TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:claim-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:claim-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:claim-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:claim-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.claim
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -136,86 +136,86 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already claimed
if (ticket.get("openticket:claimed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start claiming ticket
if (params.data == "reason"){
//claim with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:claim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:claim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//claim without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:claim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:claim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:claim-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:claim-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//CLAIM TICKET UNCLAIM MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:claim-ticket-unclaim-message",openticket.builders.messages.getSafe("openticket:verifybar-unclaim-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:claim-ticket-unclaim-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:claim-ticket-unclaim-message",opendiscord.builders.messages.getSafe("openticket:verifybar-unclaim-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:claim-ticket-unclaim-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.claim
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -223,55 +223,55 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already claimed
if (ticket.get("openticket:claimed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start claiming ticket
if (params.data == "reason"){
//claim with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:claim-ticket-reason").build("unclaim-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:claim-ticket-reason").build("unclaim-message",{guild,channel,user,ticket}))
}else{
//claim without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:claim-ticket").run("unclaim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:claim-message").build("unclaim-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:claim-ticket").run("unclaim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:claim-message").build("unclaim-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:claim-ticket-unclaim-message").failure.add([
opendiscord.verifybars.get("openticket:claim-ticket-unclaim-message").failure.add([
new api.ODWorker("openticket:back-to-unclaim-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
})
])
}
+11 -11
View File
@@ -1,40 +1,40 @@
///////////////////////////////////////
//CLEAR TICKETS SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:clear-tickets"))
openticket.actions.get("openticket:clear-tickets").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:clear-tickets"))
opendiscord.actions.get("openticket:clear-tickets").workers.add([
new api.ODWorker("openticket:clear-tickets",2,async (instance,params,source,cancel) => {
const {guild,channel,user,filter,list} = params
await openticket.events.get("onTicketsClear").emit([list,user,channel,filter])
await opendiscord.events.get("onTicketsClear").emit([list,user,channel,filter])
const nameList: string[] = []
for (const ticket of list){
const ticketChannel = await openticket.tickets.getTicketChannel(ticket)
const ticketChannel = await opendiscord.tickets.getTicketChannel(ticket)
if (!ticketChannel) return
nameList.push("#"+ticketChannel.name)
await openticket.actions.get("openticket:delete-ticket").run("clear",{guild,channel:ticketChannel,user,ticket,reason:"Cleared Ticket",sendMessage:true,withoutTranscript:false})
await opendiscord.actions.get("openticket:delete-ticket").run("clear",{guild,channel:ticketChannel,user,ticket,reason:"Cleared Ticket",sendMessage:true,withoutTranscript:false})
}
instance.list = nameList
await openticket.events.get("afterTicketsCleared").emit([list,user,channel,filter])
await opendiscord.events.get("afterTicketsCleared").emit([list,user,channel,filter])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,filter,list} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.deleting.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:clear-logs").build(source,{guild,channel,user,filter,list:instance.list ?? []}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:clear-logs").build(source,{guild,channel,user,filter,list:instance.list ?? []}))
}
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,user,filter,list} = params
openticket.log(user.displayName+" cleared "+list.length+" tickets!","info",[
opendiscord.log(user.displayName+" cleared "+list.length+" tickets!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"method",value:source},
+66 -66
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET CLOSING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:close-ticket"))
openticket.actions.get("openticket:close-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:close-ticket"))
opendiscord.actions.get("openticket:close-ticket").workers.add([
new api.ODWorker("openticket:close-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to close ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketClose").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketClose").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:closed").value = true
@@ -24,8 +24,8 @@ export const registerActions = async () => {
ticket.get("openticket:busy").value = true
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-closed",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-closed",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-closed",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-closed",user.id,1,"increase")
//update category
const closeCategory = ticket.option.get("openticket:channel-category-closed").value
@@ -35,12 +35,12 @@ export const registerActions = async () => {
ticket.get("openticket:category-mode").value = "closed"
ticket.get("openticket:category").value = closeCategory
}catch(e){
openticket.log("Unable to move ticket to 'closed category'!","error",[
opendiscord.log("Unable to move ticket to 'closed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:closeCategory}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
@@ -51,7 +51,7 @@ export const registerActions = async () => {
allow:[],
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
}]
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
const globalAdmins = opendiscord.configs.get("openticket:general").data.globalAdmins
const optionAdmins = ticket.option.get("openticket:admins").value
const readonlyAdmins = ticket.option.get("openticket:admins-readonly").value
@@ -102,43 +102,43 @@ export const registerActions = async () => {
channel.permissionOverwrites.set(permissions)
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket closing!","error",[
opendiscord.log("Unable to edit ticket message on ticket closing!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:close-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:close-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketClosed").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketClosed").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.closing.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"close",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"close",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.closing.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"close",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.closing.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"close",reason,additionalData:null}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" closed a ticket!","info",[
opendiscord.log(user.displayName+" closed a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -148,7 +148,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:close-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:close-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
@@ -156,37 +156,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//CLOSE TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:close-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:close-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:close-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:close-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.close
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -194,86 +194,86 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already closed
if (ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start closing ticket
if (params.data == "reason"){
//close with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:close-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:close-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//close without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:close-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:close-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:close-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:close-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//CLOSE TICKET REOPEN MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:close-ticket-reopen-message",openticket.builders.messages.getSafe("openticket:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:close-ticket-reopen-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:close-ticket-reopen-message",opendiscord.builders.messages.getSafe("openticket:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:close-ticket-reopen-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.close
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -281,55 +281,55 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already closed
if (ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start closing ticket
if (params.data == "reason"){
//close with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:close-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:close-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
}else{
//close without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:close-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:close-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:close-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:close-ticket-reopen-message").failure.add([
opendiscord.verifybars.get("openticket:close-ticket-reopen-message").failure.add([
new api.ODWorker("openticket:back-to-reopen-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
})
])
}
+30 -30
View File
@@ -1,26 +1,26 @@
///////////////////////////////////////
//TICKET CREATION SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:create-ticket"))
openticket.actions.get("openticket:create-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:create-ticket"))
opendiscord.actions.get("openticket:create-ticket").workers.add([
new api.ODWorker("openticket:create-ticket",3,async (instance,params,source,cancel) => {
const {guild,user,answers,option} = params
await openticket.events.get("onTicketCreate").emit([user])
await openticket.events.get("onTicketChannelCreation").emit([option,user])
await opendiscord.events.get("onTicketCreate").emit([user])
await opendiscord.events.get("onTicketChannelCreation").emit([option,user])
//get channel properties
const channelPrefix = option.get("openticket:channel-prefix").value
const channelCategory = option.get("openticket:channel-category").value
const channelBackupCategory = option.get("openticket:channel-category-backup").value
const channelDescription = option.get("openticket:channel-description").value
const channelSuffix = openticket.options.suffix.getSuffixFromOption(option,user)
const channelSuffix = opendiscord.options.suffix.getSuffixFromOption(option,user)
const channelName = channelPrefix+channelSuffix
//handle category
@@ -28,10 +28,10 @@ export const registerActions = async () => {
let categoryMode: "backup"|"normal"|null = null
if (channelCategory != ""){
//category enabled
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
openticket.log("Ticket Creation Error: Unable to find category! #1","error",[
opendiscord.log("Ticket Creation Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
@@ -39,10 +39,10 @@ export const registerActions = async () => {
//default category was found
if (normalCategory.children.cache.size >= 50 && channelBackupCategory != ""){
//use backup category
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
const backupCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
openticket.log("Ticket Creation Error: Unable to find category! #2","error",[
opendiscord.log("Ticket Creation Error: Unable to find category! #2","error",[
{key:"categoryid",value:channelBackupCategory},
{key:"backup",value:"true"}
])
@@ -65,7 +65,7 @@ export const registerActions = async () => {
allow:[],
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
}]
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
const globalAdmins = opendiscord.configs.get("openticket:general").data.globalAdmins
const optionAdmins = option.get("openticket:admins").value
const readonlyAdmins = option.get("openticket:admins-readonly").value
@@ -114,7 +114,7 @@ export const registerActions = async () => {
permissionOverwrites:permissions
})
await openticket.events.get("afterTicketChannelCreated").emit([option,channel,user])
await opendiscord.events.get("afterTicketChannelCreated").emit([option,channel,user])
//create participants
const participants: {type:"role"|"user",id:string}[] = []
@@ -159,43 +159,43 @@ export const registerActions = async () => {
])
//manage stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-created",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-created",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-created",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-created",user.id,1,"increase")
//manage bot permissions
await openticket.events.get("onTicketPermissionsCreated").emit([option,openticket.permissions,channel,user])
await opendiscord.events.get("onTicketPermissionsCreated").emit([option,opendiscord.permissions,channel,user])
await (await import("../data/framework/permissionLoader.js")).addTicketPermissions(ticket)
await openticket.events.get("afterTicketPermissionsCreated").emit([option,openticket.permissions,channel,user])
await opendiscord.events.get("afterTicketPermissionsCreated").emit([option,opendiscord.permissions,channel,user])
//export channel & ticket
instance.channel = channel
instance.ticket = ticket
openticket.tickets.add(ticket)
opendiscord.tickets.add(ticket)
}),
new api.ODWorker("openticket:send-ticket-message",2,async (instance,params,source,cancel) => {
const {guild,user,answers,option} = params
const {ticket,channel} = instance
if (!ticket || !channel) return openticket.log("Ticket Creation Error: Unable to send ticket message. Previous worker failed!","error")
if (!ticket || !channel) return opendiscord.log("Ticket Creation Error: Unable to send ticket message. Previous worker failed!","error")
await openticket.events.get("onTicketMainMessageCreated").emit([ticket,channel,user])
await opendiscord.events.get("onTicketMainMessageCreated").emit([ticket,channel,user])
//check if ticket message is enabled
if (!option.get("openticket:ticket-message-enabled").value) return
try {
const msg = await channel.send((await openticket.builders.messages.getSafe("openticket:ticket-message").build(source,{guild,channel,user,ticket})).message)
const msg = await channel.send((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build(source,{guild,channel,user,ticket})).message)
ticket.get("openticket:ticket-message").value = msg.id
//manage stats
await openticket.stats.get("openticket:ticket").setStat("openticket:messages-sent",ticket.id.value,1,"increase")
await opendiscord.stats.get("openticket:ticket").setStat("openticket:messages-sent",ticket.id.value,1,"increase")
await openticket.events.get("afterTicketMainMessageCreated").emit([ticket,msg,channel,user])
await opendiscord.events.get("afterTicketMainMessageCreated").emit([ticket,msg,channel,user])
}catch(err){
process.emit("uncaughtException",err)
//something went wrong while sending the ticket message
channel.send((await openticket.builders.messages.getSafe("openticket:error").build("other",{guild,channel,user,error:"Ticket Message: Creation Error!\n=> Ticket Is Still Created Succesfully",layout:"advanced"})).message)
channel.send((await opendiscord.builders.messages.getSafe("openticket:error").build("other",{guild,channel,user,error:"Ticket Message: Creation Error!\n=> Ticket Is Still Created Succesfully",layout:"advanced"})).message)
}
await openticket.events.get("afterTicketCreated").emit([ticket,user,channel])
await opendiscord.events.get("afterTicketCreated").emit([ticket,user,channel])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,user,answers,option} = params
@@ -203,20 +203,20 @@ export const registerActions = async () => {
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.creation.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-created-logs").build(source,{guild,channel,user,ticket}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-created-logs").build(source,{guild,channel,user,ticket}))
}
//to dm
if (generalConfig.data.system.messages.creation.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-created-dm").build(source,{guild,channel,user,ticket}))
if (generalConfig.data.system.messages.creation.dm) await opendiscord.client.sendUserDm(user,await opendiscord.builders.messages.getSafe("openticket:ticket-created-dm").build(source,{guild,channel,user,ticket}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,user,answers,option} = params
const {ticket,channel} = instance
if (!ticket || !channel) return openticket.log("Ticket Creation Error: Unable to create logs. Previous worker failed!","error")
if (!ticket || !channel) return opendiscord.log("Ticket Creation Error: Unable to create logs. Previous worker failed!","error")
openticket.log(user.displayName+" created a ticket!","info",[
opendiscord.log(user.displayName+" created a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
+16 -16
View File
@@ -1,17 +1,17 @@
///////////////////////////////////////
//TICKET CREATION SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:create-ticket-permissions"))
openticket.actions.get("openticket:create-ticket-permissions").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:create-ticket-permissions"))
opendiscord.actions.get("openticket:create-ticket-permissions").workers.add([
new api.ODWorker("openticket:check-blacklist",4,(instance,params,source,cancel) => {
if (!params.option.get("openticket:allow-blacklisted-users").value && openticket.blacklist.exists(params.user.id)){
if (!params.option.get("openticket:allow-blacklisted-users").value && opendiscord.blacklist.exists(params.user.id)){
instance.valid = false
instance.reason = "blacklist"
openticket.log(params.user.displayName+" tried to create a ticket but is blacklisted!","info",[
opendiscord.log(params.user.displayName+" tried to create a ticket but is blacklisted!","info",[
{key:"user",value:params.user.username},
{key:"userid",value:params.user.id,hidden:true},
{key:"option",value:params.option.id.value}
@@ -20,14 +20,14 @@ export const registerActions = async () => {
}
}),
new api.ODWorker("openticket:check-cooldown",3,(instance,params,source,cancel) => {
const cooldown = openticket.cooldowns.get("openticket:option-cooldown_"+params.option.id.value)
const cooldown = opendiscord.cooldowns.get("openticket:option-cooldown_"+params.option.id.value)
if (cooldown && cooldown instanceof api.ODTimeoutCooldown && cooldown.use(params.user.id)){
instance.valid = false
instance.reason = "cooldown"
const remaining = cooldown.remaining(params.user.id) ?? 0
instance.cooldownUntil = new Date(new Date().getTime() + remaining)
openticket.log(params.user.displayName+" tried to create a ticket but is on cooldown!","info",[
opendiscord.log(params.user.displayName+" tried to create a ticket but is on cooldown!","info",[
{key:"user",value:params.user.username},
{key:"userid",value:params.user.id,hidden:true},
{key:"option",value:params.option.id.value},
@@ -37,18 +37,18 @@ export const registerActions = async () => {
}
}),
new api.ODWorker("openticket:check-global-limits",2,(instance,params,source,cancel) => {
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig.data.system.limits.enabled) return
const allTickets = openticket.tickets.getAll()
const allTickets = opendiscord.tickets.getAll()
const globalTicketCount = allTickets.length
const userTickets = openticket.tickets.getFiltered((ticket) => ticket.exists("openticket:opened-by") && (ticket.get("openticket:opened-by").value == params.user.id))
const userTickets = opendiscord.tickets.getFiltered((ticket) => ticket.exists("openticket:opened-by") && (ticket.get("openticket:opened-by").value == params.user.id))
const userTicketCount = userTickets.length
if (globalTicketCount >= generalConfig.data.system.limits.globalMaximum){
instance.valid = false
instance.reason = "global-limit"
openticket.log(params.user.displayName+" tried to create a ticket but reached the limit!","info",[
opendiscord.log(params.user.displayName+" tried to create a ticket but reached the limit!","info",[
{key:"user",value:params.user.username},
{key:"userid",value:params.user.id,hidden:true},
{key:"option",value:params.option.id.value},
@@ -58,7 +58,7 @@ export const registerActions = async () => {
}else if (userTicketCount >= generalConfig.data.system.limits.userMaximum){
instance.valid = false
instance.reason = "global-user-limit"
openticket.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
opendiscord.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
{key:"user",value:params.user.username},
{key:"userid",value:params.user.id,hidden:true},
{key:"option",value:params.option.id.value},
@@ -70,15 +70,15 @@ export const registerActions = async () => {
new api.ODWorker("openticket:check-option-limits",1,(instance,params,source,cancel) => {
if (!params.option.exists("openticket:limits-enabled") || !params.option.get("openticket:limits-enabled").value) return
const allTickets = openticket.tickets.getFiltered((ticket) => ticket.option.id.value == params.option.id.value)
const allTickets = opendiscord.tickets.getFiltered((ticket) => ticket.option.id.value == params.option.id.value)
const globalTicketCount = allTickets.length
const userTickets = openticket.tickets.getFiltered((ticket) => ticket.option.id.value == params.option.id.value && ticket.exists("openticket:opened-by") && (ticket.get("openticket:opened-by").value == params.user.id))
const userTickets = opendiscord.tickets.getFiltered((ticket) => ticket.option.id.value == params.option.id.value && ticket.exists("openticket:opened-by") && (ticket.get("openticket:opened-by").value == params.user.id))
const userTicketCount = userTickets.length
if (globalTicketCount >= params.option.get("openticket:limits-maximum-global").value){
instance.valid = false
instance.reason = "option-limit"
openticket.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
opendiscord.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
{key:"user",value:params.user.username},
{key:"userid",value:params.user.id,hidden:true},
{key:"option",value:params.option.id.value},
@@ -88,7 +88,7 @@ export const registerActions = async () => {
}else if (userTicketCount >= params.option.get("openticket:limits-maximum-user").value){
instance.valid = false
instance.reason = "option-user-limit"
openticket.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
opendiscord.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
{key:"user",value:params.user.username},
{key:"userid",value:params.user.id,hidden:true},
{key:"option",value:params.option.id.value},
+24 -24
View File
@@ -1,23 +1,23 @@
///////////////////////////////////////
//TRANSCRIPT CREATION SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const transcriptConfig = openticket.configs.get("openticket:transcripts")
const transcriptConfig = opendiscord.configs.get("openticket:transcripts")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:create-transcript"))
openticket.actions.get("openticket:create-transcript").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:create-transcript"))
opendiscord.actions.get("openticket:create-transcript").workers.add([
new api.ODWorker("openticket:select-compiler",4,async (instance,params,source,cancel) => {
const {channel,user,ticket} = params
if (channel.type != discord.ChannelType.GuildText) return cancel()
if (!transcriptConfig.data.general.enabled) return cancel()
await openticket.events.get("onTranscriptCreate").emit([openticket.transcripts,ticket,channel,user])
await opendiscord.events.get("onTranscriptCreate").emit([opendiscord.transcripts,ticket,channel,user])
instance.errorReason = null
const participants = await openticket.tickets.getAllTicketParticipants(params.ticket)
const participants = await opendiscord.tickets.getAllTicketParticipants(params.ticket)
if (!participants){
instance.pendingMessage = null
instance.errorReason = "Unable to fetch ticket channel participants!"
@@ -26,8 +26,8 @@ export const registerActions = async () => {
instance.participants = participants
//select transcript compiler
if (transcriptConfig.data.general.mode == "text") instance.compiler = openticket.transcripts.get("openticket:text-compiler")
else if (transcriptConfig.data.general.mode == "html") instance.compiler = openticket.transcripts.get("openticket:html-compiler")
if (transcriptConfig.data.general.mode == "text") instance.compiler = opendiscord.transcripts.get("openticket:text-compiler")
else if (transcriptConfig.data.general.mode == "html") instance.compiler = opendiscord.transcripts.get("openticket:html-compiler")
}),
new api.ODWorker("openticket:init-transcript",3,async (instance,params,source,cancel) => {
const {channel,user,ticket} = params
@@ -35,13 +35,13 @@ export const registerActions = async () => {
if (!transcriptConfig.data.general.enabled) return cancel()
//run transcript compiler init()
await openticket.events.get("onTranscriptInit").emit([openticket.transcripts,ticket,channel,user])
await opendiscord.events.get("onTranscriptInit").emit([opendiscord.transcripts,ticket,channel,user])
if (instance.compiler.init){
try{
const result = await instance.compiler.init(ticket,channel,user)
if (result.success && result.pendingMessage && transcriptConfig.data.general.enableChannel){
//send init message to channel
const post = openticket.posts.get("openticket:transcripts")
const post = opendiscord.posts.get("openticket:transcripts")
if (post){
instance.pendingMessage = await post.send(result.pendingMessage)
}
@@ -57,7 +57,7 @@ export const registerActions = async () => {
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler init()! (see error above)")
}
}
await openticket.events.get("afterTranscriptInitiated").emit([openticket.transcripts,ticket,channel,user])
await opendiscord.events.get("afterTranscriptInitiated").emit([opendiscord.transcripts,ticket,channel,user])
}),
new api.ODWorker("openticket:compile-transcript",2,async (instance,params,source,cancel) => {
const {channel,user,ticket} = params
@@ -69,7 +69,7 @@ export const registerActions = async () => {
}
//run transcript compiler compile()
await openticket.events.get("onTranscriptCompile").emit([openticket.transcripts,ticket,channel,user])
await opendiscord.events.get("onTranscriptCompile").emit([opendiscord.transcripts,ticket,channel,user])
if (instance.compiler.compile){
try{
const result = await instance.compiler.compile(ticket,channel,user)
@@ -87,7 +87,7 @@ export const registerActions = async () => {
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler compile()! (see error above)")
}
}
await openticket.events.get("afterTranscriptCompiled").emit([openticket.transcripts,ticket,channel,user])
await opendiscord.events.get("afterTranscriptCompiled").emit([opendiscord.transcripts,ticket,channel,user])
}),
new api.ODWorker("openticket:ready-transcript",1,async (instance,params,source,cancel) => {
if (!instance.result){
@@ -98,7 +98,7 @@ export const registerActions = async () => {
//run transcript compiler ready()
utilities.runAsync(async () => {
await openticket.events.get("onTranscriptReady").emit([openticket.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
await opendiscord.events.get("onTranscriptReady").emit([opendiscord.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
if (instance.compiler.ready){
try{
const {channelMessage,creatorDmMessage,participantDmMessage,activeAdminDmMessage,everyAdminDmMessage} = await instance.compiler.ready(instance.result)
@@ -110,7 +110,7 @@ export const registerActions = async () => {
instance.pendingMessage.message.edit(channelMessage.message)
}else{
//send ready message to channel
const post = openticket.posts.get("openticket:transcripts")
const post = opendiscord.posts.get("openticket:transcripts")
if (post) await post.send(channelMessage)
}
}
@@ -120,16 +120,16 @@ export const registerActions = async () => {
for (const p of instance.participants){
if (p.role == "creator" && transcriptConfig.data.general.enableCreatorDM && creatorDmMessage){
//send creator dm message
await openticket.client.sendUserDm(p.user,creatorDmMessage)
await opendiscord.client.sendUserDm(p.user,creatorDmMessage)
}else if (p.role == "participant" && transcriptConfig.data.general.enableParticipantDM && participantDmMessage){
//send participant dm message
await openticket.client.sendUserDm(p.user,participantDmMessage)
await opendiscord.client.sendUserDm(p.user,participantDmMessage)
}else if (p.role == "admin" && transcriptConfig.data.general.enableActiveAdminDM && instance.result.success && instance.result.messages && instance.result.messages.some((msg) => msg.author.id == p.user.id) && activeAdminDmMessage){
//send active admin dm message
await openticket.client.sendUserDm(p.user,activeAdminDmMessage)
await opendiscord.client.sendUserDm(p.user,activeAdminDmMessage)
}else if (p.role == "admin" && transcriptConfig.data.general.enableEveryAdminDM && everyAdminDmMessage){
//send every admin dm message
await openticket.client.sendUserDm(p.user,everyAdminDmMessage)
await opendiscord.client.sendUserDm(p.user,everyAdminDmMessage)
}
}
}
@@ -141,17 +141,17 @@ export const registerActions = async () => {
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler ready()! (see error above)")
}
}
await openticket.events.get("afterTranscriptReady").emit([openticket.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
await opendiscord.events.get("afterTranscriptReady").emit([opendiscord.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
})
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:transcripts-created",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:transcripts-created",params.user.id,1,"increase")
await openticket.events.get("afterTranscriptCreated").emit([openticket.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
await opendiscord.stats.get("openticket:global").setStat("openticket:transcripts-created",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:transcripts-created",params.user.id,1,"increase")
await opendiscord.events.get("afterTranscriptCreated").emit([opendiscord.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {user,channel,ticket} = params
openticket.log(user.displayName+" created a transcript!","info",[
opendiscord.log(user.displayName+" created a transcript!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
+111 -111
View File
@@ -1,55 +1,55 @@
///////////////////////////////////////
//TICKET DELETION SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:delete-ticket"))
openticket.actions.get("openticket:delete-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:delete-ticket"))
opendiscord.actions.get("openticket:delete-ticket").workers.add([
new api.ODWorker("openticket:delete-ticket",3,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to delete ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketDelete").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketDelete").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:for-deletion").value = true
ticket.get("openticket:busy").value = true
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket deletion!","error",[
opendiscord.log("Unable to edit ticket message on ticket deletion!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:delete-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:delete-message").build(source,{guild,channel,user,ticket,reason})).message)
//create transcript
if (!params.withoutTranscript){
const transcriptRes = await openticket.actions.get("openticket:create-transcript").run(source,{guild,channel,user,ticket})
const transcriptRes = await opendiscord.actions.get("openticket:create-transcript").run(source,{guild,channel,user,ticket})
//transcript failure
if (typeof transcriptRes.success == "boolean" && !transcriptRes.success && transcriptRes.compiler){
const {compiler} = transcriptRes
await channel.send((await openticket.builders.messages.getSafe("openticket:transcript-error").build(source,{guild,channel,user,ticket,compiler,reason:transcriptRes.errorReason ?? null})).message)
.catch((reason) => openticket.log("Unable to send transcript failure to ticket channel!","error",[{key:"id",value:channel.id}]))
await channel.send((await opendiscord.builders.messages.getSafe("openticket:transcript-error").build(source,{guild,channel,user,ticket,compiler,reason:transcriptRes.errorReason ?? null})).message)
.catch((reason) => opendiscord.log("Unable to send transcript failure to ticket channel!","error",[{key:"id",value:channel.id}]))
//undo deletion
ticket.get("openticket:for-deletion").value = false
ticket.get("openticket:busy").value = false
openticket.log("Canceled ticket deletion because of transcript system malfunction!","warning",[
opendiscord.log("Canceled ticket deletion because of transcript system malfunction!","warning",[
{key:"compiler",value:compiler.id.value},
{key:"reason",value:transcriptRes.errorReason ?? "/"},
])
@@ -58,11 +58,11 @@ export const registerActions = async () => {
}
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-deleted",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-deleted",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-deleted",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-deleted",user.id,1,"increase")
//delete ticket from manager
openticket.tickets.remove(ticket.id)
opendiscord.tickets.remove(ticket.id)
//delete permissions from manager
await (await import("../data/framework/permissionLoader.js")).removeTicketPermissions(ticket)
@@ -73,30 +73,30 @@ export const registerActions = async () => {
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.deleting.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"delete",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"delete",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.deleting.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"delete",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.deleting.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"delete",reason,additionalData:null}))
}),
new api.ODWorker("openticket:delete-channel",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//delete channel & events
await openticket.events.get("onTicketChannelDeletion").emit([ticket,channel,user])
await channel.delete("Ticket Deleted").catch((reason) => openticket.log("Unable to delete ticket channel!","error",[{key:"id",value:channel.id}]))
await openticket.events.get("afterTicketChannelDeleted").emit([ticket,user])
await opendiscord.events.get("onTicketChannelDeletion").emit([ticket,channel,user])
await channel.delete("Ticket Deleted").catch((reason) => opendiscord.log("Unable to delete ticket channel!","error",[{key:"id",value:channel.id}]))
await opendiscord.events.get("afterTicketChannelDeleted").emit([ticket,user])
//delete permissions from manager
await (await import("../data/framework/permissionLoader.js")).removeTicketPermissions(ticket)
await openticket.events.get("afterTicketDeleted").emit([ticket,user,reason])
await opendiscord.events.get("afterTicketDeleted").emit([ticket,user,reason])
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" deleted a ticket!","info",[
opendiscord.log(user.displayName+" deleted a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -107,7 +107,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:delete-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:delete-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
params.ticket.get("openticket:for-deletion").value = false
@@ -116,37 +116,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//DELETE TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:delete-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:delete-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -154,84 +154,84 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start deleting ticket
if (params.data == "reason"){
//delete with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:delete-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//delete without reason
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true,withoutTranscript:(params.data == "no-transcript")})
opendiscord.actions.get("openticket:delete-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true,withoutTranscript:(params.data == "no-transcript")})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:delete-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:delete-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//DELETE TICKET CLOSE MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-close-message",openticket.builders.messages.getSafe("openticket:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:delete-ticket-close-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-close-message",opendiscord.builders.messages.getSafe("openticket:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:delete-ticket-close-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -239,88 +239,88 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start deleting ticket
if (params.data == "reason"){
//delete with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("close-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:delete-ticket-reason").build("close-message",{guild,channel,user,ticket}))
}else{
//delete without reason
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
opendiscord.actions.get("openticket:delete-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("close-message",{guild,channel,user,ticket,reason:null}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("close-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:delete-ticket-close-message").failure.add([
opendiscord.verifybars.get("openticket:delete-ticket-close-message").failure.add([
new api.ODWorker("openticket:back-to-close-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
})
])
//DELETE TICKET REOPEN MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-reopen-message",openticket.builders.messages.getSafe("openticket:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:delete-ticket-reopen-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-reopen-message",opendiscord.builders.messages.getSafe("openticket:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:delete-ticket-reopen-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -328,88 +328,88 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start deleting ticket
if (params.data == "reason"){
//delete with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:delete-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
}else{
//delete without reason
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
opendiscord.actions.get("openticket:delete-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:delete-ticket-reopen-message").failure.add([
opendiscord.verifybars.get("openticket:delete-ticket-reopen-message").failure.add([
new api.ODWorker("openticket:back-to-reopen-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
})
])
//DELETE TICKET AUTOCLOSE MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-autoclose-message",openticket.builders.messages.getSafe("openticket:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:delete-ticket-autoclose-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-autoclose-message",opendiscord.builders.messages.getSafe("openticket:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:delete-ticket-autoclose-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -417,50 +417,50 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start deleting ticket
if (params.data == "reason"){
//delete with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:delete-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
}else{
//delete without reason
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
opendiscord.actions.get("openticket:delete-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:delete-ticket-autoclose-message").failure.add([
opendiscord.verifybars.get("openticket:delete-ticket-autoclose-message").failure.add([
new api.ODWorker("openticket:back-to-autoclose-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:autoclose-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:autoclose-message").build("other",{guild,channel,user,ticket}))
})
])
}
+34 -34
View File
@@ -1,43 +1,43 @@
///////////////////////////////////////
//TRANSCRIPT ERROR SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerButtonResponders = async () => {
//TRANSCRIPT ERROR RETRY
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:transcript-error-retry",/^od:transcript-error-retry_([^_]+)/))
openticket.responders.buttons.get("openticket:transcript-error-retry").workers.add([
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:transcript-error-retry",/^od:transcript-error-retry_([^_]+)/))
opendiscord.responders.buttons.get("openticket:transcript-error-retry").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -48,33 +48,33 @@ export const registerButtonResponders = async () => {
if (originalSource != "slash" && originalSource != "text" && originalSource != "ticket-message" && originalSource != "reopen-message" && originalSource != "close-message" && originalSource != "other") return
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start deleting ticket (without reason)
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason:"Transcript Error (Retried)",sendMessage:false,withoutTranscript:false})
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason:"Transcript Error (Retried)",sendMessage:false,withoutTranscript:false})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason:"Transcript Error (Retried)"}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason:"Transcript Error (Retried)"}))
}),
new api.ODWorker("openticket:logs",-1,async (instance,params,source,cancel) => {
const {user,channel} = instance
if (channel.isDMBased()) return
openticket.log(user.displayName+" retried deleting a ticket with transcript!","info",[
opendiscord.log(user.displayName+" retried deleting a ticket with transcript!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -85,37 +85,37 @@ export const registerButtonResponders = async () => {
])
//TRANSCRIPT ERROR CONTINUE
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:transcript-error-continue",/^od:transcript-error-continue_([^_]+)/))
openticket.responders.buttons.get("openticket:transcript-error-continue").workers.add([
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:transcript-error-continue",/^od:transcript-error-continue_([^_]+)/))
opendiscord.responders.buttons.get("openticket:transcript-error-continue").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -126,33 +126,33 @@ export const registerButtonResponders = async () => {
if (originalSource != "slash" && originalSource != "text" && originalSource != "ticket-message" && originalSource != "reopen-message" && originalSource != "close-message" && originalSource != "other") return
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start deleting ticket (without reason)
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason:"Transcript Error (Continued)",sendMessage:false,withoutTranscript:true})
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason:"Transcript Error (Continued)",sendMessage:false,withoutTranscript:true})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason:"Transcript Error (Continued)"}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason:"Transcript Error (Continued)"}))
}),
new api.ODWorker("openticket:logs",-1,async (instance,params,source,cancel) => {
const {user,channel} = instance
if (channel.isDMBased()) return
openticket.log(user.displayName+" continued deleting a ticket without transcript!","info",[
opendiscord.log(user.displayName+" continued deleting a ticket without transcript!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
+7 -7
View File
@@ -1,30 +1,30 @@
///////////////////////////////////////
//VERIFYBAR SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
export const registerButtonResponders = async () => {
//VERIFYBAR SUCCESS
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:verifybar-success",/^od:verifybar-success_([^_]+)/))
openticket.responders.buttons.get("openticket:verifybar-success").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:verifybar-success",/^od:verifybar-success_([^_]+)/))
opendiscord.responders.buttons.get("openticket:verifybar-success").workers.add(
new api.ODWorker("openticket:handle-verifybar",0,async (instance,params,source,cancel) => {
const id = instance.interaction.customId.split("_")[1]
const customData = instance.interaction.customId.split("_")[2] as string|undefined
const verifybar = openticket.verifybars.get(id)
const verifybar = opendiscord.verifybars.get(id)
if (!verifybar) return
if (verifybar.success) await verifybar.success.executeWorkers(instance,"verifybar",{data:customData ?? null,verifybarMessage:instance.message})
})
)
//VERIFYBAR FAILURE
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:verifybar-failure",/^od:verifybar-failure_([^_]+)/))
openticket.responders.buttons.get("openticket:verifybar-failure").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:verifybar-failure",/^od:verifybar-failure_([^_]+)/))
opendiscord.responders.buttons.get("openticket:verifybar-failure").workers.add(
new api.ODWorker("openticket:handle-verifybar",0,async (instance,params,source,cancel) => {
const id = instance.interaction.customId.split("_")[1]
const customData = instance.interaction.customId.split("_")[2] as string|undefined
const verifybar = openticket.verifybars.get(id)
const verifybar = opendiscord.verifybars.get(id)
if (!verifybar) return
if (verifybar.failure) await verifybar.failure.executeWorkers(instance,"verifybar",{data:customData ?? null,verifybarMessage:instance.message})
})
+30 -30
View File
@@ -1,24 +1,24 @@
///////////////////////////////////////
//TICKET MOVING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:move-ticket"))
openticket.actions.get("openticket:move-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:move-ticket"))
opendiscord.actions.get("openticket:move-ticket").workers.add([
new api.ODWorker("openticket:move-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to move ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketMove").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketMove").emit([ticket,user,channel,reason])
ticket.option = data
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-moved",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-moved",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-moved",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-moved",user.id,1,"increase")
//get new channel properties
const channelPrefix = ticket.option.get("openticket:channel-prefix").value
@@ -44,10 +44,10 @@ export const registerActions = async () => {
categoryMode = "closed"
}else if (channelCategory != ""){
//category enabled
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
openticket.log("Ticket Move Error: Unable to find category! #1","error",[
opendiscord.log("Ticket Move Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
@@ -55,10 +55,10 @@ export const registerActions = async () => {
//default category was found
if (normalCategory.children.cache.size >= 50 && channelBackupCategory != ""){
//use backup category
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
const backupCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
openticket.log("Ticket Move Error: Unable to find category! #2","error",[
opendiscord.log("Ticket Move Error: Unable to find category! #2","error",[
{key:"categoryid",value:channelBackupCategory},
{key:"backup",value:"true"}
])
@@ -77,17 +77,17 @@ export const registerActions = async () => {
try {
//only move category when not the same.
if (channel.parentId != category) await utilities.timedAwait(channel.setParent(category,{lockPermissions:false}),2500,(err) => {
openticket.log("Failed to change channel category on ticket move","error")
opendiscord.log("Failed to change channel category on ticket move","error")
})
ticket.get("openticket:category-mode").value = categoryMode
ticket.get("openticket:category").value = category
}catch(e){
openticket.log("Unable to move ticket to 'moved category'!","error",[
opendiscord.log("Unable to move ticket to 'moved category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:category ?? "/"}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
//handle permissions
@@ -97,7 +97,7 @@ export const registerActions = async () => {
allow:[],
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
}]
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
const globalAdmins = opendiscord.configs.get("openticket:general").data.globalAdmins
const optionAdmins = ticket.option.get("openticket:admins").value
const readonlyAdmins = ticket.option.get("openticket:admins-readonly").value
@@ -140,7 +140,7 @@ export const registerActions = async () => {
try{
await channel.permissionOverwrites.set(permissions)
}catch{
openticket.log("Failed to reset channel permissions on ticket move!","error")
opendiscord.log("Failed to reset channel permissions on ticket move!","error")
}
//handle participants
@@ -158,53 +158,53 @@ export const registerActions = async () => {
const originalName = channel.name
try{
await utilities.timedAwait(channel.setName(channelName),2500,(err) => {
openticket.log("Failed to rename channel on ticket move","error")
opendiscord.log("Failed to rename channel on ticket move","error")
})
}catch(err){
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:channelName})).message)
await channel.send((await opendiscord.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:channelName})).message)
}
try{
if (channel.type == discord.ChannelType.GuildText) channel.setTopic(channelDescription)
}catch{}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket renaming!","error",[
opendiscord.log("Unable to edit ticket message on ticket renaming!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:move-message").build(source,{guild,channel,user,ticket,reason,data})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:move-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketMoved").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketMoved").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.moving.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"move",reason,additionalData:data}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"move",reason,additionalData:data}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.moving.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"move",reason,additionalData:data}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.moving.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"move",reason,additionalData:data}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" moved a ticket!","info",[
opendiscord.log(user.displayName+" moved a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -214,7 +214,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:move-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:move-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+65 -65
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET PINNING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:pin-ticket"))
openticket.actions.get("openticket:pin-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:pin-ticket"))
opendiscord.actions.get("openticket:pin-ticket").workers.add([
new api.ODWorker("openticket:pin-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to pin ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketPin").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketPin").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:pinned").value = true
@@ -22,8 +22,8 @@ export const registerActions = async () => {
ticket.get("openticket:busy").value = true
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-pinned",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-pinned",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-pinned",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-pinned",user.id,1,"increase")
//move to top of category
if (channel.parent){
@@ -35,50 +35,50 @@ export const registerActions = async () => {
const newName = "📌"+channel.name
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
openticket.log("Failed to rename channel on ticket pin","error")
opendiscord.log("Failed to rename channel on ticket pin","error")
})
}catch(err){
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-pin",{guild,channel,user,originalName,newName})).message)
await channel.send((await opendiscord.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-pin",{guild,channel,user,originalName,newName})).message)
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket pinning!","error",[
opendiscord.log("Unable to edit ticket message on ticket pinning!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"message",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:pin-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:pin-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketPinned").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketPinned").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.pinning.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"pin",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"pin",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.pinning.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"pin",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.pinning.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"pin",reason,additionalData:null}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" pinned a ticket!","info",[
opendiscord.log(user.displayName+" pinned a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -92,37 +92,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//PIN TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:pin-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:pin-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:pin-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:pin-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.pin
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -130,86 +130,86 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already pinned
if (ticket.get("openticket:pinned").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start pinning ticket
if (params.data == "reason"){
//pin with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:pin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:pin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//pin without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:pin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:pin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:pin-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:pin-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//PIN TICKET UNPIN MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:pin-ticket-unpin-message",openticket.builders.messages.getSafe("openticket:verifybar-unpin-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:pin-ticket-unpin-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:pin-ticket-unpin-message",opendiscord.builders.messages.getSafe("openticket:verifybar-unpin-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:pin-ticket-unpin-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.pin
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -217,58 +217,58 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already pinned
if (ticket.get("openticket:pinned").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start pinning ticket
if (params.data == "reason"){
//pin with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:pin-ticket-reason").build("unpin-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:pin-ticket-reason").build("unpin-message",{guild,channel,user,ticket}))
}else{
//pin without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:pin-ticket").run("unpin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:pin-message").build("unpin-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:pin-ticket").run("unpin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:pin-message").build("unpin-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:pin-ticket-unpin-message").failure.add([
opendiscord.verifybars.get("openticket:pin-ticket-unpin-message").failure.add([
new api.ODWorker("openticket:back-to-unpin-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:unpin-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:unpin-message").build("other",{guild,channel,user,ticket,reason}))
})
])
openticket.actions.get("openticket:pin-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:pin-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+12 -12
View File
@@ -1,32 +1,32 @@
///////////////////////////////////////
//REACTION ROLE SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:reaction-role"))
openticket.actions.get("openticket:reaction-role").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:reaction-role"))
opendiscord.actions.get("openticket:reaction-role").workers.add([
new api.ODWorker("openticket:reaction-role",2,async (instance,params,source,cancel) => {
const {guild,user,option,overwriteMode} = params
const role = openticket.roles.get(option.id)
const role = opendiscord.roles.get(option.id)
if (!role) throw new api.ODSystemError("ODAction(ot:reaction-role) => Unknown reaction role (ODRole)")
instance.role = role
const mode = (overwriteMode) ? overwriteMode : role.get("openticket:mode").value
await openticket.events.get("onRoleUpdate").emit([user,role])
await opendiscord.events.get("onRoleUpdate").emit([user,role])
//get guild member
const member = await openticket.client.fetchGuildMember(guild,user.id)
const member = await opendiscord.client.fetchGuildMember(guild,user.id)
if (!member) throw new api.ODSystemError("ODAction(ot:reaction-role) => User isn't a member of the server!")
//get all roles
const roleIds = role.get("openticket:roles").value
const roles: discord.Role[] = []
for (const id of roleIds){
const r = await openticket.client.fetchGuildRole(guild,id)
const r = await opendiscord.client.fetchGuildRole(guild,id)
if (r) roles.push(r)
else openticket.log("Unable to find role in server!","warning",[
else opendiscord.log("Unable to find role in server!","warning",[
{key:"roleid",value:id}
])
}
@@ -58,9 +58,9 @@ export const registerActions = async () => {
const removeRoleIds = role.get("openticket:remove-roles-on-add").value
const removeRoles: discord.Role[] = []
for (const id of removeRoleIds){
const r = await openticket.client.fetchGuildRole(guild,id)
const r = await opendiscord.client.fetchGuildRole(guild,id)
if (r) removeRoles.push(r)
else openticket.log("Unable to find role in server!","warning",[
else opendiscord.log("Unable to find role in server!","warning",[
{key:"roleid",value:id}
])
}
@@ -79,11 +79,11 @@ export const registerActions = async () => {
//update instance & finish event
instance.result = result
await openticket.events.get("afterRolesUpdated").emit([user,role])
await opendiscord.events.get("afterRolesUpdated").emit([user,role])
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,user,option} = params
openticket.log(user.displayName+" updated his roles!","info",[
opendiscord.log(user.displayName+" updated his roles!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"method",value:source},
+18 -18
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET REMOVE USER SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:remove-ticket-user"))
openticket.actions.get("openticket:remove-ticket-user").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:remove-ticket-user"))
opendiscord.actions.get("openticket:remove-ticket-user").workers.add([
new api.ODWorker("openticket:remove-ticket-user",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to remove user from ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketUserRemove").emit([ticket,user,data,channel,reason])
await opendiscord.events.get("onTicketUserRemove").emit([ticket,user,data,channel,reason])
//update ticket
const index = ticket.get("openticket:participants").value.findIndex((p) => p.type == "user" && p.id == data.id)
@@ -26,46 +26,46 @@ export const registerActions = async () => {
try{
await channel.permissionOverwrites.delete(data)
}catch{
openticket.log("Failed to remove channel permission overwrites on remove-ticket-user","error")
opendiscord.log("Failed to remove channel permission overwrites on remove-ticket-user","error")
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket user removal!","error",[
opendiscord.log("Unable to edit ticket message on ticket user removal!","error",[
{key:"channel",value:channel.id},
{key:"message",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:remove-message").build(source,{guild,channel,user,ticket,reason,data})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:remove-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketUserRemoved").emit([ticket,user,data,channel,reason])
await opendiscord.events.get("afterTicketUserRemoved").emit([ticket,user,data,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.removing.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"remove",reason,additionalData:data}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"remove",reason,additionalData:data}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.removing.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"remove",reason,additionalData:data}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.removing.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"remove",reason,additionalData:data}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket,data} = params
openticket.log(user.displayName+" removed "+data.displayName+" from a ticket!","info",[
opendiscord.log(user.displayName+" removed "+data.displayName+" from a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -75,7 +75,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:remove-ticket-user").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:remove-ticket-user").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+19 -19
View File
@@ -1,68 +1,68 @@
///////////////////////////////////////
//TICKET RENAMING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:rename-ticket"))
openticket.actions.get("openticket:rename-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:rename-ticket"))
opendiscord.actions.get("openticket:rename-ticket").workers.add([
new api.ODWorker("openticket:rename-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to rename ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketRename").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketRename").emit([ticket,user,channel,reason])
//rename channel (and give error when crashed)
const originalName = channel.name
try{
await utilities.timedAwait(channel.setName(data),2500,(err) => {
openticket.log("Failed to rename channel on ticket rename","error")
opendiscord.log("Failed to rename channel on ticket rename","error")
})
}catch(err){
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-rename",{guild,channel,user,originalName,newName:data})).message)
await channel.send((await opendiscord.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-rename",{guild,channel,user,originalName,newName:data})).message)
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket renaming!","error",[
opendiscord.log("Unable to edit ticket message on ticket renaming!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:rename-message").build(source,{guild,channel,user,ticket,reason,data})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:rename-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketRenamed").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketRenamed").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.renaming.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"rename",reason,additionalData:data}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"rename",reason,additionalData:data}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.renaming.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"rename",reason,additionalData:data}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.renaming.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"rename",reason,additionalData:data}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" renamed a ticket!","info",[
opendiscord.log(user.displayName+" renamed a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -72,7 +72,7 @@ export const registerActions = async () => {
])
})
])
openticket.actions.get("openticket:rename-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:rename-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+92 -92
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET REOPENING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:reopen-ticket"))
openticket.actions.get("openticket:reopen-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:reopen-ticket"))
opendiscord.actions.get("openticket:reopen-ticket").workers.add([
new api.ODWorker("openticket:reopen-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to reopen ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketReopen").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketReopen").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:closed").value = false
@@ -24,8 +24,8 @@ export const registerActions = async () => {
ticket.get("openticket:busy").value = true
//update stats
await openticket.stats.get("openticket:global").setStat("openticket:tickets-reopened",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:tickets-reopened",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-reopened",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:tickets-reopened",user.id,1,"increase")
//update category
const channelCategory = ticket.option.get("openticket:channel-category").value
@@ -33,10 +33,10 @@ export const registerActions = async () => {
if (channelCategory !== ""){
//category enabled
try {
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
openticket.log("Ticket Reopening Error: Unable to find category! #1","error",[
opendiscord.log("Ticket Reopening Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
@@ -44,10 +44,10 @@ export const registerActions = async () => {
//default category was found
if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
//use backup category
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
const backupCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
openticket.log("Ticket Reopening Error: Unable to find category! #2","error",[
opendiscord.log("Ticket Reopening Error: Unable to find category! #2","error",[
{key:"categoryid",value:channelBackupCategory},
{key:"backup",value:"true"}
])
@@ -65,11 +65,11 @@ export const registerActions = async () => {
}
}
}catch(e){
openticket.log("Unable to move ticket to 'reopened category'!","error",[
opendiscord.log("Unable to move ticket to 'reopened category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}else{
channel.setParent(null,{lockPermissions:false})
@@ -84,7 +84,7 @@ export const registerActions = async () => {
allow:[],
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
}]
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
const globalAdmins = opendiscord.configs.get("openticket:general").data.globalAdmins
const optionAdmins = ticket.option.get("openticket:admins").value
const readonlyAdmins = ticket.option.get("openticket:admins-readonly").value
@@ -129,42 +129,42 @@ export const registerActions = async () => {
channel.permissionOverwrites.set(permissions)
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket reopening!","error",[
opendiscord.log("Unable to edit ticket message on ticket reopening!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:reopen-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:reopen-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketReopened").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketReopened").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.reopening.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"reopen",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"reopen",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.reopening.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"reopen",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.reopening.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"reopen",reason,additionalData:null}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" reopened a ticket!","info",[
opendiscord.log(user.displayName+" reopened a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -178,37 +178,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//REOPEN TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:reopen-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:reopen-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.reopen
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -216,86 +216,86 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not closed
if (!ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start reopening ticket
if (params.data == "reason"){
//reopen with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:reopen-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:reopen-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//reopen without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:reopen-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:reopen-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:reopen-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//REOPEN TICKET CLOSE MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-close-message",openticket.builders.messages.getSafe("openticket:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:reopen-ticket-close-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-close-message",opendiscord.builders.messages.getSafe("openticket:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:reopen-ticket-close-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.reopen
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -303,90 +303,90 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not closed
if (!ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start reopening ticket
if (params.data == "reason"){
//reopen with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:reopen-ticket-reason").build("close-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:reopen-ticket-reason").build("close-message",{guild,channel,user,ticket}))
}else{
//reopen without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("close-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:reopen-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build("close-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:reopen-ticket-close-message").failure.add([
opendiscord.verifybars.get("openticket:reopen-ticket-close-message").failure.add([
new api.ODWorker("openticket:back-to-close-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
})
])
//REOPEN TICKET AUTOCLOSE MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-autoclose-message",openticket.builders.messages.getSafe("openticket:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:reopen-ticket-autoclose-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-autoclose-message",opendiscord.builders.messages.getSafe("openticket:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:reopen-ticket-autoclose-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.reopen
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -394,55 +394,55 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not closed
if (!ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start reopening ticket
if (params.data == "reason"){
//reopen with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:reopen-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:reopen-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
}else{
//reopen without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:reopen-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:reopen-ticket-autoclose-message").failure.add([
opendiscord.verifybars.get("openticket:reopen-ticket-autoclose-message").failure.add([
new api.ODWorker("openticket:back-to-autoclose-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:autoclose-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:autoclose-message").build("other",{guild,channel,user,ticket}))
})
])
openticket.actions.get("openticket:reopen-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:reopen-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+67 -67
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET UNCLAIMING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:unclaim-ticket"))
openticket.actions.get("openticket:unclaim-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:unclaim-ticket"))
opendiscord.actions.get("openticket:unclaim-ticket").workers.add([
new api.ODWorker("openticket:unclaim-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to unclaim ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketUnclaim").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketUnclaim").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:claimed").value = false
@@ -27,10 +27,10 @@ export const registerActions = async () => {
if (channelCategory !== ""){
//category enabled
try {
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
openticket.log("Ticket Unclaiming Error: Unable to find category! #1","error",[
opendiscord.log("Ticket Unclaiming Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
@@ -38,10 +38,10 @@ export const registerActions = async () => {
//default category was found
if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
//use backup category
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
const backupCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
openticket.log("Ticket Unclaiming Error: Unable to find category! #2","error",[
opendiscord.log("Ticket Unclaiming Error: Unable to find category! #2","error",[
{key:"categoryid",value:channelBackupCategory},
{key:"backup",value:"true"}
])
@@ -60,11 +60,11 @@ export const registerActions = async () => {
}
}catch(e){
openticket.log("Unable to move ticket to 'unclaimed category'!","error",[
opendiscord.log("Unable to move ticket to 'unclaimed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}else{
channel.setParent(null,{lockPermissions:false})
@@ -73,43 +73,43 @@ export const registerActions = async () => {
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket unclaiming!","error",[
opendiscord.log("Unable to edit ticket message on ticket unclaiming!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:unclaim-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:unclaim-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketUnclaimed").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketUnclaimed").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.claiming.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"unclaim",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"unclaim",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.claiming.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"unclaim",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.claiming.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"unclaim",reason,additionalData:null}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" unclaimed a ticket!","info",[
opendiscord.log(user.displayName+" unclaimed a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -123,37 +123,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//UNCLAIM TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:unclaim-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:unclaim-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:unclaim-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:unclaim-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unclaim
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -161,86 +161,86 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not claimed
if (!ticket.get("openticket:claimed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start unclaiming ticket
if (params.data == "reason"){
//unclaim with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:unclaim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:unclaim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//unclaim without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:unclaim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:unclaim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:unclaim-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:unclaim-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//UNCLAIM TICKET CLAIM MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:unclaim-ticket-claim-message",openticket.builders.messages.getSafe("openticket:verifybar-claim-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:unclaim-ticket-claim-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:unclaim-ticket-claim-message",opendiscord.builders.messages.getSafe("openticket:verifybar-claim-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:unclaim-ticket-claim-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unclaim
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -248,58 +248,58 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not claimed
if (!ticket.get("openticket:claimed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start unclaiming ticket
if (params.data == "reason"){
//unclaim with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:unclaim-ticket-reason").build("claim-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:unclaim-ticket-reason").build("claim-message",{guild,channel,user,ticket}))
}else{
//unclaim without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:unclaim-ticket").run("claim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:unclaim-message").build("claim-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:unclaim-ticket").run("claim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:unclaim-message").build("claim-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:unclaim-ticket-claim-message").failure.add([
opendiscord.verifybars.get("openticket:unclaim-ticket-claim-message").failure.add([
new api.ODWorker("openticket:back-to-claim-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:claim-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:claim-message").build("other",{guild,channel,user,ticket,reason}))
})
])
openticket.actions.get("openticket:unclaim-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:unclaim-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+63 -63
View File
@@ -1,19 +1,19 @@
///////////////////////////////////////
//TICKET UNPINNING SYSTEM
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerActions = async () => {
openticket.actions.add(new api.ODAction("openticket:unpin-ticket"))
openticket.actions.get("openticket:unpin-ticket").workers.add([
opendiscord.actions.add(new api.ODAction("openticket:unpin-ticket"))
opendiscord.actions.get("openticket:unpin-ticket").workers.add([
new api.ODWorker("openticket:unpin-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to unpin ticket! Open Ticket doesn't support threads!")
await openticket.events.get("onTicketUnpin").emit([ticket,user,channel,reason])
await opendiscord.events.get("onTicketUnpin").emit([ticket,user,channel,reason])
//update ticket
ticket.get("openticket:pinned").value = false
@@ -27,51 +27,51 @@ export const registerActions = async () => {
const newName = originalName.replace("📌","");
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
openticket.log("Failed to rename channel on ticket unpin","error")
opendiscord.log("Failed to rename channel on ticket unpin","error")
})
}catch(err){
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message)
await channel.send((await opendiscord.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message)
}
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on ticket unpinning!","error",[
opendiscord.log("Unable to edit ticket message on ticket unpinning!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:unpin-message").build(source,{guild,channel,user,ticket,reason})).message)
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("openticket:unpin-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("openticket:busy").value = false
await openticket.events.get("afterTicketUnpinned").emit([ticket,user,channel,reason])
await opendiscord.events.get("afterTicketUnpinned").emit([ticket,user,channel,reason])
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.pinning.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"unpin",reason,additionalData:null}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"unpin",reason,additionalData:null}))
}
//to dm
const creator = await openticket.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.pinning.dm) await openticket.client.sendUserDm(creator,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"unpin",reason,additionalData:null}))
const creator = await opendiscord.tickets.getTicketUser(ticket,"creator")
if (creator && generalConfig.data.system.messages.pinning.dm) await opendiscord.client.sendUserDm(creator,await opendiscord.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"unpin",reason,additionalData:null}))
}),
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
openticket.log(user.displayName+" unpinned a ticket!","info",[
opendiscord.log(user.displayName+" unpinned a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
@@ -85,37 +85,37 @@ export const registerActions = async () => {
export const registerVerifyBars = async () => {
//UNPIN TICKET TICKET MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:unpin-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:unpin-ticket-ticket-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:unpin-ticket-ticket-message",opendiscord.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:unpin-ticket-ticket-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unpin
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -123,86 +123,86 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not pinned
if (!ticket.get("openticket:pinned").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start unpining ticket
if (params.data == "reason"){
//unpin with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:unpin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:unpin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
}else{
//unpin without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:unpin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:unpin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}
})
])
openticket.verifybars.get("openticket:unpin-ticket-ticket-message").failure.add([
opendiscord.verifybars.get("openticket:unpin-ticket-ticket-message").failure.add([
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
})
])
//UNPIN TICKET PIN MESSAGE
openticket.verifybars.add(new api.ODVerifyBar("openticket:unpin-ticket-pin-message",openticket.builders.messages.getSafe("openticket:verifybar-pin-message"),!generalConfig.data.system.disableVerifyBars))
openticket.verifybars.get("openticket:unpin-ticket-pin-message").success.add([
opendiscord.verifybars.add(new api.ODVerifyBar("openticket:unpin-ticket-pin-message",opendiscord.builders.messages.getSafe("openticket:verifybar-pin-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("openticket:unpin-ticket-pin-message").success.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unpin
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -210,58 +210,58 @@ export const registerVerifyBars = async () => {
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not pinned
if (!ticket.get("openticket:pinned").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//start unpinning ticket
if (params.data == "reason"){
//unpin with reason
instance.modal(await openticket.builders.modals.getSafe("openticket:unpin-ticket-reason").build("pin-message",{guild,channel,user,ticket}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:unpin-ticket-reason").build("pin-message",{guild,channel,user,ticket}))
}else{
//unpin without reason
await instance.defer("update",false)
await openticket.actions.get("openticket:unpin-ticket").run("pin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:unpin-message").build("pin-message",{guild,channel,user,ticket,reason:null}))
await opendiscord.actions.get("openticket:unpin-ticket").run("pin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:unpin-message").build("pin-message",{guild,channel,user,ticket,reason:null}))
}
})
])
openticket.verifybars.get("openticket:unpin-ticket-pin-message").failure.add([
opendiscord.verifybars.get("openticket:unpin-ticket-pin-message").failure.add([
new api.ODWorker("openticket:back-to-pin-message",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {verifybarMessage} = params
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
await instance.update(await openticket.builders.messages.getSafe("openticket:pin-message").build("other",{guild,channel,user,ticket,reason}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:pin-message").build("other",{guild,channel,user,ticket,reason}))
})
])
openticket.actions.get("openticket:unpin-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
opendiscord.actions.get("openticket:unpin-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("openticket:busy").value = false
})
+6 -6
View File
@@ -1,12 +1,12 @@
///////////////////////////////////////
//BUTTON BUILDERS
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const buttons = openticket.builders.buttons
const lang = openticket.languages
const generalConfig = openticket.configs.get("openticket:general")
const buttons = opendiscord.builders.buttons
const lang = opendiscord.languages
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerAllButtons = async () => {
verifybarButtons()
@@ -83,7 +83,7 @@ const helpMenuButtons = () => {
buttons.get("openticket:help-menu-page").workers.add(
new api.ODWorker("openticket:help-menu-page",0,async (instance,params) => {
const {mode,page} = params
const totalPages = (await openticket.helpmenu.render(mode)).length
const totalPages = (await opendiscord.helpmenu.render(mode)).length
const pageText = (page+1).toString()+"/"+totalPages.toString()
instance.setCustomId("od:help-menu-page_"+page.toString())
@@ -127,7 +127,7 @@ const helpMenuButtons = () => {
buttons.get("openticket:help-menu-next").workers.add(
new api.ODWorker("openticket:help-menu-next",0,async (instance,params) => {
const {mode,page} = params
const totalPages = (await openticket.helpmenu.render(mode)).length
const totalPages = (await opendiscord.helpmenu.render(mode)).length
instance.setCustomId("od:help-menu-next")
instance.setMode("button")
+2 -2
View File
@@ -1,10 +1,10 @@
///////////////////////////////////////
//DROPDOWN BUILDERS
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const dropdowns = openticket.builders.dropdowns
const dropdowns = opendiscord.builders.dropdowns
export const registerAllDropdowns = async () => {
panelDropdowns()
+24 -24
View File
@@ -1,13 +1,13 @@
///////////////////////////////////////
//EMBED BUILDERS
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
import nodepath from "path"
const embeds = openticket.builders.embeds
const lang = openticket.languages
const generalConfig = openticket.configs.get("openticket:general")
const embeds = opendiscord.builders.embeds
const lang = opendiscord.languages
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerAllEmbeds = async () => {
errorEmbeds()
@@ -274,7 +274,7 @@ const errorEmbeds = () => {
new api.ODWorker("openticket:error-option-unknown",0,async (instance,params,source) => {
const {user} = params
const renderedTicketOptions = openticket.options.getAll().map((option) => {
const renderedTicketOptions = opendiscord.options.getAll().map((option) => {
if (option instanceof api.ODTicketOption && option.exists("openticket:name")){
return "- **"+option.get("openticket:name").value+":** `"+option.id.value+"`"
}else return "- `"+option.id.value+"`"
@@ -294,7 +294,7 @@ const errorEmbeds = () => {
new api.ODWorker("openticket:error-panel-unknown",0,async (instance,params,source) => {
const {user} = params
const renderedPanels = openticket.panels.getAll().map((panel) => {
const renderedPanels = opendiscord.panels.getAll().map((panel) => {
if (panel.exists("openticket:name")){
return "- **"+panel.get("openticket:name").value+":** `"+panel.id.value+"`"
}else return "- `"+panel.id.value+"`"
@@ -370,9 +370,9 @@ const helpMenuEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("ℹ️",lang.getTranslation("actions.titles.help")))
instance.setDescription(lang.getTranslation("actions.descriptions.helpExplanation"))
instance.setThumbnail(openticket.client.client.user.displayAvatarURL())
instance.setThumbnail(opendiscord.client.client.user.displayAvatarURL())
const data = await openticket.helpmenu.render(mode)
const data = await opendiscord.helpmenu.render(mode)
const currentData = data[page] ?? []
instance.setFields(currentData)
})
@@ -386,7 +386,7 @@ const statsEmbeds = () => {
new api.ODWorker("openticket:stats-global",0,async (instance,params) => {
const {guild,channel,user} = params
const scope = openticket.stats.get("openticket:global")
const scope = opendiscord.stats.get("openticket:global")
if (!scope) return
const data = await scope.render("GLOBAL",guild,channel,user)
@@ -394,9 +394,9 @@ const statsEmbeds = () => {
instance.setTitle(scope.name)
instance.setDescription(data)
if (openticket.permissions.hasPermissions("owner",await openticket.permissions.getPermissions(user,channel,guild))){
if (opendiscord.permissions.hasPermissions("owner",await opendiscord.permissions.getPermissions(user,channel,guild))){
//show system data when owner or developer
const systemScope = openticket.stats.get("openticket:system")
const systemScope = opendiscord.stats.get("openticket:system")
if (!systemScope) return
const systemData = await systemScope.render("GLOBAL",guild,channel,user)
instance.addFields({name:systemScope.name,value:systemData,inline:false})
@@ -410,8 +410,8 @@ const statsEmbeds = () => {
new api.ODWorker("openticket:stats-ticket",0,async (instance,params) => {
const {guild,channel,user,scopeData} = params
const scope = openticket.stats.get("openticket:ticket")
const participantsScope = openticket.stats.get("openticket:participants")
const scope = opendiscord.stats.get("openticket:ticket")
const participantsScope = opendiscord.stats.get("openticket:participants")
if (!scope || !participantsScope) return
const data = await scope.render(scopeData.id.value,guild,channel,user)
const participantsData = await participantsScope.render(scopeData.id.value,guild,channel,user)
@@ -429,7 +429,7 @@ const statsEmbeds = () => {
new api.ODWorker("openticket:stats-user",0,async (instance,params) => {
const {guild,channel,user,scopeData} = params
const scope = openticket.stats.get("openticket:user")
const scope = opendiscord.stats.get("openticket:user")
if (!scope) return
const data = await scope.render(scopeData.id,guild,channel,user)
@@ -439,8 +439,8 @@ const statsEmbeds = () => {
instance.setThumbnail(scopeData.displayAvatarURL())
}),
new api.ODWorker("openticket:easter-egg",-1,async (instance,params) => {
if (!openticket.flags.exists("openticket:no-easter")) return
const easterFlag = openticket.flags.get("openticket:no-easter")
if (!opendiscord.flags.exists("openticket:no-easter")) return
const easterFlag = opendiscord.flags.get("openticket:no-easter")
if (!easterFlag.value){
//🥚 add easter egg 🥚
const {user} = params
@@ -563,7 +563,7 @@ const ticketEmbeds = () => {
const {user,ticket} = params
const method = (source == "panel-button" || source == "panel-dropdown") ? lang.getTranslation("params.uppercase.panel") : (source == "slash" || source == "text") ? lang.getTranslation("params.uppercase.command") : lang.getTranslation("params.uppercase.system")
const blacklisted = openticket.blacklist.exists(user.id) ? lang.getTranslation("params.uppercase.true") : lang.getTranslation("params.uppercase.false")
const blacklisted = opendiscord.blacklist.exists(user.id) ? lang.getTranslation("params.uppercase.true") : lang.getTranslation("params.uppercase.false")
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🎫",lang.getTranslation("actions.titles.created")))
@@ -608,7 +608,7 @@ const ticketEmbeds = () => {
else if (!ticket.get("openticket:closed").value && ticket.get("openticket:autoclose-enabled").value) instance.setFooter("⏱️ "+lang.getTranslationWithParams("actions.descriptions.ticketMessageAutoclose",[ticket.option.get("openticket:autoclose-hours").value.toString()]))
if (ticket.get("openticket:claimed").value){
const claimUser = await openticket.tickets.getTicketUser(ticket,"claimer")
const claimUser = await opendiscord.tickets.getTicketUser(ticket,"claimer")
if (!claimUser) return
instance.setAuthor(lang.getTranslationWithParams("params.uppercase.claimedBy",[claimUser.displayName]),claimUser.displayAvatarURL())
}
@@ -774,7 +774,7 @@ const ticketEmbeds = () => {
embeds.get("openticket:ticket-action-dm").workers.add(
new api.ODWorker("openticket:ticket-action-dm",0,async (instance,params,source) => {
const {user,mode,ticket,reason,additionalData} = params
const channel = await openticket.tickets.getTicketChannel(ticket)
const channel = await opendiscord.tickets.getTicketChannel(ticket)
instance.setColor(generalConfig.data.mainColor)
instance.setTimestamp(new Date())
@@ -823,7 +823,7 @@ const ticketEmbeds = () => {
embeds.get("openticket:ticket-action-logs").workers.add(
new api.ODWorker("openticket:ticket-action-logs",0,async (instance,params,source) => {
const {user,mode,ticket,reason,additionalData} = params
const channel = await openticket.tickets.getTicketChannel(ticket)
const channel = await opendiscord.tickets.getTicketChannel(ticket)
instance.setColor(generalConfig.data.mainColor)
instance.setThumbnail(user.displayAvatarURL())
@@ -882,7 +882,7 @@ const blacklistEmbeds = () => {
const {user} = params
const renderedUsers: string[] = []
await openticket.blacklist.loopAll((blacklist,id) => {renderedUsers.push(discord.userMention(id.value)+" - "+(blacklist.reason ? blacklist.reason : "/"))})
await opendiscord.blacklist.loopAll((blacklist,id) => {renderedUsers.push(discord.userMention(id.value)+" - "+(blacklist.reason ? blacklist.reason : "/"))})
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
@@ -900,7 +900,7 @@ const blacklistEmbeds = () => {
embeds.get("openticket:blacklist-get").workers.add(
new api.ODWorker("openticket:blacklist-get",0,async (instance,params,source) => {
const {user,data} = params
const blacklist = openticket.blacklist.get(data.id)
const blacklist = opendiscord.blacklist.get(data.id)
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
@@ -985,7 +985,7 @@ const transcriptEmbeds = () => {
embeds.get("openticket:transcript-text-ready").workers.add(
new api.ODWorker("openticket:transcript-text-ready",0,async (instance,params,source) => {
const {guild,channel,user,ticket,compiler} = params
const transcriptConfig = openticket.configs.get("openticket:transcripts")
const transcriptConfig = opendiscord.configs.get("openticket:transcripts")
instance.setColor(transcriptConfig.data.embedSettings.customColor ? transcriptConfig.data.embedSettings.customColor : generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("📄",lang.getTranslation("transcripts.success.ready")))
@@ -1015,7 +1015,7 @@ const transcriptEmbeds = () => {
embeds.get("openticket:transcript-html-ready").workers.add(
new api.ODWorker("openticket:transcript-html-ready",0,async (instance,params,source) => {
const {guild,channel,user,ticket,compiler,result} = params
const transcriptConfig = openticket.configs.get("openticket:transcripts")
const transcriptConfig = opendiscord.configs.get("openticket:transcripts")
instance.setColor(transcriptConfig.data.embedSettings.customColor ? transcriptConfig.data.embedSettings.customColor : generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("📄",lang.getTranslation("transcripts.success.ready")))
+5 -5
View File
@@ -1,12 +1,12 @@
///////////////////////////////////////
//FILE BUILDERS
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const files = openticket.builders.files
const lang = openticket.languages
const transcriptConfig = openticket.configs.get("openticket:transcripts")
const files = opendiscord.builders.files
const lang = opendiscord.languages
const transcriptConfig = opendiscord.configs.get("openticket:transcripts")
export const registerAllFiles = async () => {
transcriptFiles()
@@ -24,7 +24,7 @@ const transcriptFiles = () => {
const customName = transcriptConfig.data.textTranscriptStyle.customFileName
const creatorId = ticket.get("openticket:opened-by").value ?? "unknown-creator-id"
const creator = (await openticket.tickets.getTicketUser(ticket,"creator"))
const creator = (await opendiscord.tickets.getTicketUser(ticket,"creator"))
if (fileMode == "custom") instance.setName(customName.split(".")[0]+".txt")
else if (fileMode == "user-id") instance.setName(creatorId+".txt")
+18 -18
View File
@@ -1,16 +1,16 @@
///////////////////////////////////////
//MESSAGE BUILDERS
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const messages = openticket.builders.messages
const buttons = openticket.builders.buttons
const dropdowns = openticket.builders.dropdowns
const files = openticket.builders.files
const embeds = openticket.builders.embeds
const lang = openticket.languages
const generalConfig = openticket.configs.get("openticket:general")
const messages = opendiscord.builders.messages
const buttons = opendiscord.builders.buttons
const dropdowns = opendiscord.builders.dropdowns
const files = opendiscord.builders.files
const embeds = opendiscord.builders.embeds
const lang = opendiscord.languages
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerAllMessages = async () => {
verifyBarMessages()
@@ -36,7 +36,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-ticket-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-ticket-message`")
return
@@ -110,7 +110,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-close-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-close-message`")
return
@@ -146,7 +146,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-reopen-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-reopen-message`")
return
@@ -182,7 +182,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-claim-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-claim-message`")
return
@@ -212,7 +212,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-unclaim-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-unclaim-message`")
return
@@ -242,7 +242,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-pin-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-pin-message`")
return
@@ -272,7 +272,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-unpin-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-unpin-message`")
return
@@ -302,7 +302,7 @@ const verifyBarMessages = () => {
instance.setContent("ODError: Not In Guild => `openticket:verifybar-autoclose-message`")
return
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket){
instance.setContent("ODError: Unknown Ticket => `openticket:verifybar-autoclose-message`")
return
@@ -496,7 +496,7 @@ const helpMenuMessages = () => {
messages.get("openticket:help-menu").workers.add(
new api.ODWorker("openticket:help-menu",0,async (instance,params,source) => {
const {mode,page} = params
const totalPages = (await openticket.helpmenu.render(mode)).length
const totalPages = (await opendiscord.helpmenu.render(mode)).length
const embed = await embeds.getSafe("openticket:help-menu").build(source,{mode,page})
instance.addEmbed(embed)
@@ -589,7 +589,7 @@ const panelMessages = () => {
const {guild,channel,user,panel} = params
const options: api.ODOption[] = []
panel.get("openticket:options").value.forEach((id) => {
const opt = openticket.options.get(id)
const opt = opendiscord.options.get(id)
if (opt) options.push(opt)
})
+4 -4
View File
@@ -1,11 +1,11 @@
///////////////////////////////////////
//MODAL BUILDERS
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const modals = openticket.builders.modals
const lang = openticket.languages
const modals = opendiscord.builders.modals
const lang = opendiscord.languages
export const registerAllModals = async () => {
ticketModals()
@@ -21,7 +21,7 @@ const ticketModals = () => {
instance.setTitle(option.exists("openticket:name") ? option.get("openticket:name").value : option.id.value)
const questionIds = option.get("openticket:questions").value
questionIds.forEach((id) => {
const question = openticket.questions.get(id)
const question = opendiscord.questions.get(id)
if (!question) return
if (question instanceof api.ODShortQuestion) instance.addQuestion({
customId:question.id.value,
+20 -20
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//ADD COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//ADD COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:add",generalConfig.data.prefix,"add"))
openticket.responders.commands.get("openticket:add").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:add",generalConfig.data.prefix,"add"))
opendiscord.responders.commands.get("openticket:add").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.add
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,17 +46,17 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:add",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -64,19 +64,19 @@ export const registerCommandResponders = async () => {
const reason = instance.options.getString("reason",false)
//return when user already added to ticket
const participants = await openticket.tickets.getAllTicketParticipants(ticket)
const participants = await opendiscord.tickets.getAllTicketParticipants(ticket)
if (!participants || participants.find((p) => p.user.id == data.id)){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.add"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.add"),layout:"simple"}))
return cancel()
}
//start adding user to ticket
await instance.defer(false)
await openticket.actions.get("openticket:add-ticket-user").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data})
await instance.reply(await openticket.builders.messages.getSafe("openticket:add-message").build(source,{guild,channel,user,ticket,reason,data}))
await opendiscord.actions.get("openticket:add-ticket-user").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:add-message").build(source,{guild,channel,user,ticket,reason,data}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'add' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'add' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+23 -23
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//AUTOCLOSE COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//AUTOCLOSE COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:autoclose",generalConfig.data.prefix,/^autoclose/))
openticket.responders.commands.get("openticket:autoclose").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:autoclose",generalConfig.data.prefix,/^autoclose/))
opendiscord.responders.commands.get("openticket:autoclose").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.autoclose
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -47,22 +47,22 @@ export const registerCommandResponders = async () => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
//return when already closed
if (ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -73,36 +73,36 @@ export const registerCommandResponders = async () => {
const reason = instance.options.getString("reason",false)
ticket.get("openticket:autoclose-enabled").value = false
ticket.get("openticket:autoclose-hours").value = 0
await instance.reply(await openticket.builders.messages.getSafe("openticket:autoclose-disable").build(source,{guild,channel,user,ticket,reason}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:autoclose-disable").build(source,{guild,channel,user,ticket,reason}))
}else if (scope == "enable"){
const time = instance.options.getNumber("time",true)
const reason = instance.options.getString("reason",false)
ticket.get("openticket:autoclose-enabled").value = true
ticket.get("openticket:autoclose-hours").value = time
await instance.reply(await openticket.builders.messages.getSafe("openticket:autoclose-enable").build(source,{guild,channel,user,ticket,reason,time}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:autoclose-enable").build(source,{guild,channel,user,ticket,reason,time}))
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on autoclose "+scope+"!","error",[
opendiscord.log("Unable to edit ticket message on autoclose "+scope+"!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
const scope = instance.options.getSubCommand()
const reason = instance.options.getString("reason",false)
openticket.log(instance.user.displayName+" used the 'autoclose "+scope+"' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'autoclose "+scope+"' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+22 -22
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//AUTODELETE COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//AUTODELETE COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:autodelete",generalConfig.data.prefix,/^autodelete/))
openticket.responders.commands.get("openticket:autodelete").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:autodelete",generalConfig.data.prefix,/^autodelete/))
opendiscord.responders.commands.get("openticket:autodelete").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.autodelete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -47,17 +47,17 @@ export const registerCommandResponders = async () => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -68,36 +68,36 @@ export const registerCommandResponders = async () => {
const reason = instance.options.getString("reason",false)
ticket.get("openticket:autodelete-enabled").value = false
ticket.get("openticket:autodelete-days").value = 0
await instance.reply(await openticket.builders.messages.getSafe("openticket:autodelete-disable").build(source,{guild,channel,user,ticket,reason}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:autodelete-disable").build(source,{guild,channel,user,ticket,reason}))
}else if (scope == "enable"){
const time = instance.options.getNumber("time",true)
const reason = instance.options.getString("reason",false)
ticket.get("openticket:autodelete-enabled").value = true
ticket.get("openticket:autodelete-days").value = time
await instance.reply(await openticket.builders.messages.getSafe("openticket:autodelete-enable").build(source,{guild,channel,user,ticket,reason,time}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:autodelete-enable").build(source,{guild,channel,user,ticket,reason,time}))
}
//update ticket message
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
ticketMessage.edit((await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
openticket.log("Unable to edit ticket message on autodelete "+scope+"!","error",[
opendiscord.log("Unable to edit ticket message on autodelete "+scope+"!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
const scope = instance.options.getSubCommand()
const reason = instance.options.getString("reason",false)
openticket.log(instance.user.displayName+" used the 'autodelete "+scope+"' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'autodelete "+scope+"' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+26 -26
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//BLACKLIST COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//BLACKLIST COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:blacklist",generalConfig.data.prefix,/^blacklist/))
openticket.responders.commands.get("openticket:blacklist").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:blacklist",generalConfig.data.prefix,/^blacklist/))
opendiscord.responders.commands.get("openticket:blacklist").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.blacklist
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -47,25 +47,25 @@ export const registerCommandResponders = async () => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
const scope = instance.options.getSubCommand()
if (!scope || (scope != "add" && scope != "get" && scope != "remove" && scope != "view")) return
if (scope == "view"){
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-view").build(source,{guild,channel,user}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:blacklist-view").build(source,{guild,channel,user}))
}else if (scope == "get"){
const data = instance.options.getUser("user",true)
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-get").build(source,{guild,channel,user,data}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:blacklist-get").build(source,{guild,channel,user,data}))
}else if (scope == "add"){
const data = instance.options.getUser("user",true)
const reason = instance.options.getString("reason",false)
openticket.blacklist.add(new api.ODBlacklist(data.id,reason),true)
openticket.log(instance.user.displayName+" added "+data.displayName+" to blacklist!","info",[
opendiscord.blacklist.add(new api.ODBlacklist(data.id,reason),true)
opendiscord.log(instance.user.displayName+" added "+data.displayName+" to blacklist!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channelid",value:channel.id,hidden:true},
@@ -74,17 +74,17 @@ export const registerCommandResponders = async () => {
])
//manage stats
await openticket.stats.get("openticket:global").setStat("openticket:users-blacklisted",1,"increase")
await openticket.stats.get("openticket:user").setStat("openticket:users-blacklisted",user.id,1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:users-blacklisted",1,"increase")
await opendiscord.stats.get("openticket:user").setStat("openticket:users-blacklisted",user.id,1,"increase")
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-add").build(source,{guild,channel,user,data,reason}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:blacklist-add").build(source,{guild,channel,user,data,reason}))
}else if (scope == "remove"){
const data = instance.options.getUser("user",true)
const reason = instance.options.getString("reason",false)
openticket.blacklist.remove(data.id)
openticket.log(instance.user.displayName+" removed "+data.displayName+" from blacklist!","info",[
opendiscord.blacklist.remove(data.id)
opendiscord.log(instance.user.displayName+" removed "+data.displayName+" from blacklist!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channelid",value:channel.id,hidden:true},
@@ -92,7 +92,7 @@ export const registerCommandResponders = async () => {
{key:"reason",value:reason ?? "/"}
])
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-remove").build(source,{guild,channel,user,data,reason}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:blacklist-remove").build(source,{guild,channel,user,data,reason}))
}
}),
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
@@ -107,16 +107,16 @@ export const registerCommandResponders = async () => {
//to logs
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.blacklisting.logs){
const logChannel = openticket.posts.get("openticket:logs")
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:blacklist-logs").build(source,{guild,channel,user,mode:scope,data,reason}))
const logChannel = opendiscord.posts.get("openticket:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("openticket:blacklist-logs").build(source,{guild,channel,user,mode:scope,data,reason}))
}
//to dm
if (generalConfig.data.system.messages.blacklisting.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:blacklist-dm").build(source,{guild,channel,user,mode:scope,data,reason}))
if (generalConfig.data.system.messages.blacklisting.dm) await opendiscord.client.sendUserDm(user,await opendiscord.builders.messages.getSafe("openticket:blacklist-dm").build(source,{guild,channel,user,mode:scope,data,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
const scope = instance.options.getSubCommand()
openticket.log(instance.user.displayName+" used the 'blacklist "+scope+"' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'blacklist "+scope+"' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+33 -33
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//CLAIM COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//CLAIM COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:claim",generalConfig.data.prefix,"claim"))
openticket.responders.commands.get("openticket:claim").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:claim",generalConfig.data.prefix,"claim"))
opendiscord.responders.commands.get("openticket:claim").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.claim
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,22 +46,22 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:claim",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already claimed
if (ticket.get("openticket:claimed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -70,11 +70,11 @@ export const registerCommandResponders = async () => {
//start claiming ticket
await instance.defer(false)
await openticket.actions.get("openticket:claim-ticket").run(source,{guild,channel,user:claimUser,ticket,reason,sendMessage:false})
await instance.reply(await openticket.builders.messages.getSafe("openticket:claim-message").build(source,{guild,channel,user:claimUser,ticket,reason}))
await opendiscord.actions.get("openticket:claim-ticket").run(source,{guild,channel,user:claimUser,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:claim-message").build(source,{guild,channel,user:claimUser,ticket,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'claim' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'claim' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -86,33 +86,33 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//CLAIM TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:claim-ticket",/^od:claim-ticket/))
openticket.responders.buttons.get("openticket:claim-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:claim-ticket",/^od:claim-ticket/))
opendiscord.responders.buttons.get("openticket:claim-ticket").workers.add(
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "unclaim-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:claim-ticket-ticket-message").activate(instance)
else await openticket.verifybars.get("openticket:claim-ticket-unclaim-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:claim-ticket-ticket-message").activate(instance)
else await opendiscord.verifybars.get("openticket:claim-ticket-unclaim-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//CLAIM WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:claim-ticket-reason",/^od:claim-ticket-reason_/))
openticket.responders.modals.get("openticket:claim-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:claim-ticket-reason",/^od:claim-ticket-reason_/))
opendiscord.responders.modals.get("openticket:claim-ticket-reason").workers.add([
new api.ODWorker("openticket:claim-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -122,15 +122,15 @@ export const registerModalResponders = async () => {
//claim with reason
if (originalSource == "ticket-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "unclaim-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:claim-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:claim-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
await openticket.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await opendiscord.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
}
})
+22 -22
View File
@@ -1,45 +1,45 @@
///////////////////////////////////////
//CLEAR COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//CLEAR COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:clear",generalConfig.data.prefix,"clear"))
openticket.responders.commands.get("openticket:clear").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:clear",generalConfig.data.prefix,"clear"))
opendiscord.responders.commands.get("openticket:clear").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.clear
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
//only allow global admins (ticket admins aren't allowed to clear tickets)
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelUserScope:false,allowChannelRoleScope:false}))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelUserScope:false,allowChannelRoleScope:false}))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -47,14 +47,14 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:clear",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const tempFilter = instance.options.getString("filter",false)
const filter = (tempFilter) ? tempFilter.toLowerCase() as api.ODTicketClearFilter : "all"
const list: string[] = []
const ticketList = openticket.tickets.getAll().filter((ticket) => {
const ticketList = opendiscord.tickets.getAll().filter((ticket) => {
if (filter == "all") return true
else if (filter == "open" && ticket.get("openticket:open").value) return true
else if (filter == "closed" && ticket.get("openticket:closed").value) return true
@@ -66,16 +66,16 @@ export const registerCommandResponders = async () => {
else return false
})
for (const ticket of ticketList){
const ticketChannel = await openticket.tickets.getTicketChannel(ticket)
const ticketChannel = await opendiscord.tickets.getTicketChannel(ticket)
if (ticketChannel) list.push("#"+ticketChannel.name)
}
//reply with clear verify
await instance.defer(true)
await instance.reply(await openticket.builders.messages.getSafe("openticket:clear-verify-message").build(source,{guild,channel,user,filter,list}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:clear-verify-message").build(source,{guild,channel,user,filter,list}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'clear' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'clear' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -87,8 +87,8 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//CLEAR CONTINUE BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:clear-continue",/^od:clear-continue_/))
openticket.responders.buttons.get("openticket:clear-continue").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:clear-continue",/^od:clear-continue_/))
opendiscord.responders.buttons.get("openticket:clear-continue").workers.add(
new api.ODWorker("openticket:clear-continue",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild || channel.isDMBased()) return
@@ -99,7 +99,7 @@ export const registerButtonResponders = async () => {
//start ticket clear
instance.defer("update",true)
const list: string[] = []
const ticketList = openticket.tickets.getAll().filter((ticket) => {
const ticketList = opendiscord.tickets.getAll().filter((ticket) => {
if (filter == "all") return true
else if (filter == "open" && ticket.get("openticket:open").value) return true
else if (filter == "closed" && ticket.get("openticket:closed").value) return true
@@ -111,12 +111,12 @@ export const registerButtonResponders = async () => {
else return false
})
for (const ticket of ticketList){
const ticketChannel = await openticket.tickets.getTicketChannel(ticket)
const ticketChannel = await opendiscord.tickets.getTicketChannel(ticket)
if (ticketChannel) list.push("#"+ticketChannel.name)
}
await openticket.actions.get("openticket:clear-tickets").run(originalSource,{guild,channel,user,filter,list:ticketList})
await instance.update(await openticket.builders.messages.getSafe("openticket:clear-message").build(originalSource,{guild,channel,user,filter,list}))
await opendiscord.actions.get("openticket:clear-tickets").run(originalSource,{guild,channel,user,filter,list:ticketList})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:clear-message").build(originalSource,{guild,channel,user,filter,list}))
})
)
}
+33 -33
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//CLOSE COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//CLOSE COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:close",generalConfig.data.prefix,"close"))
openticket.responders.commands.get("openticket:close").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:close",generalConfig.data.prefix,"close"))
opendiscord.responders.commands.get("openticket:close").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.close
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,22 +46,22 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:close",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already closed
if (ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -69,11 +69,11 @@ export const registerCommandResponders = async () => {
//start closing ticket
await instance.defer(false)
await openticket.actions.get("openticket:close-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await openticket.builders.messages.getSafe("openticket:close-message").build(source,{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:close-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:close-message").build(source,{guild,channel,user,ticket,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'close' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'close' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -85,33 +85,33 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//CLOSE TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:close-ticket",/^od:close-ticket_/))
openticket.responders.buttons.get("openticket:close-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:close-ticket",/^od:close-ticket_/))
opendiscord.responders.buttons.get("openticket:close-ticket").workers.add(
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "reopen-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:close-ticket-ticket-message").activate(instance)
else await openticket.verifybars.get("openticket:close-ticket-reopen-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:close-ticket-ticket-message").activate(instance)
else await opendiscord.verifybars.get("openticket:close-ticket-reopen-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//CLOSE WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:close-ticket-reason",/^od:close-ticket-reason_/))
openticket.responders.modals.get("openticket:close-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:close-ticket-reason",/^od:close-ticket-reason_/))
opendiscord.responders.modals.get("openticket:close-ticket-reason").workers.add([
new api.ODWorker("openticket:close-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -121,15 +121,15 @@ export const registerModalResponders = async () => {
//close with reason
if (originalSource == "ticket-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "reopen-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
await openticket.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await opendiscord.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
}
})
+38 -38
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//DELETE COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//DELETE COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:delete",generalConfig.data.prefix,"delete"))
openticket.responders.commands.get("openticket:delete").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:delete",generalConfig.data.prefix,"delete"))
opendiscord.responders.commands.get("openticket:delete").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,17 +46,17 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:delete",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -65,11 +65,11 @@ export const registerCommandResponders = async () => {
//start deleting ticket
await instance.defer(false)
await instance.reply(await openticket.builders.messages.getSafe("openticket:delete-message").build(source,{guild,channel,user,ticket,reason}))
await openticket.actions.get("openticket:delete-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:delete-message").build(source,{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:delete-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript})
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'delete' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'delete' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -81,35 +81,35 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//DELETE TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:delete-ticket",/^od:delete-ticket/))
openticket.responders.buttons.get("openticket:delete-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:delete-ticket",/^od:delete-ticket/))
opendiscord.responders.buttons.get("openticket:delete-ticket").workers.add(
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "reopen-message" && originalSource != "close-message" && originalSource != "autoclose-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:delete-ticket-ticket-message").activate(instance)
else if (originalSource == "close-message") await openticket.verifybars.get("openticket:delete-ticket-close-message").activate(instance)
else if (originalSource == "reopen-message") await openticket.verifybars.get("openticket:delete-ticket-reopen-message").activate(instance)
else if (originalSource == "autoclose-message") await openticket.verifybars.get("openticket:delete-ticket-autoclose-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:delete-ticket-ticket-message").activate(instance)
else if (originalSource == "close-message") await opendiscord.verifybars.get("openticket:delete-ticket-close-message").activate(instance)
else if (originalSource == "reopen-message") await opendiscord.verifybars.get("openticket:delete-ticket-reopen-message").activate(instance)
else if (originalSource == "autoclose-message") await opendiscord.verifybars.get("openticket:delete-ticket-autoclose-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//REOPEN WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:delete-ticket-reason",/^od:delete-ticket-reason_/))
openticket.responders.modals.get("openticket:delete-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:delete-ticket-reason",/^od:delete-ticket-reason_/))
opendiscord.responders.modals.get("openticket:delete-ticket-reason").workers.add([
new api.ODWorker("openticket:delete-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -120,29 +120,29 @@ export const registerModalResponders = async () => {
if (originalSource == "ticket-message"){
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
ticket.get("openticket:for-deletion").value = true
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "close-message"){
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "reopen-message"){
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "autoclose-message"){
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
//don't await DELETE action => else it will update the message after the channel has been deleted
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
opendiscord.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
}
})
])
+22 -22
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//HELP COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//HELP COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:help",generalConfig.data.prefix,"help"))
openticket.responders.commands.get("openticket:help").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:help",generalConfig.data.prefix,"help"))
opendiscord.responders.commands.get("openticket:help").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.help
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -53,10 +53,10 @@ export const registerCommandResponders = async () => {
}else if (!generalConfig.data.slashCommands) mode = "text"
else mode = "slash"
await instance.reply(await openticket.builders.messages.getSafe("openticket:help-menu").build(source,{mode,page:0}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:help-menu").build(source,{mode,page:0}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'help' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'help' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -68,8 +68,8 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//HELP MENU SWITCH BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-switch",/^od:help-menu-switch_(slash|text)/))
openticket.responders.buttons.get("openticket:help-menu-switch").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-switch",/^od:help-menu-switch_(slash|text)/))
opendiscord.responders.buttons.get("openticket:help-menu-switch").workers.add(
new api.ODWorker("openticket:update-help-menu",0,async (instance,params,source,cancel) => {
const mode = instance.interaction.customId.split("_")[1] as "slash"|"text"
const pageButton = instance.getMessageComponent("button",/^od:help-menu-page_([0-9]+)/)
@@ -77,35 +77,35 @@ export const registerButtonResponders = async () => {
const newMode = (mode == "slash") ? "text" : "slash"
const msg = await openticket.builders.messages.getSafe("openticket:help-menu").build("button",{mode:newMode,page:currentPage})
const msg = await opendiscord.builders.messages.getSafe("openticket:help-menu").build("button",{mode:newMode,page:currentPage})
await instance.update(msg)
})
)
//HELP MENU PREVIOUS BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-previous",/^od:help-menu-previous/))
openticket.responders.buttons.get("openticket:help-menu-previous").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-previous",/^od:help-menu-previous/))
opendiscord.responders.buttons.get("openticket:help-menu-previous").workers.add(
new api.ODWorker("openticket:update-help-menu",0,async (instance,params,source,cancel) => {
const switchButton = instance.getMessageComponent("button",/^od:help-menu-switch_(slash|text)/)
const pageButton = instance.getMessageComponent("button",/^od:help-menu-page_([0-9]+)/)
const currentPage = (pageButton && pageButton.customId) ? Number(pageButton.customId.split("_")[1]) : 0
const currentMode = (switchButton && switchButton.customId) ? switchButton.customId.split("_")[1] as "text"|"slash" : "slash"
const msg = await openticket.builders.messages.getSafe("openticket:help-menu").build("button",{mode:currentMode,page:currentPage-1})
const msg = await opendiscord.builders.messages.getSafe("openticket:help-menu").build("button",{mode:currentMode,page:currentPage-1})
await instance.update(msg)
})
)
//HELP MENU NEXT BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-next",/^od:help-menu-next/))
openticket.responders.buttons.get("openticket:help-menu-next").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-next",/^od:help-menu-next/))
opendiscord.responders.buttons.get("openticket:help-menu-next").workers.add(
new api.ODWorker("openticket:update-help-menu",0,async (instance,params,source,cancel) => {
const switchButton = instance.getMessageComponent("button",/^od:help-menu-switch_(slash|text)/)
const pageButton = instance.getMessageComponent("button",/^od:help-menu-page_([0-9]+)/)
const currentPage = (pageButton && pageButton.customId) ? Number(pageButton.customId.split("_")[1]) : 0
const currentMode = (switchButton && switchButton.customId) ? switchButton.customId.split("_")[1] as "text"|"slash" : "slash"
const msg = await openticket.builders.messages.getSafe("openticket:help-menu").build("button",{mode:currentMode,page:currentPage+1})
const msg = await opendiscord.builders.messages.getSafe("openticket:help-menu").build("button",{mode:currentMode,page:currentPage+1})
await instance.update(msg)
})
)
+21 -21
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//MOVE COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//MOVE COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:move",generalConfig.data.prefix,"move"))
openticket.responders.commands.get("openticket:move").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:move",generalConfig.data.prefix,"move"))
opendiscord.responders.commands.get("openticket:move").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.move
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,42 +46,42 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:move",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
const id = instance.options.getString("id",true)
const reason = instance.options.getString("reason",false)
const option = openticket.options.get(id)
const option = opendiscord.options.get(id)
//return if unknown option
if (!option || !(option instanceof api.ODTicketOption)){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.titles.unknownOption"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.titles.unknownOption"),layout:"simple"}))
return cancel()
}
//return if option is the same
if (ticket.option.id.value == option.id.value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"This ticket is already the same as the chosen option!",layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"This ticket is already the same as the chosen option!",layout:"simple"}))
return cancel()
}
//start moving ticket
await instance.defer(false)
await openticket.actions.get("openticket:move-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data:option})
await instance.reply(await openticket.builders.messages.getSafe("openticket:move-message").build(source,{guild,channel,user,ticket,reason,data:option}))
await opendiscord.actions.get("openticket:move-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data:option})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:move-message").build(source,{guild,channel,user,ticket,reason,data:option}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'move' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'move' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+18 -18
View File
@@ -1,45 +1,45 @@
///////////////////////////////////////
//STATS COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//PANEL COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:panel",generalConfig.data.prefix,/^panel/))
openticket.responders.commands.get("openticket:panel").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:panel",generalConfig.data.prefix,/^panel/))
opendiscord.responders.commands.get("openticket:panel").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.panel
//command is disabled
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -48,30 +48,30 @@ export const registerCommandResponders = async () => {
const {guild,channel,user} = instance
if (!guild || instance.channel.type == discord.ChannelType.GroupDM){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
const id = instance.options.getString("id",true)
const panel = openticket.panels.get(id)
const panel = opendiscord.panels.get(id)
if (!panel){
//invalid panel
instance.reply(await openticket.builders.messages.getSafe("openticket:error-panel-unknown").build(source,{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-panel-unknown").build(source,{guild,channel,user}))
return cancel()
}
await instance.reply(await openticket.builders.messages.getSafe("openticket:panel-ready").build(source,{guild,channel,user,panel}))
const panelMessage = await instance.channel.send((await openticket.builders.messages.getSafe("openticket:panel").build(source,{guild,channel,user,panel})).message)
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:panel-ready").build(source,{guild,channel,user,panel}))
const panelMessage = await instance.channel.send((await opendiscord.builders.messages.getSafe("openticket:panel").build(source,{guild,channel,user,panel})).message)
//add panel to database on auto-update
if (instance.options.getBoolean("auto-update",false)){
const globalDatabase = openticket.databases.get("openticket:global")
const globalDatabase = opendiscord.databases.get("openticket:global")
await globalDatabase.set("openticket:panel-update",panelMessage.channel.id+"_"+panelMessage.id,panel.id.value)
}
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'panel' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'panel' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+33 -33
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//PIN COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//PIN COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:pin",generalConfig.data.prefix,"pin"))
openticket.responders.commands.get("openticket:pin").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:pin",generalConfig.data.prefix,"pin"))
opendiscord.responders.commands.get("openticket:pin").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.pin
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,22 +46,22 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:pin",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already pinned
if (ticket.get("openticket:pinned").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -69,11 +69,11 @@ export const registerCommandResponders = async () => {
//start pinning ticket
await instance.defer(false)
await openticket.actions.get("openticket:pin-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await openticket.builders.messages.getSafe("openticket:pin-message").build(source,{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:pin-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:pin-message").build(source,{guild,channel,user,ticket,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'pin' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'pin' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -85,33 +85,33 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//PIN TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:pin-ticket",/^od:pin-ticket/))
openticket.responders.buttons.get("openticket:pin-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:pin-ticket",/^od:pin-ticket/))
opendiscord.responders.buttons.get("openticket:pin-ticket").workers.add(
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "unpin-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:pin-ticket-ticket-message").activate(instance)
else await openticket.verifybars.get("openticket:pin-ticket-unpin-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:pin-ticket-ticket-message").activate(instance)
else await opendiscord.verifybars.get("openticket:pin-ticket-unpin-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//PIN WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:pin-ticket-reason",/^od:pin-ticket-reason_/))
openticket.responders.modals.get("openticket:pin-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:pin-ticket-reason",/^od:pin-ticket-reason_/))
opendiscord.responders.modals.get("openticket:pin-ticket-reason").workers.add([
new api.ODWorker("openticket:pin-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -121,15 +121,15 @@ export const registerModalResponders = async () => {
//pin with reason
if (originalSource == "ticket-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "unpin-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:pin-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:pin-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
await openticket.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await opendiscord.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
}
})
+20 -20
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//REMOVE COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//REMOVE COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:remove",generalConfig.data.prefix,"remove"))
openticket.responders.commands.get("openticket:remove").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:remove",generalConfig.data.prefix,"remove"))
opendiscord.responders.commands.get("openticket:remove").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.remove
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,17 +46,17 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:remove",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -64,19 +64,19 @@ export const registerCommandResponders = async () => {
const reason = instance.options.getString("reason",false)
//return when user is not a participant of the ticket (admins & creator can't be removed)
const participants = await openticket.tickets.getAllTicketParticipants(ticket)
const participants = await opendiscord.tickets.getAllTicketParticipants(ticket)
if (!participants || !participants.find((p) => p.user.id == data.id && p.role == "participant")){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.remove"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.remove"),layout:"simple"}))
return cancel()
}
//start removing user from ticket
await instance.defer(false)
await openticket.actions.get("openticket:remove-ticket-user").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data})
await instance.reply(await openticket.builders.messages.getSafe("openticket:remove-message").build(source,{guild,channel,user,ticket,reason,data}))
await opendiscord.actions.get("openticket:remove-ticket-user").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:remove-message").build(source,{guild,channel,user,ticket,reason,data}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'remove' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'remove' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+18 -18
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//RENAME COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//RENAME COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:rename",generalConfig.data.prefix,"rename"))
openticket.responders.commands.get("openticket:rename").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:rename",generalConfig.data.prefix,"rename"))
opendiscord.responders.commands.get("openticket:rename").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.rename
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,17 +46,17 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:rename",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -65,11 +65,11 @@ export const registerCommandResponders = async () => {
//start renaming ticket
await instance.defer(false)
await openticket.actions.get("openticket:rename-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data:name})
await instance.reply(await openticket.builders.messages.getSafe("openticket:rename-message").build(source,{guild,channel,user,ticket,reason,data:name}))
await opendiscord.actions.get("openticket:rename-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data:name})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:rename-message").build(source,{guild,channel,user,ticket,reason,data:name}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'rename' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'rename' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+36 -36
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//REOPEN COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//REOPEN COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:reopen",generalConfig.data.prefix,"reopen"))
openticket.responders.commands.get("openticket:reopen").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:reopen",generalConfig.data.prefix,"reopen"))
opendiscord.responders.commands.get("openticket:reopen").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.reopen
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,22 +46,22 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:reopen",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not closed
if (!ticket.get("openticket:closed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -69,11 +69,11 @@ export const registerCommandResponders = async () => {
//start reopening ticket
await instance.defer(false)
await openticket.actions.get("openticket:reopen-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await openticket.builders.messages.getSafe("openticket:reopen-message").build(source,{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:reopen-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build(source,{guild,channel,user,ticket,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'reopen' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'reopen' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -85,34 +85,34 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//REOPEN TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:reopen-ticket",/^od:reopen-ticket/))
openticket.responders.buttons.get("openticket:reopen-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:reopen-ticket",/^od:reopen-ticket/))
opendiscord.responders.buttons.get("openticket:reopen-ticket").workers.add(
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "close-message" && originalSource != "autoclose-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:reopen-ticket-ticket-message").activate(instance)
else if (originalSource == "close-message") await openticket.verifybars.get("openticket:reopen-ticket-close-message").activate(instance)
else await openticket.verifybars.get("openticket:reopen-ticket-autoclose-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:reopen-ticket-ticket-message").activate(instance)
else if (originalSource == "close-message") await opendiscord.verifybars.get("openticket:reopen-ticket-close-message").activate(instance)
else await opendiscord.verifybars.get("openticket:reopen-ticket-autoclose-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//REOPEN WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:reopen-ticket-reason",/^od:reopen-ticket-reason_/))
openticket.responders.modals.get("openticket:reopen-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:reopen-ticket-reason",/^od:reopen-ticket-reason_/))
opendiscord.responders.modals.get("openticket:reopen-ticket-reason").workers.add([
new api.ODWorker("openticket:reopen-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -122,19 +122,19 @@ export const registerModalResponders = async () => {
//reopen with reason
if (originalSource == "ticket-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "close-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "autoclose-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await opendiscord.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
}
})
+10 -10
View File
@@ -1,41 +1,41 @@
///////////////////////////////////////
//ROLE BUTTON (not command)
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerButtonResponders = async () => {
//ROLE OPTION BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:role-option",/^od:role-option_/))
openticket.responders.buttons.get("openticket:role-option").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:role-option",/^od:role-option_/))
opendiscord.responders.buttons.get("openticket:role-option").workers.add(
new api.ODWorker("openticket:role-option",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get option
const optionId = instance.interaction.customId.split("_")[2]
const option = openticket.options.get(optionId)
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODRoleOption)){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
return cancel()
}
//reaction role
await instance.defer("reply",true)
const res = await openticket.actions.get("openticket:reaction-role").run("panel-button",{guild,user,option,overwriteMode:null})
const res = await opendiscord.actions.get("openticket:reaction-role").run("panel-button",{guild,user,option,overwriteMode:null})
if (!res.result || !res.role){
//error
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive role update data from worker!",layout:"advanced"}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive role update data from worker!",layout:"advanced"}))
return cancel()
}
if (generalConfig.data.system.replyOnReactionRole) await instance.reply(await openticket.builders.messages.getSafe("openticket:reaction-role").build("panel-button",{guild,user,role:res.role,result:res.result}))
if (generalConfig.data.system.replyOnReactionRole) await instance.reply(await opendiscord.builders.messages.getSafe("openticket:reaction-role").build("panel-button",{guild,user,role:res.role,result:res.result}))
})
)
}
+22 -22
View File
@@ -1,30 +1,30 @@
///////////////////////////////////////
//STATS COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//STATS COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:stats",generalConfig.data.prefix,/^stats/))
openticket.responders.commands.get("openticket:stats").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:stats",generalConfig.data.prefix,/^stats/))
opendiscord.responders.commands.get("openticket:stats").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.stats
//command is disabled
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}
//reset subcommand is owner/developer only
if (instance.options.getSubCommand() == "reset"){
if (!openticket.permissions.hasPermissions("owner",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("owner",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["owner","developer"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["owner","developer"]}))
return cancel()
}else return
}
@@ -32,26 +32,26 @@ export const registerCommandResponders = async () => {
//permissions for normal scopes
if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -60,30 +60,30 @@ export const registerCommandResponders = async () => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
const scope = instance.options.getSubCommand()
if (!scope || (scope != "global" && scope != "ticket" && scope != "user" && scope != "reset")) return
if (scope == "global"){
await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-global").build(source,{guild,channel,user}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:stats-global").build(source,{guild,channel,user}))
}else if (scope == "ticket"){
const id = instance.options.getChannel("ticket",false)?.id ?? channel.id
const ticket = openticket.tickets.get(id)
const ticket = opendiscord.tickets.get(id)
if (ticket) await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-ticket").build(source,{guild,channel,user,scopeData:ticket}))
else await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-ticket-unknown").build(source,{guild,channel,user,id}))
if (ticket) await instance.reply(await opendiscord.builders.messages.getSafe("openticket:stats-ticket").build(source,{guild,channel,user,scopeData:ticket}))
else await instance.reply(await opendiscord.builders.messages.getSafe("openticket:stats-ticket-unknown").build(source,{guild,channel,user,id}))
}else if (scope == "user"){
const statsUser = instance.options.getUser("user",false) ?? user
await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-user").build(source,{guild,channel,user,scopeData:statsUser}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:stats-user").build(source,{guild,channel,user,scopeData:statsUser}))
}else if (scope == "reset"){
const reason = instance.options.getString("reason",false)
openticket.stats.reset()
await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-reset").build(source,{guild,channel,user,reason}))
opendiscord.stats.reset()
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:stats-reset").build(source,{guild,channel,user,reason}))
}
}),
@@ -95,7 +95,7 @@ export const registerCommandResponders = async () => {
}else if (scope == "user"){
data = instance.options.getUser("user",false)?.id ?? instance.user.id
}else data = "/"
openticket.log(instance.user.displayName+" used the 'stats "+scope+"' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'stats "+scope+"' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
+70 -70
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//TICKET COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//TICKET COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:ticket",generalConfig.data.prefix,/^ticket/))
openticket.responders.commands.get("openticket:ticket").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:ticket",generalConfig.data.prefix,/^ticket/))
opendiscord.responders.commands.get("openticket:ticket").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.ticket
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -47,51 +47,51 @@ export const registerCommandResponders = async () => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get option
const optionId = instance.options.getString("id",true)
const option = openticket.options.get(optionId)
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODTicketOption)){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
return cancel()
}
//check ticket permissions
const res = await openticket.actions.get("openticket:create-ticket-permissions").run(source,{guild,user,option})
const res = await opendiscord.actions.get("openticket:create-ticket-permissions").run(source,{guild,user,option})
if (!res.valid){
//error
if (res.reason == "blacklist") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return cancel()
}
//start ticket creation
if (option.exists("openticket:questions") && option.get("openticket:questions").value.length > 0){
//send modal
instance.modal(await openticket.builders.modals.getSafe("openticket:ticket-questions").build(source,{guild,channel,user,option}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:ticket-questions").build(source,{guild,channel,user,option}))
}else{
//create ticket
await instance.defer(true)
const res = await openticket.actions.get("openticket:create-ticket").run(source,{guild,user,answers:[],option})
const res = await opendiscord.actions.get("openticket:create-ticket").run(source,{guild,user,answers:[],option})
if (!res.channel || !res.ticket){
//error
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
return cancel()
}
await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build(source,{guild,channel:res.channel,user,ticket:res.ticket}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:ticket-created").build(source,{guild,channel:res.channel,user,ticket:res.ticket}))
}
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'ticket' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'ticket' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -103,53 +103,53 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//TICKET OPTION BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:ticket-option",/^od:ticket-option_/))
openticket.responders.buttons.get("openticket:ticket-option").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:ticket-option",/^od:ticket-option_/))
opendiscord.responders.buttons.get("openticket:ticket-option").workers.add(
new api.ODWorker("openticket:ticket-option",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get option
const optionId = instance.interaction.customId.split("_")[2]
const option = openticket.options.get(optionId)
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODTicketOption)){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
return cancel()
}
//check ticket permissions
const res = await openticket.actions.get("openticket:create-ticket-permissions").run("panel-button",{guild,user,option})
const res = await opendiscord.actions.get("openticket:create-ticket-permissions").run("panel-button",{guild,user,option})
if (!res.valid){
//error
if (res.reason == "blacklist") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return cancel()
}
//start ticket creation
if (option.exists("openticket:questions") && option.get("openticket:questions").value.length > 0){
//send modal
instance.modal(await openticket.builders.modals.getSafe("openticket:ticket-questions").build("panel-button",{guild,channel,user,option}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:ticket-questions").build("panel-button",{guild,channel,user,option}))
}else{
//create ticket
await instance.defer("reply",true)
const res = await openticket.actions.get("openticket:create-ticket").run("panel-button",{guild,user,answers:[],option})
const res = await opendiscord.actions.get("openticket:create-ticket").run("panel-button",{guild,user,answers:[],option})
if (!res.channel || !res.ticket){
//error
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
return cancel()
}
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build("panel-button",{guild,channel:res.channel,user,ticket:res.ticket}))
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await opendiscord.builders.messages.getSafe("openticket:ticket-created").build("panel-button",{guild,channel:res.channel,user,ticket:res.ticket}))
}
})
)
@@ -157,53 +157,53 @@ export const registerButtonResponders = async () => {
export const registerDropdownResponders = async () => {
//PANEL DROPDOWN TICKETS DROPDOWN RESPONDER
openticket.responders.dropdowns.add(new api.ODDropdownResponder("openticket:panel-dropdown-tickets",/^od:panel-dropdown_/))
openticket.responders.dropdowns.get("openticket:panel-dropdown-tickets").workers.add(
opendiscord.responders.dropdowns.add(new api.ODDropdownResponder("openticket:panel-dropdown-tickets",/^od:panel-dropdown_/))
opendiscord.responders.dropdowns.get("openticket:panel-dropdown-tickets").workers.add(
new api.ODWorker("openticket:panel-dropdown-tickets",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get option
const optionId = instance.values.getStringValues()[0].split("_")[2]
const option = openticket.options.get(optionId)
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODTicketOption)){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
return cancel()
}
//check ticket permissions
const res = await openticket.actions.get("openticket:create-ticket-permissions").run("panel-dropdown",{guild,user,option})
const res = await opendiscord.actions.get("openticket:create-ticket-permissions").run("panel-dropdown",{guild,user,option})
if (!res.valid){
//error
if (res.reason == "blacklist") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return cancel()
}
//start ticket creation
if (option.exists("openticket:questions") && option.get("openticket:questions").value.length > 0){
//send modal
instance.modal(await openticket.builders.modals.getSafe("openticket:ticket-questions").build("panel-dropdown",{guild,channel,user,option}))
instance.modal(await opendiscord.builders.modals.getSafe("openticket:ticket-questions").build("panel-dropdown",{guild,channel,user,option}))
}else{
//create ticket
await instance.defer("reply",true)
const res = await openticket.actions.get("openticket:create-ticket").run("panel-dropdown",{guild,user,answers:[],option})
const res = await opendiscord.actions.get("openticket:create-ticket").run("panel-dropdown",{guild,user,answers:[],option})
if (!res.channel || !res.ticket){
//error
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
return cancel()
}
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build("panel-dropdown",{guild,channel:res.channel,user,ticket:res.ticket}))
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await opendiscord.builders.messages.getSafe("openticket:ticket-created").build("panel-dropdown",{guild,channel:res.channel,user,ticket:res.ticket}))
}
})
)
@@ -211,14 +211,14 @@ export const registerDropdownResponders = async () => {
export const registerModalResponders = async () => {
//TICKET QUESTIONS RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:ticket-questions",/^od:ticket-questions_/))
openticket.responders.modals.get("openticket:ticket-questions").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:ticket-questions",/^od:ticket-questions_/))
opendiscord.responders.modals.get("openticket:ticket-questions").workers.add([
new api.ODWorker("openticket:ticket-questions",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) throw new api.ODSystemError("The 'Ticket Questions' modal requires a channel for responding!")
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
@@ -226,17 +226,17 @@ export const registerModalResponders = async () => {
//get option
const optionId = instance.interaction.customId.split("_")[1]
const option = openticket.options.get(optionId)
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODTicketOption)){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel,user:instance.user}))
return cancel()
}
//get answers
const answers: {id:string,name:string,type:"short"|"paragraph",value:string|null}[] = []
option.get("openticket:questions").value.forEach((id) => {
const question = openticket.questions.get(id)
const question = opendiscord.questions.get(id)
if (!question) return
if (question instanceof api.ODShortQuestion){
answers.push({
@@ -257,13 +257,13 @@ export const registerModalResponders = async () => {
//create ticket
await instance.defer("reply",true)
const res = await openticket.actions.get("openticket:create-ticket").run(originalSource,{guild,user,answers,option})
const res = await opendiscord.actions.get("openticket:create-ticket").run(originalSource,{guild,user,answers,option})
if (!res.channel || !res.ticket){
//error
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel,user,error:"Unable to receive ticket or channel from callback! #2",layout:"advanced"}))
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild,channel,user,error:"Unable to receive ticket or channel from callback! #2",layout:"advanced"}))
return cancel()
}
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build(originalSource,{guild,channel:res.channel,user,ticket:res.ticket}))
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await opendiscord.builders.messages.getSafe("openticket:ticket-created").build(originalSource,{guild,channel:res.channel,user,ticket:res.ticket}))
})
])
}
+33 -33
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//UNCLAIM COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//UNCLAIM COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:unclaim",generalConfig.data.prefix,"unclaim"))
openticket.responders.commands.get("openticket:unclaim").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:unclaim",generalConfig.data.prefix,"unclaim"))
opendiscord.responders.commands.get("openticket:unclaim").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unclaim
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,22 +46,22 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:unclaim",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not claimed
if (!ticket.get("openticket:claimed").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -69,11 +69,11 @@ export const registerCommandResponders = async () => {
//start unclaiming ticket
await instance.defer(false)
await openticket.actions.get("openticket:unclaim-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await openticket.builders.messages.getSafe("openticket:unclaim-message").build(source,{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:unclaim-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:unclaim-message").build(source,{guild,channel,user,ticket,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'unclaim' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'unclaim' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -85,33 +85,33 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//UNCLAIM TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:unclaim-ticket",/^od:unclaim-ticket/))
openticket.responders.buttons.get("openticket:unclaim-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:unclaim-ticket",/^od:unclaim-ticket/))
opendiscord.responders.buttons.get("openticket:unclaim-ticket").workers.add(
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "claim-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:unclaim-ticket-ticket-message").activate(instance)
else await openticket.verifybars.get("openticket:unclaim-ticket-claim-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:unclaim-ticket-ticket-message").activate(instance)
else await opendiscord.verifybars.get("openticket:unclaim-ticket-claim-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//UNCLAIM WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:unclaim-ticket-reason",/^od:unclaim-ticket-reason_/))
openticket.responders.modals.get("openticket:unclaim-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:unclaim-ticket-reason",/^od:unclaim-ticket-reason_/))
opendiscord.responders.modals.get("openticket:unclaim-ticket-reason").workers.add([
new api.ODWorker("openticket:unclaim-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -121,15 +121,15 @@ export const registerModalResponders = async () => {
//unclaim with reason
if (originalSource == "ticket-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "claim-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
await openticket.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await opendiscord.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
}
})
])
+33 -33
View File
@@ -1,44 +1,44 @@
///////////////////////////////////////
//UNPIN COMMAND
///////////////////////////////////////
import {openticket, api, utilities} from "../index"
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const registerCommandResponders = async () => {
//UNPIN COMMAND RESPONDER
openticket.responders.commands.add(new api.ODCommandResponder("openticket:unpin",generalConfig.data.prefix,"unpin"))
openticket.responders.commands.get("openticket:unpin").workers.add([
opendiscord.responders.commands.add(new api.ODCommandResponder("openticket:unpin",generalConfig.data.prefix,"unpin"))
opendiscord.responders.commands.get("openticket:unpin").workers.add([
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unpin
if (permissionMode == "none"){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
@@ -46,22 +46,22 @@ export const registerCommandResponders = async () => {
new api.ODWorker("openticket:unpin",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!guild){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
const ticket = openticket.tickets.get(channel.id)
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not pinned yet
if (!ticket.get("openticket:pinned").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("openticket:busy").value){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
@@ -69,11 +69,11 @@ export const registerCommandResponders = async () => {
//start unpinning ticket
await instance.defer(false)
await openticket.actions.get("openticket:unpin-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await openticket.builders.messages.getSafe("openticket:unpin-message").build(source,{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:unpin-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("openticket:unpin-message").build(source,{guild,channel,user,ticket,reason}))
}),
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
openticket.log(instance.user.displayName+" used the 'unpin' command!","info",[
opendiscord.log(instance.user.displayName+" used the 'unpin' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
@@ -85,33 +85,33 @@ export const registerCommandResponders = async () => {
export const registerButtonResponders = async () => {
//UNPIN TICKET BUTTON RESPONDER
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:unpin-ticket",/^od:unpin-ticket/))
openticket.responders.buttons.get("openticket:unpin-ticket").workers.add(
opendiscord.responders.buttons.add(new api.ODButtonResponder("openticket:unpin-ticket",/^od:unpin-ticket/))
opendiscord.responders.buttons.get("openticket:unpin-ticket").workers.add(
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source,cancel) => {
const originalSource = instance.interaction.customId.split("_")[1]
if (originalSource != "ticket-message" && originalSource != "pin-message") return
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:unpin-ticket-ticket-message").activate(instance)
else await openticket.verifybars.get("openticket:unpin-ticket-pin-message").activate(instance)
if (originalSource == "ticket-message") await opendiscord.verifybars.get("openticket:unpin-ticket-ticket-message").activate(instance)
else await opendiscord.verifybars.get("openticket:unpin-ticket-pin-message").activate(instance)
})
)
}
export const registerModalResponders = async () => {
//UNPIN WITH REASON MODAL RESPONDER
openticket.responders.modals.add(new api.ODModalResponder("openticket:unpin-ticket-reason",/^od:unpin-ticket-reason_/))
openticket.responders.modals.get("openticket:unpin-ticket-reason").workers.add([
opendiscord.responders.modals.add(new api.ODModalResponder("openticket:unpin-ticket-reason",/^od:unpin-ticket-reason_/))
opendiscord.responders.modals.get("openticket:unpin-ticket-reason").workers.add([
new api.ODWorker("openticket:unpin-ticket-reason",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
if (!channel) return
if (!guild){
//error
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
return cancel()
}
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
if (!ticket || channel.isDMBased()){
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
@@ -121,15 +121,15 @@ export const registerModalResponders = async () => {
//unpin with reason
if (originalSource == "ticket-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
await opendiscord.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
}else if (originalSource == "pin-message"){
await instance.defer("update",false)
await openticket.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await openticket.builders.messages.getSafe("openticket:unpin-message").build("other",{guild,channel,user,ticket,reason}))
await opendiscord.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.update(await opendiscord.builders.messages.getSafe("openticket:unpin-message").build("other",{guild,channel,user,ticket,reason}))
}else if (originalSource == "other"){
await instance.defer("update",false)
await openticket.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
await opendiscord.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
}
})
])
+1 -1
View File
@@ -118,7 +118,7 @@ export interface ODActionManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODActionManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.actions`!
* This default class is made for the global variable `opendiscord.actions`!
*/
export class ODActionManager_Default extends ODActionManager {
get<ActionId extends keyof ODActionManagerIds_Default>(id:ActionId): ODAction_Default<ODActionManagerIds_Default[ActionId]["source"],ODActionManagerIds_Default[ActionId]["params"],ODActionManagerIds_Default[ActionId]["result"],ODActionManagerIds_Default[ActionId]["workers"]>
+1 -1
View File
@@ -19,7 +19,7 @@ export interface ODVersionManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODFlagManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.flags`!
* This default class is made for the global variable `opendiscord.flags`!
*/
export class ODVersionManager_Default extends ODVersionManager {
get<VersionId extends keyof ODVersionManagerIds_Default>(id:VersionId): ODVersionManagerIds_Default[VersionId]
+7 -7
View File
@@ -18,7 +18,7 @@ import { ODRole, ODRoleUpdateResult } from "../openticket/role"
* This is a special class that adds type definitions & typescript to the ODBuilderManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders`!
* This default class is made for the global variable `opendiscord.builders`!
*/
export class ODBuilderManager_Default extends ODBuilderManager {
declare buttons: ODButtonManager_Default
@@ -69,7 +69,7 @@ export interface ODButtonManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODButtonManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders.buttons`!
* This default class is made for the global variable `opendiscord.builders.buttons`!
*/
export class ODButtonManager_Default extends ODButtonManager {
get<ButtonId extends keyof ODButtonManagerIds_Default>(id:ButtonId): ODButton_Default<ODButtonManagerIds_Default[ButtonId]["source"],ODButtonManagerIds_Default[ButtonId]["params"],ODButtonManagerIds_Default[ButtonId]["workers"]>
@@ -123,7 +123,7 @@ export interface ODDropdownManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODDropdownManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders.dropdowns`!
* This default class is made for the global variable `opendiscord.builders.dropdowns`!
*/
export class ODDropdownManager_Default extends ODDropdownManager {
get<DropdownId extends keyof ODDropdownManagerIds_Default>(id:DropdownId): ODDropdown_Default<ODDropdownManagerIds_Default[DropdownId]["source"],ODDropdownManagerIds_Default[DropdownId]["params"],ODDropdownManagerIds_Default[DropdownId]["workers"]>
@@ -177,7 +177,7 @@ export interface ODFileManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODFileManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders.files`!
* This default class is made for the global variable `opendiscord.builders.files`!
*/
export class ODFileManager_Default extends ODFileManager {
get<FileId extends keyof ODFileManagerIds_Default>(id:FileId): ODFile_Default<ODFileManagerIds_Default[FileId]["source"],ODFileManagerIds_Default[FileId]["params"],ODFileManagerIds_Default[FileId]["workers"]>
@@ -297,7 +297,7 @@ export interface ODEmbedManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODEmbedManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders.embeds`!
* This default class is made for the global variable `opendiscord.builders.embeds`!
*/
export class ODEmbedManager_Default extends ODEmbedManager {
get<EmbedId extends keyof ODEmbedManagerIds_Default>(id:EmbedId): ODEmbed_Default<ODEmbedManagerIds_Default[EmbedId]["source"],ODEmbedManagerIds_Default[EmbedId]["params"],ODEmbedManagerIds_Default[EmbedId]["workers"]>
@@ -428,7 +428,7 @@ export interface ODMessageManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODMessageManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders.messages`!
* This default class is made for the global variable `opendiscord.builders.messages`!
*/
export class ODMessageManager_Default extends ODMessageManager {
get<MessageId extends keyof ODMessageManagerIds_Default>(id:MessageId): ODMessage_Default<ODMessageManagerIds_Default[MessageId]["source"],ODMessageManagerIds_Default[MessageId]["params"],ODMessageManagerIds_Default[MessageId]["workers"]>
@@ -489,7 +489,7 @@ export interface ODModalManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODModalManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.builders.modals`!
* This default class is made for the global variable `opendiscord.builders.modals`!
*/
export class ODModalManager_Default extends ODModalManager {
get<ModalId extends keyof ODModalManagerIds_Default>(id:ModalId): ODModal_Default<ODModalManagerIds_Default[ModalId]["source"],ODModalManagerIds_Default[ModalId]["params"],ODModalManagerIds_Default[ModalId]["workers"]>
+4 -4
View File
@@ -22,7 +22,7 @@ export interface ODCheckerManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODCheckerManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.checkers`!
* This default class is made for the global variable `opendiscord.checkers`!
*/
export class ODCheckerManager_Default extends ODCheckerManager {
declare translation: ODCheckerTranslationRegister_Default
@@ -55,7 +55,7 @@ export class ODCheckerManager_Default extends ODCheckerManager {
* This is a special class that adds type definitions & features to the ODCheckerRenderer class.
* It contains the code that renders the default config checker.
*
* This default class is made for the global variable `openticket.checkers.renderer`!
* This default class is made for the global variable `opendiscord.checkers.renderer`!
*/
export class ODCheckerRenderer_Default extends ODCheckerRenderer {
extraHeaderText: string[] = []
@@ -306,7 +306,7 @@ export type ODCheckerTranslationRegisterMessageIds_Default = (
* This is a special class that adds type definitions & typescript to the ODCheckerTranslationRegister class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.checkers.translation`!
* This default class is made for the global variable `opendiscord.checkers.translation`!
*/
export class ODCheckerTranslationRegister_Default extends ODCheckerTranslationRegister {
get(type:"other", id:ODCheckerTranslationRegisterOtherIds_Default): string
@@ -355,7 +355,7 @@ export interface ODCheckerFunctionManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODCheckerFunctionManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.checkers.functions`!
* This default class is made for the global variable `opendiscord.checkers.functions`!
*/
export class ODCheckerFunctionManager_Default extends ODCheckerFunctionManager {
get<CheckerFunctionId extends keyof ODCheckerFunctionManagerIds_Default>(id:CheckerFunctionId): ODCheckerFunctionManagerIds_Default[CheckerFunctionId]
+3 -3
View File
@@ -8,7 +8,7 @@ import { ODClientManager, ODSlashCommand, ODTextCommand, ODSlashCommandManager,
* This is a special class that adds type definitions & typescript to the ODClientManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.client`!
* This default class is made for the global variable `opendiscord.client`!
*/
export class ODClientManager_Default extends ODClientManager {
declare slashCommands: ODSlashCommandManager_Default
@@ -45,7 +45,7 @@ export interface ODSlashCommandManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODSlashCommandManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.client.slashCommands`!
* This default class is made for the global variable `opendiscord.client.slashCommands`!
*/
export class ODSlashCommandManager_Default extends ODSlashCommandManager {
get<SlashCommandId extends keyof ODSlashCommandManagerIds_Default>(id:SlashCommandId): ODSlashCommandManagerIds_Default[SlashCommandId]
@@ -115,7 +115,7 @@ export interface ODTextCommandManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODTextCommandManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.client.textCommands`!
* This default class is made for the global variable `opendiscord.client.textCommands`!
*/
export class ODTextCommandManager_Default extends ODTextCommandManager {
get<TextCommandId extends keyof ODTextCommandManagerIds_Default>(id:TextCommandId): ODTextCommandManagerIds_Default[TextCommandId]
+1 -1
View File
@@ -31,7 +31,7 @@ export interface ODCodeManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODCodeManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.code`!
* This default class is made for the global variable `opendiscord.code`!
*/
export class ODCodeManager_Default extends ODCodeManager {
get<CodeId extends keyof ODCodeManagerIds_Default>(id:CodeId): ODCodeManagerIds_Default[CodeId]
+1 -1
View File
@@ -23,7 +23,7 @@ export interface ODConfigManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODConfigManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.configs`!
* This default class is made for the global variable `opendiscord.configs`!
*/
export class ODConfigManager_Default extends ODConfigManager {
get<ConfigId extends keyof ODConfigManagerIds_Default>(id:ConfigId): ODConfigManagerIds_Default[ConfigId]
+1 -1
View File
@@ -16,7 +16,7 @@ export interface ODLiveStatusManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODLiveStatusManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.livestatus`!
* This default class is made for the global variable `opendiscord.livestatus`!
*/
export class ODLiveStatusManager_Default extends ODLiveStatusManager {
get<LiveStatusId extends keyof ODLiveStatusManagerIds_Default>(id:LiveStatusId): ODLiveStatusManagerIds_Default[LiveStatusId]
+1 -1
View File
@@ -16,7 +16,7 @@ export interface ODCooldownManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODCooldownManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.cooldowns`!
* This default class is made for the global variable `opendiscord.cooldowns`!
*/
export class ODCooldownManager_Default extends ODCooldownManager {
get<CooldownId extends keyof ODCooldownManagerIds_Default>(id:CooldownId): ODCooldownManagerIds_Default[CooldownId]
+1 -1
View File
@@ -22,7 +22,7 @@ export interface ODDatabaseManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODDatabaseManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.databases`!
* This default class is made for the global variable `opendiscord.databases`!
*/
export class ODDatabaseManager_Default extends ODDatabaseManager {
get<DatabaseId extends keyof ODDatabaseManagerIds_Default>(id:DatabaseId): ODDatabaseManagerIds_Default[DatabaseId]
+2 -2
View File
@@ -296,7 +296,7 @@ export interface ODEventIds_Default {
* This is a special class that adds type definitions & typescript to the ODEvent class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.events`!
* This default class is made for the global variable `opendiscord.events`!
*/
export class ODEventManager_Default extends ODEventManager {
get<StartScreenId extends keyof ODEventIds_Default>(id:StartScreenId): ODEventIds_Default[StartScreenId]
@@ -325,7 +325,7 @@ export class ODEventManager_Default extends ODEventManager {
* This is a special class that adds type definitions & typescript to the ODEvent class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.events`!
* This default class is made for the global variable `opendiscord.events`!
*/
export class ODEvent_Default<Callback extends ((...args:any) => ODPromiseVoid)> extends ODEvent {
listen(callback:Callback): void {
+1 -1
View File
@@ -29,7 +29,7 @@ export interface ODFlagManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODFlagManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.flags`!
* This default class is made for the global variable `opendiscord.flags`!
*/
export class ODFlagManager_Default extends ODFlagManager {
get<FlagId extends keyof ODFlagManagerIds_Default>(id:FlagId): ODFlagManagerIds_Default[FlagId]
+8 -8
View File
@@ -22,7 +22,7 @@ export interface ODHelpMenuManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.helpmenu`!
* This default class is made for the global variable `opendiscord.helpmenu`!
*/
export class ODHelpMenuManager_Default extends ODHelpMenuManager {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerIds_Default>(id:HelpMenuCategoryId): ODHelpMenuManagerIds_Default[HelpMenuCategoryId]
@@ -60,7 +60,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultGeneral {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:general` category in `openticket.helpmenu`!
* This default class is made for the `openticket:general` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultGeneral extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultGeneral>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultGeneral[HelpMenuCategoryId]
@@ -99,7 +99,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultTicketBasic {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:ticket` category in `openticket.helpmenu`!
* This default class is made for the `openticket:ticket` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultTicketBasic extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketBasic>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketBasic[HelpMenuCategoryId]
@@ -139,7 +139,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:ticket` category in `openticket.helpmenu`!
* This default class is made for the `openticket:ticket` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultTicketAdvanced extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced[HelpMenuCategoryId]
@@ -179,7 +179,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultTicketUser {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:ticket` category in `openticket.helpmenu`!
* This default class is made for the `openticket:ticket` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultTicketUser extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketUser>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketUser[HelpMenuCategoryId]
@@ -220,7 +220,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultAdmin {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:admin` category in `openticket.helpmenu`!
* This default class is made for the `openticket:admin` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultAdmin extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultAdmin>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultAdmin[HelpMenuCategoryId]
@@ -262,7 +262,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultAdvanced {
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:advanced` category in `openticket.helpmenu`!
* This default class is made for the `openticket:advanced` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultAdvanced extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultAdvanced>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultAdvanced[HelpMenuCategoryId]
@@ -297,7 +297,7 @@ export interface ODHelpMenuManagerCategoryIds_DefaultExtra {}
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:general` category in `openticket.helpmenu`!
* This default class is made for the `openticket:general` category in `opendiscord.helpmenu`!
*/
export class ODHelpMenuCategory_DefaultExtra extends ODHelpMenuCategory {
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultExtra>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultExtra[HelpMenuCategoryId]
+1 -1
View File
@@ -474,7 +474,7 @@ export interface ODLanguageManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODLanguageManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.languages`!
* This default class is made for the global variable `opendiscord.languages`!
*/
export class ODLanguageManager_Default extends ODLanguageManager {
get<LanguageId extends keyof ODLanguageManagerIds_Default>(id:LanguageId): ODLanguageManagerIds_Default[LanguageId]
+1 -1
View File
@@ -8,7 +8,7 @@ import { ODPermissionManager } from "../modules/permission"
* This is a special class that adds type definitions & typescript to the ODPermissionManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.permissions`!
* This default class is made for the global variable `opendiscord.permissions`!
*/
export class ODPermissionManager_Default extends ODPermissionManager {
constructor(debug:ODDebugger){
+2 -2
View File
@@ -14,7 +14,7 @@ export interface ODPluginManagerIds_Default {}
* This is a special class that adds type definitions & typescript to the ODPluginManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.plugins`!
* This default class is made for the global variable `opendiscord.plugins`!
*/
export class ODPluginManager_Default extends ODPluginManager {
declare classes: ODPluginClassManager_Default
@@ -51,7 +51,7 @@ export interface ODPluginClassManagerIds_Default {}
* This is a special class that adds type definitions & typescript to the ODPluginClassManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.plugins.classes`!
* This default class is made for the global variable `opendiscord.plugins.classes`!
*/
export class ODPluginClassManager_Default extends ODPluginClassManager {
get<PluginClassId extends keyof ODPluginClassManagerIds_Default>(id:PluginClassId): ODPluginClassManagerIds_Default[PluginClassId]
+1 -1
View File
@@ -18,7 +18,7 @@ export interface ODPostManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODPostManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.code`!
* This default class is made for the global variable `opendiscord.code`!
*/
export class ODPostManager_Default extends ODPostManager {
get<PostId extends keyof ODPostManagerIds_Default>(id:PostId): ODPostManagerIds_Default[PostId]
+2 -2
View File
@@ -101,7 +101,7 @@ export interface ODProgressBarRendererManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODProgressBarRendererManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.progressbars.renderers`!
* This default class is made for the global variable `opendiscord.progressbars.renderers`!
*/
export class ODProgressBarRendererManager_Default extends ODProgressBarRendererManager {
get<ProgressBarId extends keyof ODProgressBarRendererManagerIds_Default>(id:ProgressBarId): ODProgressBarRendererManagerIds_Default[ProgressBarId]
@@ -140,7 +140,7 @@ export interface ODProgressBarManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODProgressBarManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.progressbars`!
* This default class is made for the global variable `opendiscord.progressbars`!
*/
export class ODProgressBarManager_Default extends ODProgressBarManager {
declare renderers: ODProgressBarRendererManager_Default
+5 -5
View File
@@ -9,7 +9,7 @@ import { ODWorkerManager_Default } from "./worker"
* This is a special class that adds type definitions & typescript to the ODResponderManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.responders`!
* This default class is made for the global variable `opendiscord.responders`!
*/
export class ODResponderManager_Default extends ODResponderManager {
declare commands: ODCommandResponderManager_Default
@@ -51,7 +51,7 @@ export interface ODCommandResponderManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODCommandResponderManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.responders.commands`!
* This default class is made for the global variable `opendiscord.responders.commands`!
*/
export class ODCommandResponderManager_Default extends ODCommandResponderManager {
get<CommandResponderId extends keyof ODCommandResponderManagerIds_Default>(id:CommandResponderId): ODCommandResponder_Default<ODCommandResponderManagerIds_Default[CommandResponderId]["source"],ODCommandResponderManagerIds_Default[CommandResponderId]["params"],ODCommandResponderManagerIds_Default[CommandResponderId]["workers"]>
@@ -118,7 +118,7 @@ export interface ODButtonResponderManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODButtonResponderManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.responders.buttons`!
* This default class is made for the global variable `opendiscord.responders.buttons`!
*/
export class ODButtonResponderManager_Default extends ODButtonResponderManager {
get<ButtonResponderId extends keyof ODButtonResponderManagerIds_Default>(id:ButtonResponderId): ODButtonResponder_Default<ODButtonResponderManagerIds_Default[ButtonResponderId]["source"],ODButtonResponderManagerIds_Default[ButtonResponderId]["params"],ODButtonResponderManagerIds_Default[ButtonResponderId]["workers"]>
@@ -165,7 +165,7 @@ export interface ODDropdownResponderManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODDropdownResponderManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.responders.dropdowns`!
* This default class is made for the global variable `opendiscord.responders.dropdowns`!
*/
export class ODDropdownResponderManager_Default extends ODDropdownResponderManager {
get<DropdownResponderId extends keyof ODDropdownResponderManagerIds_Default>(id:DropdownResponderId): ODDropdownResponder_Default<ODDropdownResponderManagerIds_Default[DropdownResponderId]["source"],ODDropdownResponderManagerIds_Default[DropdownResponderId]["params"],ODDropdownResponderManagerIds_Default[DropdownResponderId]["workers"]>
@@ -219,7 +219,7 @@ export interface ODModalResponderManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODModalResponderManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.responders.dropdowns`!
* This default class is made for the global variable `opendiscord.responders.dropdowns`!
*/
export class ODModalResponderManager_Default extends ODModalResponderManager {
get<ModalResponderId extends keyof ODModalResponderManagerIds_Default>(id:ModalResponderId): ODModalResponder_Default<ODModalResponderManagerIds_Default[ModalResponderId]["source"],ODModalResponderManagerIds_Default[ModalResponderId]["params"],ODModalResponderManagerIds_Default[ModalResponderId]["workers"]>
+1 -1
View File
@@ -16,7 +16,7 @@ export interface ODSessionManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODSessionManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.sessions`!
* This default class is made for the global variable `opendiscord.sessions`!
*/
export class ODSessionManager_Default extends ODSessionManager {
get<SessionId extends keyof ODSessionManagerIds_Default>(id:SessionId): ODSessionManagerIds_Default[SessionId]
+1 -1
View File
@@ -22,7 +22,7 @@ export interface ODStartScreenManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODStartScreenManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.startscreen`!
* This default class is made for the global variable `opendiscord.startscreen`!
*/
export class ODStartScreenManager_Default extends ODStartScreenManager {
get<StartScreenId extends keyof ODStartScreenManagerIds_Default>(id:StartScreenId): ODStartScreenManagerIds_Default[StartScreenId]
+6 -6
View File
@@ -21,7 +21,7 @@ export interface ODStatsManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.stats`!
* This default class is made for the global variable `opendiscord.stats`!
*/
export class ODStatsManager_Default extends ODStatsManager {
get<StatsId extends keyof ODStatsManagerIds_Default>(id:StatsId): ODStatsManagerIds_Default[StatsId]
@@ -68,7 +68,7 @@ export interface ODStatGlobalScopeIds_DefaultGlobal {
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:global` category in `openticket.stats`!
* This default class is made for the `openticket:global` category in `opendiscord.stats`!
*/
export class ODStatGlobalScope_DefaultGlobal extends ODStatGlobalScope {
get<StatsId extends keyof ODStatGlobalScopeIds_DefaultGlobal>(id:StatsId): ODStatGlobalScopeIds_DefaultGlobal[StatsId]
@@ -127,7 +127,7 @@ export interface ODStatGlobalScopeIds_DefaultSystem {
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:system` category in `openticket.stats`!
* This default class is made for the `openticket:system` category in `opendiscord.stats`!
*/
export class ODStatGlobalScope_DefaultSystem extends ODStatGlobalScope {
get<StatsId extends keyof ODStatGlobalScopeIds_DefaultSystem>(id:StatsId): ODStatGlobalScopeIds_DefaultSystem[StatsId]
@@ -195,7 +195,7 @@ export interface ODStatScopeIds_DefaultUser {
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:user` category in `openticket.stats`!
* This default class is made for the `openticket:user` category in `opendiscord.stats`!
*/
export class ODStatScope_DefaultUser extends ODStatScope {
get<StatsId extends keyof ODStatScopeIds_DefaultUser>(id:StatsId): ODStatScopeIds_DefaultUser[StatsId]
@@ -258,7 +258,7 @@ export interface ODStatScopeIds_DefaultTicket {
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:ticket` category in `openticket.stats`!
* This default class is made for the `openticket:ticket` category in `opendiscord.stats`!
*/
export class ODStatScope_DefaultTicket extends ODStatScope {
get<StatsId extends keyof ODStatScopeIds_DefaultTicket>(id:StatsId): ODStatScopeIds_DefaultTicket[StatsId]
@@ -316,7 +316,7 @@ export interface ODStatScopeIds_DefaultParticipants {
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
* It doesn't add any extra features!
*
* This default class is made for the `openticket:participants` category in `openticket.stats`!
* This default class is made for the `openticket:participants` category in `opendiscord.stats`!
*/
export class ODStatScope_DefaultParticipants extends ODStatScope {
get<StatsId extends keyof ODStatScopeIds_DefaultParticipants>(id:StatsId): ODStatScopeIds_DefaultParticipants[StatsId]
+1 -1
View File
@@ -35,7 +35,7 @@ export interface ODVerifyBarManagerIds_Default {
* This is a special class that adds type definitions & typescript to the ODVerifyBarManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.verifybars`!
* This default class is made for the global variable `opendiscord.verifybars`!
*/
export class ODVerifyBarManager_Default extends ODVerifyBarManager {
get<VerifyBarId extends keyof ODVerifyBarManagerIds_Default>(id:VerifyBarId): ODVerifyBar_Default<ODVerifyBarManagerIds_Default[VerifyBarId]["successWorkerIds"],ODVerifyBarManagerIds_Default[VerifyBarId]["failureWorkerIds"]>
+3 -3
View File
@@ -512,7 +512,7 @@ export class ODFileManager extends ODManagerWithSafety<ODFile<string,any>> {
return new ODFile("openticket:unknown-file",(instance,params,source,cancel) => {
instance.setName("openticket_unknown-file.txt")
instance.setDescription("❌ <ODError:Unknown File>")
instance.setContents("Couldn't find file in registery `openticket.builders.files`")
instance.setContents("Couldn't find file in registery `opendiscord.builders.files`")
cancel()
})
},debug,"file")
@@ -636,7 +636,7 @@ export class ODEmbedManager extends ODManagerWithSafety<ODEmbed<string,any>> {
instance.setFooter("openticket:unknown-embed")
instance.setColor("#ff0000")
instance.setTitle("❌ <ODError:Unknown Embed>")
instance.setDescription("Couldn't find embed in registery `openticket.builders.embeds`")
instance.setDescription("Couldn't find embed in registery `opendiscord.builders.embeds`")
cancel()
})
},debug,"embed")
@@ -847,7 +847,7 @@ export class ODMessageManager extends ODManagerWithSafety<ODMessage<string,any>>
constructor(debug:ODDebugger){
super(() => {
return new ODMessage("openticket:unknown-message",(instance,params,source,cancel) => {
instance.setContent("**❌ <ODError:Unknown Message>**\nCouldn't find message in registery `openticket.builders.messages`")
instance.setContent("**❌ <ODError:Unknown Message>**\nCouldn't find message in registery `opendiscord.builders.messages`")
cancel()
})
},debug,"message")
-15
View File
@@ -20,14 +20,6 @@ export interface ODCheckerResult {
* It manages all config checkers in the bot and allows plugins to access config checkers from Open Ticket & other plugins!
*
* You can use this class to get/add a config checker (`ODChecker`) in your plugin!
* @example
* //get checker for ./config/general.json => ODChecker class
* const testChecker = openticket.checkers.get("openticket:general")
*
* //add a new checker with id "test" => ./config/test.json
* const testConfig = new api.ODConfig("test","test.json")
* const testChecker = new api.ODChecker("test",openticket.checkers.storage,0,testConfig,[])
* openticket.checkers.add(testChecker)
*/
export class ODCheckerManager extends ODManager<ODChecker> {
/**The global temporary storage shared between all config checkers. */
@@ -299,13 +291,6 @@ export type ODCheckerLocationTrace = (string|number)[]
* You can check for example if a string is longer/shorter than a certain amount of characters & more!
*
* You can use this class when you create your own custom config file & you want to check it for syntax errors.
* @example
* //create a new checker with id "test" => ./config/test.json
* const testConfig = new api.ODConfig("test","test.json")
* const testChecker = new api.ODChecker("test",openticket.checkers.storage,0,testConfig,new api.ODCheckerStructure())
* openticket.checkers.add(testChecker)
*
* //you will still need to build the structure & insert it in the constructor
*/
export class ODChecker extends ODManagerData {
/**The storage of this checker (reference for `ODCheckerManager.storage`) */
+2 -2
View File
@@ -584,7 +584,7 @@ export class ODLiveStatusUrlSource extends ODLiveStatusSource {
* It manages all LiveStatus sources and has the renderer for all LiveStatus messages.
*
* You can use this to customise or add stuff to the LiveStatus system.
* Access it in the global `openticket.startscreen.livestatus` variable!
* Access it in the global `opendiscord.startscreen.livestatus` variable!
*/
export class ODLiveStatusManager extends ODManager<ODLiveStatusSource> {
/**The class responsible for rendering the livestatus messages. */
@@ -616,7 +616,7 @@ export class ODLiveStatusManager extends ODManager<ODLiveStatusSource> {
* It's responsible for rendering all LiveStatus messages to the console.
*/
export class ODLiveStatusRenderer {
/**A reference to the ODConsoleManager or "openticket.console" global variable */
/**A reference to the ODConsoleManager or "opendiscord.console" global variable */
#console: ODConsoleManager
constructor(console:ODConsoleManager){
+1 -1
View File
@@ -76,7 +76,7 @@ export class ODEvent extends ODManagerData {
* This class is made to manage all events in the bot. You can compare it with the built-in node.js `EventEmitter`
*
* It's not recommended to create this class yourself. Plugin events should be registered in their `plugin.json` file instead.
* All events are available in the `openticket.events` global!
* All events are available in the `opendiscord.events` global!
*/
export class ODEventManager extends ODManager<ODEvent> {
/**Reference to the Open Ticket debugger */
+3 -3
View File
@@ -20,7 +20,7 @@ export interface ODUnknownCrashedPlugin {
*
* It manages all active plugins in the bot!
* It also contains all "plugin classes" which are managers registered by plugins.
* These are accessible via the `openticket.plugins.classes` global.
* These are accessible via the `opendiscord.plugins.classes` global.
*
* Use `isPluginLoaded()` to check if a plugin has been loaded.
*/
@@ -60,7 +60,7 @@ export interface ODPluginData {
enabled:boolean,
/**The priority of this plugin. Higher priority will load before lower priority. */
priority:number,
/**A list of events to register to the `openticket.events` global before loading any plugins. This way, plugins with a higher priority are able to use events from this plugin as well! */
/**A list of events to register to the `opendiscord.events` global before loading any plugins. This way, plugins with a higher priority are able to use events from this plugin as well! */
events:string[]
/**Npm dependencies which are required for this plugin to work. */
@@ -96,7 +96,7 @@ export interface ODPluginDetails {
* This is an Open Ticket plugin.
*
* It represents a single plugin in the `./plugins/` directory.
* All plugins are accessible via the `openticket.plugins` global.
* All plugins are accessible via the `opendiscord.plugins` global.
*
* Don't re-execute plugins which are already enabled! It might break the bot or plugin.
*/
+1 -1
View File
@@ -127,7 +127,7 @@ export interface ODTranscriptCompilerIds {
* This is a special class that adds type definitions & typescript to the ODTranscriptManager class.
* It doesn't add any extra features!
*
* This default class is made for the global variable `openticket.transcripts`!
* This default class is made for the global variable `opendiscord.transcripts`!
*/
export class ODTranscriptManager_Default extends ODTranscriptManager {
get<QuestionId extends keyof ODTranscriptCompilerIds>(id:QuestionId): ODTranscriptCompilerIds[QuestionId]
+5 -5
View File
@@ -1,4 +1,4 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as discord from "discord.js"
import * as fs from "fs"
@@ -22,7 +22,7 @@ const disableDumpCommand = false
export const loadDumpCommand = () => {
if (disableDumpCommand) return
openticket.client.textCommands.add(new api.ODTextCommand("openticket:dump",{
opendiscord.client.textCommands.add(new api.ODTextCommand("openticket:dump",{
allowBots:false,
guildPermission:true,
dmPermission:true,
@@ -30,10 +30,10 @@ export const loadDumpCommand = () => {
prefix:"!OPENTICKET:"
}))
openticket.client.textCommands.onInteraction("!OPENTICKET:","dump",async (msg) => {
if (msg.author.id == "779742674932072469" || openticket.permissions.hasPermissions("developer",await openticket.permissions.getPermissions(msg.author,msg.channel,null))){
opendiscord.client.textCommands.onInteraction("!OPENTICKET:","dump",async (msg) => {
if (msg.author.id == "779742674932072469" || opendiscord.permissions.hasPermissions("developer",await opendiscord.permissions.getPermissions(msg.author,msg.channel,null))){
//user is bot owner OR creator of Open Ticket :)
openticket.log("Dumped otdebug.txt!","system",[
opendiscord.log("Dumped otdebug.txt!","system",[
{key:"user",value:msg.author.username},
{key:"id",value:msg.author.id}
])
+11 -11
View File
@@ -38,19 +38,19 @@ import * as api from "../api/api" //import for local use
export * as api from "../api/api" //export to other parts of bot
export const openticket = new api.ODMain()
export const opendiscord = new api.ODMain()
console.log("\n--------------------------- OPEN TICKET STARTUP ---------------------------")
openticket.log("Logging system activated!","system")
openticket.debug.debug("Using Node.js "+process.version+"!")
opendiscord.log("Logging system activated!","system")
opendiscord.debug.debug("Using Node.js "+process.version+"!")
try{
const packageJson = JSON.parse(fs.readFileSync("./package.json").toString())
openticket.debug.debug("Using discord.js "+packageJson.dependencies["discord.js"]+"!")
openticket.debug.debug("Using ansis "+packageJson.dependencies["ansis"]+"!")
openticket.debug.debug("Using formatted-json-stringify "+packageJson.dependencies["formatted-json-stringify"]+"!")
openticket.debug.debug("Using typescript "+packageJson.dependencies["typescript"]+"!")
opendiscord.debug.debug("Using discord.js "+packageJson.dependencies["discord.js"]+"!")
opendiscord.debug.debug("Using ansis "+packageJson.dependencies["ansis"]+"!")
opendiscord.debug.debug("Using formatted-json-stringify "+packageJson.dependencies["formatted-json-stringify"]+"!")
opendiscord.debug.debug("Using typescript "+packageJson.dependencies["typescript"]+"!")
}catch{
openticket.debug.debug("Failed to fetch module versions!")
opendiscord.debug.debug("Failed to fetch module versions!")
}
const timer = (ms:number): Promise<void> => {
@@ -83,7 +83,7 @@ export interface ODUtilities {
*/
timer(ms:number): Promise<void>
/**## emojiTitle `utility function`
* Use this function to create a title with an emoji before/after the text. The style & divider are set in `openticket.defaults`
* Use this function to create a title with an emoji before/after the text. The style & divider are set in `opendiscord.defaults`
* @example utilities.emojiTitle("📎","Links") //create a title with an emoji based on the bot emoji style
*/
emojiTitle(emoji:string, text:string): string
@@ -149,8 +149,8 @@ export const utilities: ODUtilities = {
},
timer,
emojiTitle(emoji:string, text:string){
const style = openticket.defaults.getDefault("emojiTitleStyle")
const divider = openticket.defaults.getDefault("emojiTitleDivider")
const style = opendiscord.defaults.getDefault("emojiTitleStyle")
const divider = opendiscord.defaults.getDefault("emojiTitleDivider")
if (style == "disabled") return text
else if (style == "before") return emoji+divider+text
+27 -27
View File
@@ -1,60 +1,60 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadVersionMigrationSystem = async () => {
//ENTER MIGRATION CONTEXT
await preloadMigrationContext()
const lastVersion = await isMigrationRequired()
openticket.versions.add(lastVersion ? lastVersion : api.ODVersion.fromString("openticket:last-version",openticket.versions.get("openticket:version").toString()))
if (lastVersion && !openticket.flags.get("openticket:no-migration").value){
opendiscord.versions.add(lastVersion ? lastVersion : api.ODVersion.fromString("openticket:last-version",opendiscord.versions.get("openticket:version").toString()))
if (lastVersion && !opendiscord.flags.get("openticket:no-migration").value){
//MIGRATION IS REQUIRED
openticket.log("Detected old data!","info")
openticket.log("Starting closed API context...","debug")
opendiscord.log("Detected old data!","info")
opendiscord.log("Starting closed API context...","debug")
await utilities.timer(600)
openticket.log("Migrating data to new version...","debug")
opendiscord.log("Migrating data to new version...","debug")
await loadAllVersionMigrations(lastVersion)
openticket.log("Stopping closed API context...","debug")
opendiscord.log("Stopping closed API context...","debug")
await utilities.timer(400)
openticket.log("All data is now up to date!","info")
opendiscord.log("All data is now up to date!","info")
await utilities.timer(200)
console.log("---------------------------------------------------------------------")
}
saveAllVersionsToDatabase()
//DEFAULT FLAGS
if (openticket.flags.exists("openticket:no-plugins") && openticket.flags.get("openticket:no-plugins").value) openticket.defaults.setDefault("pluginLoading",false)
if (openticket.flags.exists("openticket:soft-plugins") && openticket.flags.get("openticket:soft-plugins").value) openticket.defaults.setDefault("softPluginLoading",true)
if (openticket.flags.exists("openticket:crash") && openticket.flags.get("openticket:crash").value) openticket.defaults.setDefault("crashOnError",true)
if (openticket.flags.exists("openticket:force-slash-update") && openticket.flags.get("openticket:force-slash-update").value) openticket.defaults.setDefault("forceSlashCommandRegistration",true)
if (opendiscord.flags.exists("openticket:no-plugins") && opendiscord.flags.get("openticket:no-plugins").value) opendiscord.defaults.setDefault("pluginLoading",false)
if (opendiscord.flags.exists("openticket:soft-plugins") && opendiscord.flags.get("openticket:soft-plugins").value) opendiscord.defaults.setDefault("softPluginLoading",true)
if (opendiscord.flags.exists("openticket:crash") && opendiscord.flags.get("openticket:crash").value) opendiscord.defaults.setDefault("crashOnError",true)
if (opendiscord.flags.exists("openticket:force-slash-update") && opendiscord.flags.get("openticket:force-slash-update").value) opendiscord.defaults.setDefault("forceSlashCommandRegistration",true)
//LEAVE MIGRATION CONTEXT
await unloadMigrationContext()
}
const preloadMigrationContext = async () => {
openticket.debug.debug("-- MIGRATION CONTEXT START --")
opendiscord.debug.debug("-- MIGRATION CONTEXT START --")
await (await import("../../data/framework/flagLoader.js")).loadAllFlags()
await openticket.flags.init()
await opendiscord.flags.init()
await (await import("../../data/framework/configLoader.js")).loadAllConfigs()
await openticket.configs.init()
await opendiscord.configs.init()
await (await import("../../data/framework/databaseLoader.js")).loadAllDatabases()
await openticket.databases.init()
openticket.debug.visible = true
await opendiscord.databases.init()
opendiscord.debug.visible = true
}
const unloadMigrationContext = async () => {
openticket.debug.visible = false
await openticket.databases.loopAll((database,id) => {openticket.databases.remove(id)})
await openticket.configs.loopAll((config,id) => {openticket.configs.remove(id)})
await openticket.flags.loopAll((flag,id) => {openticket.flags.remove(id)})
openticket.debug.debug("-- MIGRATION CONTEXT END --")
opendiscord.debug.visible = false
await opendiscord.databases.loopAll((database,id) => {opendiscord.databases.remove(id)})
await opendiscord.configs.loopAll((config,id) => {opendiscord.configs.remove(id)})
await opendiscord.flags.loopAll((flag,id) => {opendiscord.flags.remove(id)})
opendiscord.debug.debug("-- MIGRATION CONTEXT END --")
}
const isMigrationRequired = async (): Promise<false|api.ODVersion> => {
const rawVersion = await openticket.databases.get("openticket:global").get("openticket:last-version","openticket:version")
const rawVersion = await opendiscord.databases.get("openticket:global").get("openticket:last-version","openticket:version")
if (!rawVersion) return false
const version = api.ODVersion.fromString("openticket:last-version",rawVersion)
if (openticket.versions.get("openticket:version").compare(version) == "higher"){
if (opendiscord.versions.get("openticket:version").compare(version) == "higher"){
return version
}else return false
}
@@ -70,7 +70,7 @@ const loadAllVersionMigrations = async (lastVersion:api.ODVersion) => {
for (const migration of migrations){
if (migration.version.compare(lastVersion) == "higher"){
const success = await migration.migrate()
if (success) openticket.log("Migrated data to "+migration.version.toString()+"!","debug",[
if (success) opendiscord.log("Migrated data to "+migration.version.toString()+"!","debug",[
{key:"success",value:success ? "true" : "false"}
])
}
@@ -78,9 +78,9 @@ const loadAllVersionMigrations = async (lastVersion:api.ODVersion) => {
}
const saveAllVersionsToDatabase = async () => {
const globalDatabase = openticket.databases.get("openticket:global")
const globalDatabase = opendiscord.databases.get("openticket:global")
await openticket.versions.loopAll(async (version,id) => {
await opendiscord.versions.loopAll(async (version,id) => {
await globalDatabase.set("openticket:last-version",id.value,version.toString())
})
}
+1 -1
View File
@@ -1,4 +1,4 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const migrations = [
//MIGRATE TO v4.0.0
+29 -29
View File
@@ -1,14 +1,14 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import fs from "fs"
import { ODPluginError } from "../api/api"
export const loadAllPlugins = async () => {
//start launching plugins
openticket.log("Loading plugins...","system")
opendiscord.log("Loading plugins...","system")
let initPluginError: boolean = false
if (!fs.existsSync("./plugins")){
openticket.log("Couldn't find ./plugins directory, canceling all plugin execution!","error")
opendiscord.log("Couldn't find ./plugins directory, canceling all plugin execution!","error")
return
}
const plugins = fs.readdirSync("./plugins")
@@ -16,12 +16,12 @@ export const loadAllPlugins = async () => {
//check & validate
plugins.forEach(async (p) => {
//prechecks
if (!fs.statSync("./plugins/"+p).isDirectory()) return openticket.log("Plugin is not a directory, canceling plugin execution...","plugin",[
if (!fs.statSync("./plugins/"+p).isDirectory()) return opendiscord.log("Plugin is not a directory, canceling plugin execution...","plugin",[
{key:"plugin",value:"./plugins/"+p}
])
if (!fs.existsSync("./plugins/"+p+"/plugin.json")){
initPluginError = true
openticket.log("Plugin doesn't have a plugin.json, canceling plugin execution...","plugin",[
opendiscord.log("Plugin doesn't have a plugin.json, canceling plugin execution...","plugin",[
{key:"plugin",value:"./plugins/"+p}
])
return
@@ -55,25 +55,25 @@ export const loadAllPlugins = async () => {
if (rawplugindata.id != p) throw new ODPluginError("Failed to load plugin, directory name is required to match the id")
if (openticket.plugins.exists(rawplugindata.id)) throw new ODPluginError("Failed to load plugin, this id already exists in another plugin")
if (opendiscord.plugins.exists(rawplugindata.id)) throw new ODPluginError("Failed to load plugin, this id already exists in another plugin")
//plugin.json is valid => load plugin
const plugin = new api.ODPlugin(p,rawplugindata)
openticket.plugins.add(plugin)
opendiscord.plugins.add(plugin)
}catch(e){
//when any of the above errors happen, crash the bot when soft mode isn't enabled
initPluginError = true
openticket.log(e.message+", canceling plugin execution...","plugin",[
opendiscord.log(e.message+", canceling plugin execution...","plugin",[
{key:"path",value:"./plugins/"+p}
])
openticket.log("You can see more about this error in the ./otdebug.txt file!","info")
openticket.debugfile.writeText(e.stack)
opendiscord.log("You can see more about this error in the ./otdebug.txt file!","info")
opendiscord.debugfile.writeText(e.stack)
//try to get some crashed plugin data
try{
const rawplugindata: api.ODPluginData = JSON.parse(fs.readFileSync("./plugins/"+p+"/plugin.json").toString())
openticket.plugins.unknownCrashedPlugins.push({
opendiscord.plugins.unknownCrashedPlugins.push({
name:rawplugindata.name ?? "./plugins/"+p,
description:(rawplugindata.details && rawplugindata.details.shortDescription) ? rawplugindata.details.shortDescription : "This plugin crashed :(",
})
@@ -82,7 +82,7 @@ export const loadAllPlugins = async () => {
})
//sorted plugins (based on priority)
const sortedPlugins = openticket.plugins.getAll().sort((a,b) => {
const sortedPlugins = opendiscord.plugins.getAll().sort((a,b) => {
return (b.priority - a.priority)
})
@@ -95,8 +95,8 @@ export const loadAllPlugins = async () => {
sortedPlugins.filter((plugin) => plugin.enabled).forEach((plugin) => {
const from = plugin.id.value
plugin.dependenciesInstalled().forEach((missing) => missingDependencies.push({id:from,missing}))
plugin.pluginsIncompatible(openticket.plugins).forEach((incompatible) => incompatibilities.push({from,to:incompatible}))
plugin.pluginsInstalled(openticket.plugins).forEach((missing) => missingPlugins.push({id:from,missing}))
plugin.pluginsIncompatible(opendiscord.plugins).forEach((incompatible) => incompatibilities.push({from,to:incompatible}))
plugin.pluginsInstalled(opendiscord.plugins).forEach((missing) => missingPlugins.push({id:from,missing}))
})
//handle all incompatibilities
@@ -105,18 +105,18 @@ export const loadAllPlugins = async () => {
if (alreadyLoggedCompatPlugins.includes(match.from) || alreadyLoggedCompatPlugins.includes(match.to)) return
else alreadyLoggedCompatPlugins.push(match.from,match.to)
const fromPlugin = openticket.plugins.get(match.from)
const fromPlugin = opendiscord.plugins.get(match.from)
if (fromPlugin && !fromPlugin.crashed){
fromPlugin.crashed = true
fromPlugin.crashReason = "incompatible.plugin"
}
const toPlugin = openticket.plugins.get(match.to)
const toPlugin = opendiscord.plugins.get(match.to)
if (toPlugin && !toPlugin.crashed){
toPlugin.crashed = true
toPlugin.crashReason = "incompatible.plugin"
}
openticket.log(`Incompatible plugins => "${match.from}" & "${match.to}", canceling plugin execution...`,"plugin",[
opendiscord.log(`Incompatible plugins => "${match.from}" & "${match.to}", canceling plugin execution...`,"plugin",[
{key:"path1",value:"./plugins/"+match.from},
{key:"path2",value:"./plugins/"+match.to}
])
@@ -125,13 +125,13 @@ export const loadAllPlugins = async () => {
//handle all missing dependencies
missingDependencies.forEach((match) => {
const plugin = openticket.plugins.get(match.id)
const plugin = opendiscord.plugins.get(match.id)
if (plugin && !plugin.crashed){
plugin.crashed = true
plugin.crashReason = "missing.dependency"
}
openticket.log(`Missing npm dependency "${match.missing}", canceling plugin execution...`,"plugin",[
opendiscord.log(`Missing npm dependency "${match.missing}", canceling plugin execution...`,"plugin",[
{key:"path",value:"./plugins/"+match.id}
])
initPluginError = true
@@ -139,45 +139,45 @@ export const loadAllPlugins = async () => {
//handle all missing plugins
missingPlugins.forEach((match) => {
const plugin = openticket.plugins.get(match.id)
const plugin = opendiscord.plugins.get(match.id)
if (plugin && !plugin.crashed){
plugin.crashed = true
plugin.crashReason = "missing.plugin"
}
openticket.log(`Missing required plugin "${match.missing}", canceling plugin execution...`,"plugin",[
opendiscord.log(`Missing required plugin "${match.missing}", canceling plugin execution...`,"plugin",[
{key:"path",value:"./plugins/"+match.id}
])
initPluginError = true
})
//exit on error (when soft mode disabled)
if (!openticket.defaults.getDefault("softPluginLoading") && initPluginError){
if (!opendiscord.defaults.getDefault("softPluginLoading") && initPluginError){
console.log("")
openticket.log("Please fix all plugin errors above & try again!","error")
opendiscord.log("Please fix all plugin errors above & try again!","error")
process.exit(1)
}
//preload all events required for every plugin
for (const plugin of sortedPlugins){
if (plugin.enabled) plugin.data.events.forEach((event) => openticket.events.add(new api.ODEvent(event)))
if (plugin.enabled) plugin.data.events.forEach((event) => opendiscord.events.add(new api.ODEvent(event)))
}
//execute all working plugins
for (const plugin of sortedPlugins){
const status = await plugin.execute(openticket.debug,false)
const status = await plugin.execute(opendiscord.debug,false)
//exit on error (when soft mode disabled)
if (!status && !openticket.defaults.getDefault("softPluginLoading")){
if (!status && !opendiscord.defaults.getDefault("softPluginLoading")){
console.log("")
openticket.log("Please fix all plugin errors above & try again!","error")
opendiscord.log("Please fix all plugin errors above & try again!","error")
process.exit(1)
}
}
for (const plugin of sortedPlugins){
if (plugin.enabled){
openticket.debug.debug("Plugin \""+plugin.id.value+"\" loaded",[
opendiscord.debug.debug("Plugin \""+plugin.id.value+"\" loaded",[
{key:"status",value:(plugin.crashed ? "crashed" : "success")},
{key:"crashReason",value:(plugin.crashed ? (plugin.crashReason ?? "/") : "/")},
{key:"author",value:plugin.details.author},
@@ -185,7 +185,7 @@ export const loadAllPlugins = async () => {
{key:"priority",value:plugin.priority.toString()}
])
}else{
openticket.debug.debug("Plugin \""+plugin.id.value+"\" disabled",[
opendiscord.debug.debug("Plugin \""+plugin.id.value+"\" disabled",[
{key:"author",value:plugin.details.author},
{key:"version",value:plugin.version.toString()},
{key:"priority",value:plugin.priority.toString()}
+18 -18
View File
@@ -1,26 +1,26 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
export const loadAllConfigCheckers = async () => {
openticket.checkers.add(new api.ODChecker("openticket:general",openticket.checkers.storage,0,openticket.configs.get("openticket:general"),defaultGeneralStructure))
openticket.checkers.add(new api.ODChecker("openticket:options",openticket.checkers.storage,1,openticket.configs.get("openticket:options"),defaultOptionsStructure))
openticket.checkers.add(new api.ODChecker("openticket:panels",openticket.checkers.storage,0,openticket.configs.get("openticket:panels"),defaultPanelsStructure))
openticket.checkers.add(new api.ODChecker("openticket:questions",openticket.checkers.storage,2,openticket.configs.get("openticket:questions"),defaultQuestionsStructure))
openticket.checkers.add(new api.ODChecker("openticket:transcripts",openticket.checkers.storage,0,openticket.configs.get("openticket:transcripts"),defaultTranscriptsStructure))
opendiscord.checkers.add(new api.ODChecker("openticket:general",opendiscord.checkers.storage,0,opendiscord.configs.get("openticket:general"),defaultGeneralStructure))
opendiscord.checkers.add(new api.ODChecker("openticket:options",opendiscord.checkers.storage,1,opendiscord.configs.get("openticket:options"),defaultOptionsStructure))
opendiscord.checkers.add(new api.ODChecker("openticket:panels",opendiscord.checkers.storage,0,opendiscord.configs.get("openticket:panels"),defaultPanelsStructure))
opendiscord.checkers.add(new api.ODChecker("openticket:questions",opendiscord.checkers.storage,2,opendiscord.configs.get("openticket:questions"),defaultQuestionsStructure))
opendiscord.checkers.add(new api.ODChecker("openticket:transcripts",opendiscord.checkers.storage,0,opendiscord.configs.get("openticket:transcripts"),defaultTranscriptsStructure))
}
export const loadAllConfigCheckerFunctions = async () => {
openticket.checkers.functions.add(new api.ODCheckerFunction("openticket:unused-options",defaultUnusedOptionsFunction))
openticket.checkers.functions.add(new api.ODCheckerFunction("openticket:unused-questions",defaultUnusedQuestionsFunction))
openticket.checkers.functions.add(new api.ODCheckerFunction("openticket:dropdown-options",defaultDropdownOptionsFunction))
opendiscord.checkers.functions.add(new api.ODCheckerFunction("openticket:unused-options",defaultUnusedOptionsFunction))
opendiscord.checkers.functions.add(new api.ODCheckerFunction("openticket:unused-questions",defaultUnusedQuestionsFunction))
opendiscord.checkers.functions.add(new api.ODCheckerFunction("openticket:dropdown-options",defaultDropdownOptionsFunction))
}
export const loadAllConfigCheckerTranslations = async () => {
if ((generalConfig && generalConfig.data.system && generalConfig.data.system.useTranslatedConfigChecker) ? generalConfig.data.system.useTranslatedConfigChecker : false){
registerDefaultCheckerSystemTranslations(openticket.checkers.translation,openticket.languages) //translate checker system text
registerDefaultCheckerMessageTranslations(openticket.checkers.translation,openticket.languages) //translate checker messages
registerDefaultCheckerCustomTranslations(openticket.checkers.translation,openticket.languages) //translate custom checker messages
registerDefaultCheckerSystemTranslations(opendiscord.checkers.translation,opendiscord.languages) //translate checker system text
registerDefaultCheckerMessageTranslations(opendiscord.checkers.translation,opendiscord.languages) //translate checker messages
registerDefaultCheckerCustomTranslations(opendiscord.checkers.translation,opendiscord.languages) //translate custom checker messages
}
}
@@ -170,7 +170,7 @@ const createPanelEmbedStructure = (id:api.ODValidId) => {
}
function loadFromEnv(){
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
if (generalConfig.data && generalConfig.data.tokenFromENV && typeof generalConfig.data.tokenFromENV == "boolean") return generalConfig.data.tokenFromENV
else return false
}
@@ -185,7 +185,7 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opentic
const lt = checker.locationTraceDeref(locationTrace)
if (typeof value != "string") return false
else if (value != "open-ticket-"+openticket.versions.get("openticket:version").toString()){
else if (value != "open-ticket-"+opendiscord.versions.get("openticket:version").toString()){
checker.createMessage("openticket:invalid-version","warning","The version specified in your config is invalid! Make sure you have updated it to the latest version!",lt,null,[],locationId,locationDocs)
return false
}else return true
@@ -201,7 +201,7 @@ export const defaultGeneralStructure = new api.ODCheckerObjectStructure("opentic
const lt = checker.locationTraceDeref(locationTrace)
if (typeof value != "string") return false
else if (!openticket.defaults.getDefault("languageList").includes(value)){
else if (!opendiscord.defaults.getDefault("languageList").includes(value)){
checker.createMessage("openticket:invalid-language","error","This is an invalid language!",lt,null,[],locationId,locationDocs)
return false
}else return true
@@ -582,10 +582,10 @@ export const defaultDropdownOptionsFunction = (manager:api.ODCheckerManager, fun
const panelList: string[] = manager.storage.get("openticket","panel-ids")
if (!panelList) return {valid:true,messages:[]}
const panelConfig = openticket.configs.get("openticket:panels")
const panelConfig = opendiscord.configs.get("openticket:panels")
if (!panelConfig) return {valid:true,messages:[]}
const optionConfig = openticket.configs.get("openticket:options")
const optionConfig = opendiscord.configs.get("openticket:options")
if (!optionConfig) return {valid:true,messages:[]}
const final: api.ODCheckerMessage[] = []
+98 -98
View File
@@ -1,13 +1,13 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as discord from "discord.js"
const generalConfig = openticket.configs.get("openticket:general")
const globalDatabase = openticket.databases.get("openticket:global")
const userDatabase = openticket.databases.get("openticket:users")
const ticketDatabase = openticket.databases.get("openticket:tickets")
const statsDatabase = openticket.databases.get("openticket:stats")
const optionDatabase = openticket.databases.get("openticket:options")
const mainServer = openticket.client.mainServer
const generalConfig = opendiscord.configs.get("openticket:general")
const globalDatabase = opendiscord.databases.get("openticket:global")
const userDatabase = opendiscord.databases.get("openticket:users")
const ticketDatabase = opendiscord.databases.get("openticket:tickets")
const statsDatabase = opendiscord.databases.get("openticket:stats")
const optionDatabase = opendiscord.databases.get("openticket:options")
const mainServer = opendiscord.client.mainServer
export const loadAllCode = async () => {
if (!generalConfig || !mainServer || !globalDatabase || !userDatabase || !ticketDatabase || !statsDatabase || !optionDatabase) return
@@ -22,46 +22,46 @@ export const loadAllCode = async () => {
export const loadCommandErrorHandlingCode = async () => {
//COMMAND ERROR HANDLING
openticket.code.add(new api.ODCode("openticket:command-error-handling",14,() => {
opendiscord.code.add(new api.ODCode("openticket:command-error-handling",14,() => {
//invalid/missing options
openticket.client.textCommands.onError(async (error) => {
opendiscord.client.textCommands.onError(async (error) => {
if (error.msg.channel.type == discord.ChannelType.GroupDM) return
if (error.type == "invalid_option"){
error.msg.channel.send((await openticket.builders.messages.getSafe("openticket:error-option-invalid").build("text",{guild:error.msg.guild,channel:error.msg.channel,user:error.msg.author,error})).message)
error.msg.channel.send((await opendiscord.builders.messages.getSafe("openticket:error-option-invalid").build("text",{guild:error.msg.guild,channel:error.msg.channel,user:error.msg.author,error})).message)
}else if (error.type == "missing_option"){
error.msg.channel.send((await openticket.builders.messages.getSafe("openticket:error-option-missing").build("text",{guild:error.msg.guild,channel:error.msg.channel,user:error.msg.author,error})).message)
error.msg.channel.send((await opendiscord.builders.messages.getSafe("openticket:error-option-missing").build("text",{guild:error.msg.guild,channel:error.msg.channel,user:error.msg.author,error})).message)
}else if (error.type == "unknown_command" && generalConfig.data.system.sendErrorOnUnknownCommand){
error.msg.channel.send((await openticket.builders.messages.getSafe("openticket:error-unknown-command").build("text",{guild:error.msg.guild,channel:error.msg.channel,user:error.msg.author,error})).message)
error.msg.channel.send((await opendiscord.builders.messages.getSafe("openticket:error-unknown-command").build("text",{guild:error.msg.guild,channel:error.msg.channel,user:error.msg.author,error})).message)
}
})
//responder timeout
openticket.responders.commands.setTimeoutErrorCallback(async (instance,source) => {
instance.reply(await openticket.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
opendiscord.responders.commands.setTimeoutErrorCallback(async (instance,source) => {
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
},null)
openticket.responders.buttons.setTimeoutErrorCallback(async (instance,source) => {
instance.reply(await openticket.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
opendiscord.responders.buttons.setTimeoutErrorCallback(async (instance,source) => {
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
},null)
openticket.responders.dropdowns.setTimeoutErrorCallback(async (instance,source) => {
instance.reply(await openticket.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
opendiscord.responders.dropdowns.setTimeoutErrorCallback(async (instance,source) => {
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
},null)
openticket.responders.modals.setTimeoutErrorCallback(async (instance,source) => {
opendiscord.responders.modals.setTimeoutErrorCallback(async (instance,source) => {
if (!instance.channel){
instance.reply({id:new api.ODId("looks-like-we-got-an-error-here"), ephemeral:true, message:{
content:":x: **Something went wrong while replying to this modal!**"
}})
return
}
instance.reply(await openticket.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
instance.reply(await opendiscord.builders.messages.getSafe("openticket:error-responder-timeout").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
},null)
}))
}
export const loadStartListeningInteractionsCode = async () => {
//START LISTENING TO INTERACTIONS
openticket.code.add(new api.ODCode("openticket:start-listening-interactions",13,() => {
openticket.client.slashCommands.startListeningToInteractions()
openticket.client.textCommands.startListeningToInteractions()
opendiscord.code.add(new api.ODCode("openticket:start-listening-interactions",13,() => {
opendiscord.client.slashCommands.startListeningToInteractions()
opendiscord.client.textCommands.startListeningToInteractions()
}))
}
@@ -69,7 +69,7 @@ export const loadDatabaseCleanersCode = async () => {
if (!mainServer) return
//PANEL DATABASE CLEANER
openticket.code.add(new api.ODCode("openticket:panel-database-cleaner",12,async () => {
opendiscord.code.add(new api.ODCode("openticket:panel-database-cleaner",12,async () => {
const validPanels: string[] = []
//check global database for valid panel embeds
@@ -77,7 +77,7 @@ export const loadDatabaseCleanersCode = async () => {
if (!validPanels.includes(panel.key)){
try{
const splittedId = panel.key.split("_")
const message = await openticket.client.fetchGuildChannelMessage(mainServer,splittedId[0],splittedId[1])
const message = await opendiscord.client.fetchGuildChannelMessage(mainServer,splittedId[0],splittedId[1])
if (message) validPanels.push(panel.key)
}catch{}
}
@@ -91,7 +91,7 @@ export const loadDatabaseCleanersCode = async () => {
}
//delete panel from database on delete
openticket.client.client.on("messageDelete",async (msg) => {
opendiscord.client.client.on("messageDelete",async (msg) => {
if (await globalDatabase.exists("openticket:panel-update",msg.channel.id+"_"+msg.id)){
await globalDatabase.delete("openticket:panel-update",msg.channel.id+"_"+msg.id)
}
@@ -99,21 +99,21 @@ export const loadDatabaseCleanersCode = async () => {
}))
//SUFFIX DATABASE CLEANER
openticket.code.add(new api.ODCode("openticket:suffix-database-cleaner",11,async () => {
opendiscord.code.add(new api.ODCode("openticket:suffix-database-cleaner",11,async () => {
const validSuffixCounters: string[] = []
const validSuffixHistories: string[] = []
//check global database for valid option suffix counters
for (const counter of (await globalDatabase.getCategory("openticket:option-suffix-counter") ?? [])){
if (!validSuffixCounters.includes(counter.key)){
if (openticket.options.exists(counter.key)) validSuffixCounters.push(counter.key)
if (opendiscord.options.exists(counter.key)) validSuffixCounters.push(counter.key)
}
}
//check global database for valid option suffix histories
for (const history of (await globalDatabase.getCategory("openticket:option-suffix-history") ?? [])){
if (!validSuffixHistories.includes(history.key)){
if (openticket.options.exists(history.key)) validSuffixHistories.push(history.key)
if (opendiscord.options.exists(history.key)) validSuffixHistories.push(history.key)
}
}
@@ -133,13 +133,13 @@ export const loadDatabaseCleanersCode = async () => {
}))
//OPTION DATABASE CLEANER
openticket.code.add(new api.ODCode("openticket:option-database-cleaner",10,async () => {
opendiscord.code.add(new api.ODCode("openticket:option-database-cleaner",10,async () => {
//delete all unused options (async)
for (const option of (await optionDatabase.getCategory("openticket:used-option") ?? [])){
if (!openticket.options.exists(option.key)){
if (!opendiscord.options.exists(option.key)){
//remove because option isn't loaded into memory (0 tickets require it)
await optionDatabase.delete("openticket:used-option",option.key)
}else if (!openticket.tickets.getAll().some((ticket) => ticket.option.id.value == option.key)){
}else if (!opendiscord.tickets.getAll().some((ticket) => ticket.option.id.value == option.key)){
//remove when loaded into memory (0 tickets require it)
await optionDatabase.delete("openticket:used-option",option.key)
}
@@ -147,7 +147,7 @@ export const loadDatabaseCleanersCode = async () => {
}))
//USER DATABASE CLEANER (full async/parallel because it takes a lot of time)
openticket.code.add(new api.ODCode("openticket:user-database-cleaner",9,() => {
opendiscord.code.add(new api.ODCode("openticket:user-database-cleaner",9,() => {
utilities.runAsync(async () => {
const validUsers: string[] = []
@@ -191,7 +191,7 @@ export const loadDatabaseCleanersCode = async () => {
})
//delete user from database on leave
openticket.client.client.on("guildMemberRemove",async (member) => {
opendiscord.client.client.on("guildMemberRemove",async (member) => {
if (member.guild.id != mainServer.id) return
//remove unused user
@@ -213,14 +213,14 @@ export const loadDatabaseCleanersCode = async () => {
}))
//TICKET DATABASE CLEANER
openticket.code.add(new api.ODCode("openticket:ticket-database-cleaner",8,async () => {
opendiscord.code.add(new api.ODCode("openticket:ticket-database-cleaner",8,async () => {
const validTickets: string[] = []
//check ticket database for valid tickets
for (const ticket of (await ticketDatabase.getAll())){
if (!validTickets.includes(ticket.key)){
try{
const channel = await openticket.client.fetchGuildTextChannel(mainServer,ticket.key)
const channel = await opendiscord.client.fetchGuildTextChannel(mainServer,ticket.key)
if (channel) validTickets.push(channel.id)
}catch{}
}
@@ -231,7 +231,7 @@ export const loadDatabaseCleanersCode = async () => {
if (stat.category.startsWith("openticket:ticket_")){
if (!validTickets.includes(stat.key)){
try{
const channel = await openticket.client.fetchGuildTextChannel(mainServer,stat.key)
const channel = await opendiscord.client.fetchGuildTextChannel(mainServer,stat.key)
if (channel) validTickets.push(channel.id)
}catch{}
}
@@ -242,7 +242,7 @@ export const loadDatabaseCleanersCode = async () => {
for (const ticket of (await ticketDatabase.getAll())){
if (!validTickets.includes(ticket.key)){
await ticketDatabase.delete(ticket.category,ticket.key)
openticket.tickets.remove(ticket.key)
opendiscord.tickets.remove(ticket.key)
}
}
@@ -256,14 +256,14 @@ export const loadDatabaseCleanersCode = async () => {
}
//delete ticket from database on delete
openticket.client.client.on("channelDelete",async (channel) => {
opendiscord.client.client.on("channelDelete",async (channel) => {
if (channel.isDMBased() || channel.guild.id != mainServer.id) return
//remove unused ticket
for (const ticket of (await ticketDatabase.getAll())){
if (ticket.key == channel.id){
await ticketDatabase.delete(ticket.category,ticket.key)
openticket.tickets.remove(ticket.key)
opendiscord.tickets.remove(ticket.key)
}
}
@@ -281,13 +281,13 @@ export const loadDatabaseCleanersCode = async () => {
export const loadPanelAutoUpdateCode = async () => {
//PANEL AUTO UPDATE
openticket.code.add(new api.ODCode("openticket:panel-auto-update",7,async () => {
const globalDatabase = openticket.databases.get("openticket:global")
opendiscord.code.add(new api.ODCode("openticket:panel-auto-update",7,async () => {
const globalDatabase = opendiscord.databases.get("openticket:global")
const panelIds = await globalDatabase.getCategory("openticket:panel-update") ?? []
if (!mainServer) return
for (const panelId of panelIds){
const panel = openticket.panels.get(panelId.value)
const panel = opendiscord.panels.get(panelId.value)
//panel doesn't exist anymore in config and needs to be removed
if (!panel){
@@ -297,13 +297,13 @@ export const loadPanelAutoUpdateCode = async () => {
try{
const splittedId = panelId.key.split("_")
const channel = await openticket.client.fetchGuildTextChannel(mainServer,splittedId[0])
const channel = await opendiscord.client.fetchGuildTextChannel(mainServer,splittedId[0])
if (!channel) return
const message = await openticket.client.fetchGuildChannelMessage(mainServer,channel,splittedId[1])
const message = await opendiscord.client.fetchGuildChannelMessage(mainServer,channel,splittedId[1])
if (!message || !message.editable) return
message.edit((await openticket.builders.messages.getSafe("openticket:panel").build("auto-update",{guild:mainServer,channel,user:openticket.client.client.user,panel})).message)
openticket.log("Panel in server got auto-updated!","info",[
message.edit((await opendiscord.builders.messages.getSafe("openticket:panel").build("auto-update",{guild:mainServer,channel,user:opendiscord.client.client.user,panel})).message)
opendiscord.log("Panel in server got auto-updated!","info",[
{key:"channelid",value:splittedId[0]},
{key:"messageid",value:splittedId[1]},
{key:"panel",value:panelId.value}
@@ -315,10 +315,10 @@ export const loadPanelAutoUpdateCode = async () => {
export const loadDatabaseSaversCode = async () => {
//TICKET SAVER
openticket.code.add(new api.ODCode("openticket:ticket-saver",6,() => {
const mainVersion = openticket.versions.get("openticket:version")
opendiscord.code.add(new api.ODCode("openticket:ticket-saver",6,() => {
const mainVersion = opendiscord.versions.get("openticket:version")
openticket.tickets.onAdd(async (ticket) => {
opendiscord.tickets.onAdd(async (ticket) => {
await ticketDatabase.set("openticket:ticket",ticket.id.value,ticket.toJson(mainVersion))
//add option to database if non-existent
@@ -326,7 +326,7 @@ export const loadDatabaseSaversCode = async () => {
await optionDatabase.set("openticket:used-option",ticket.option.id.value,ticket.option.toJson(mainVersion))
}
})
openticket.tickets.onChange(async (ticket) => {
opendiscord.tickets.onChange(async (ticket) => {
await ticketDatabase.set("openticket:ticket",ticket.id.value,ticket.toJson(mainVersion))
//add option to database if non-existent
@@ -335,42 +335,42 @@ export const loadDatabaseSaversCode = async () => {
}
//delete all unused options on ticket move
for (const option of openticket.options.getAll()){
if (await optionDatabase.exists("openticket:used-option",option.id.value) && !openticket.tickets.getAll().some((ticket) => ticket.option.id.value == option.id.value)){
for (const option of opendiscord.options.getAll()){
if (await optionDatabase.exists("openticket:used-option",option.id.value) && !opendiscord.tickets.getAll().some((ticket) => ticket.option.id.value == option.id.value)){
await optionDatabase.delete("openticket:used-option",option.id.value)
}
}
})
openticket.tickets.onRemove(async (ticket) => {
opendiscord.tickets.onRemove(async (ticket) => {
await ticketDatabase.delete("openticket:ticket",ticket.id.value)
//remove option from database if unused
if (!openticket.tickets.getAll().some((ticket) => ticket.option.id.value == ticket.option.id.value)){
if (!opendiscord.tickets.getAll().some((ticket) => ticket.option.id.value == ticket.option.id.value)){
await optionDatabase.delete("openticket:used-option",ticket.option.id.value)
}
})
}))
//BLACKLIST SAVER
openticket.code.add(new api.ODCode("openticket:blacklist-saver",5,() => {
openticket.blacklist.onAdd(async (blacklist) => {
opendiscord.code.add(new api.ODCode("openticket:blacklist-saver",5,() => {
opendiscord.blacklist.onAdd(async (blacklist) => {
await userDatabase.set("openticket:blacklist",blacklist.id.value,blacklist.reason)
})
openticket.blacklist.onChange(async (blacklist) => {
opendiscord.blacklist.onChange(async (blacklist) => {
await userDatabase.set("openticket:blacklist",blacklist.id.value,blacklist.reason)
})
openticket.blacklist.onRemove(async (blacklist) => {
opendiscord.blacklist.onRemove(async (blacklist) => {
await userDatabase.delete("openticket:blacklist",blacklist.id.value)
})
}))
//AUTO ROLE ON JOIN
openticket.code.add(new api.ODCode("openticket:auto-role-on-join",4,() => {
openticket.client.client.on("guildMemberAdd",async (member) => {
for (const option of openticket.options.getAll()){
opendiscord.code.add(new api.ODCode("openticket:auto-role-on-join",4,() => {
opendiscord.client.client.on("guildMemberAdd",async (member) => {
for (const option of opendiscord.options.getAll()){
if (option instanceof api.ODRoleOption && option.get("openticket:add-on-join").value){
//add these roles on user join
await openticket.actions.get("openticket:reaction-role").run("panel-button",{guild:member.guild,user:member.user,option,overwriteMode:"add"})
await opendiscord.actions.get("openticket:reaction-role").run("panel-button",{guild:member.guild,user:member.user,option,overwriteMode:"add"})
}
}
})
@@ -379,11 +379,11 @@ export const loadDatabaseSaversCode = async () => {
const loadAutoCode = () => {
//AUTOCLOSE TIMEOUT
openticket.code.add(new api.ODCode("openticket:autoclose-timeout",3,() => {
opendiscord.code.add(new api.ODCode("openticket:autoclose-timeout",3,() => {
setInterval(async () => {
let count = 0
for (const ticket of openticket.tickets.getAll()){
const channel = await openticket.tickets.getTicketChannel(ticket)
for (const ticket of opendiscord.tickets.getAll()){
const channel = await opendiscord.tickets.getTicketChannel(ticket)
if (!channel) return
const lastMessage = (await channel.messages.fetch({limit:5})).first()
if (lastMessage && !ticket.get("openticket:closed").value){
@@ -395,26 +395,26 @@ const loadAutoCode = () => {
const time = hours*60*60*1000 //hours in milliseconds
if (enabled && (new Date().getTime() - lastMessage.createdTimestamp) >= time){
//autoclose ticket
await openticket.actions.get("openticket:close-ticket").run("autoclose",{guild:channel.guild,channel,user:openticket.client.client.user,ticket,reason:"Autoclose",sendMessage:false})
await channel.send((await openticket.builders.messages.getSafe("openticket:autoclose-message").build("timeout",{guild:channel.guild,channel,user:openticket.client.client.user,ticket})).message)
await opendiscord.actions.get("openticket:close-ticket").run("autoclose",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket,reason:"Autoclose",sendMessage:false})
await channel.send((await opendiscord.builders.messages.getSafe("openticket:autoclose-message").build("timeout",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
count++
await openticket.stats.get("openticket:global").setStat("openticket:tickets-autoclosed",1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-autoclosed",1,"increase")
}
}
}
openticket.debug.debug("Finished autoclose timeout cycle!",[
{key:"interval",value:openticket.defaults.getDefault("autocloseCheckInterval").toString()},
opendiscord.debug.debug("Finished autoclose timeout cycle!",[
{key:"interval",value:opendiscord.defaults.getDefault("autocloseCheckInterval").toString()},
{key:"closed",value:count.toString()}
])
},openticket.defaults.getDefault("autocloseCheckInterval"))
},opendiscord.defaults.getDefault("autocloseCheckInterval"))
}))
//AUTOCLOSE LEAVE
openticket.code.add(new api.ODCode("openticket:autoclose-leave",2,() => {
openticket.client.client.on("guildMemberRemove",async (member) => {
for (const ticket of openticket.tickets.getAll()){
opendiscord.code.add(new api.ODCode("openticket:autoclose-leave",2,() => {
opendiscord.client.client.on("guildMemberRemove",async (member) => {
for (const ticket of opendiscord.tickets.getAll()){
if (ticket.get("openticket:opened-by").value == member.id){
const channel = await openticket.tickets.getTicketChannel(ticket)
const channel = await opendiscord.tickets.getTicketChannel(ticket)
if (!channel) return
//ticket has been created by this user
const disableOnClaim = ticket.option.get("openticket:autoclose-disable-claim").value && ticket.get("openticket:claimed").value
@@ -422,9 +422,9 @@ const loadAutoCode = () => {
if (enabled){
//autoclose ticket
await openticket.actions.get("openticket:close-ticket").run("autoclose",{guild:channel.guild,channel,user:openticket.client.client.user,ticket,reason:"Autoclose",sendMessage:false})
await channel.send((await openticket.builders.messages.getSafe("openticket:autoclose-message").build("leave",{guild:channel.guild,channel,user:openticket.client.client.user,ticket})).message)
await openticket.stats.get("openticket:global").setStat("openticket:tickets-autoclosed",1,"increase")
await opendiscord.actions.get("openticket:close-ticket").run("autoclose",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket,reason:"Autoclose",sendMessage:false})
await channel.send((await opendiscord.builders.messages.getSafe("openticket:autoclose-message").build("leave",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-autoclosed",1,"increase")
}
}
}
@@ -432,11 +432,11 @@ const loadAutoCode = () => {
}))
//AUTODELETE TIMEOUT
openticket.code.add(new api.ODCode("openticket:autodelete-timeout",1,() => {
opendiscord.code.add(new api.ODCode("openticket:autodelete-timeout",1,() => {
setInterval(async () => {
let count = 0
for (const ticket of openticket.tickets.getAll()){
const channel = await openticket.tickets.getTicketChannel(ticket)
for (const ticket of opendiscord.tickets.getAll()){
const channel = await opendiscord.tickets.getTicketChannel(ticket)
if (!channel) return
const lastMessage = (await channel.messages.fetch({limit:5})).first()
if (lastMessage){
@@ -448,26 +448,26 @@ const loadAutoCode = () => {
const time = days*24*60*60*1000 //days in milliseconds
if (enabled && (new Date().getTime() - lastMessage.createdTimestamp) >= time){
//autodelete ticket
await channel.send((await openticket.builders.messages.getSafe("openticket:autodelete-message").build("timeout",{guild:channel.guild,channel,user:openticket.client.client.user,ticket})).message)
await openticket.actions.get("openticket:delete-ticket").run("autodelete",{guild:channel.guild,channel,user:openticket.client.client.user,ticket,reason:"Autodelete",sendMessage:false,withoutTranscript:false})
await channel.send((await opendiscord.builders.messages.getSafe("openticket:autodelete-message").build("timeout",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
await opendiscord.actions.get("openticket:delete-ticket").run("autodelete",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket,reason:"Autodelete",sendMessage:false,withoutTranscript:false})
count++
await openticket.stats.get("openticket:global").setStat("openticket:tickets-autodeleted",1,"increase")
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-autodeleted",1,"increase")
}
}
}
openticket.debug.debug("Finished autodelete timeout cycle!",[
{key:"interval",value:openticket.defaults.getDefault("autodeleteCheckInterval").toString()},
opendiscord.debug.debug("Finished autodelete timeout cycle!",[
{key:"interval",value:opendiscord.defaults.getDefault("autodeleteCheckInterval").toString()},
{key:"deleted",value:count.toString()}
])
},openticket.defaults.getDefault("autodeleteCheckInterval"))
},opendiscord.defaults.getDefault("autodeleteCheckInterval"))
}))
//AUTODELETE LEAVE
openticket.code.add(new api.ODCode("openticket:autodelete-leave",0,() => {
openticket.client.client.on("guildMemberRemove",async (member) => {
for (const ticket of openticket.tickets.getAll()){
opendiscord.code.add(new api.ODCode("openticket:autodelete-leave",0,() => {
opendiscord.client.client.on("guildMemberRemove",async (member) => {
for (const ticket of opendiscord.tickets.getAll()){
if (ticket.get("openticket:opened-by").value == member.id){
const channel = await openticket.tickets.getTicketChannel(ticket)
const channel = await opendiscord.tickets.getTicketChannel(ticket)
if (!channel) return
//ticket has been created by this user
const disableOnClaim = ticket.option.get("openticket:autodelete-disable-claim").value && ticket.get("openticket:claimed").value
@@ -475,9 +475,9 @@ const loadAutoCode = () => {
if (enabled){
//autodelete ticket
await channel.send((await openticket.builders.messages.getSafe("openticket:autodelete-message").build("leave",{guild:channel.guild,channel,user:openticket.client.client.user,ticket})).message)
await openticket.actions.get("openticket:delete-ticket").run("autodelete",{guild:channel.guild,channel,user:openticket.client.client.user,ticket,reason:"Autodelete",sendMessage:false,withoutTranscript:false})
await openticket.stats.get("openticket:global").setStat("openticket:tickets-autodeleted",1,"increase")
await channel.send((await opendiscord.builders.messages.getSafe("openticket:autodelete-message").build("leave",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
await opendiscord.actions.get("openticket:delete-ticket").run("autodelete",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket,reason:"Autodelete",sendMessage:false,withoutTranscript:false})
await opendiscord.stats.get("openticket:global").setStat("openticket:tickets-autodeleted",1,"increase")
}
}
}
@@ -485,8 +485,8 @@ const loadAutoCode = () => {
}))
//TICKET ANTI BUSY
openticket.code.add(new api.ODCode("openticket:ticket-anti-busy",-1,() => {
for (const ticket of openticket.tickets.getAll()){
opendiscord.code.add(new api.ODCode("openticket:ticket-anti-busy",-1,() => {
for (const ticket of opendiscord.tickets.getAll()){
//free tickets from corruption due to openticket:busy variable
ticket.get("openticket:busy").value = false
}
+10 -10
View File
@@ -1,11 +1,11 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as discord from "discord.js"
const lang = openticket.languages
const lang = opendiscord.languages
export const loadAllSlashCommands = async () => {
const commands = openticket.client.slashCommands
const generalConfig = openticket.configs.get("openticket:general")
const commands = opendiscord.client.slashCommands
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig) return
const act = discord.ApplicationCommandType
@@ -15,13 +15,13 @@ export const loadAllSlashCommands = async () => {
//create panel choices
const panelChoices : {name:string, value:string}[] = []
openticket.configs.get("openticket:panels").data.forEach((panel) => {
opendiscord.configs.get("openticket:panels").data.forEach((panel) => {
panelChoices.push({name:panel.name, value:panel.id})
})
//create ticket choices
const ticketChoices : {name:string, value:string}[] = []
openticket.configs.get("openticket:options").data.forEach((option) => {
opendiscord.configs.get("openticket:options").data.forEach((option) => {
if (option.type != "ticket") return
ticketChoices.push({name:option.name, value:option.id})
})
@@ -585,8 +585,8 @@ export const loadAllSlashCommands = async () => {
}
export const loadAllTextCommands = async () => {
const commands = openticket.client.textCommands
const generalConfig = openticket.configs.get("openticket:general")
const commands = opendiscord.client.textCommands
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig) return
if (!generalConfig.data.textCommands) return
@@ -594,13 +594,13 @@ export const loadAllTextCommands = async () => {
//create panel choices
const panelChoices : string[] = []
openticket.configs.get("openticket:panels").data.forEach((panel) => {
opendiscord.configs.get("openticket:panels").data.forEach((panel) => {
panelChoices.push(panel.id)
})
//create ticket choices
const ticketChoices : string[] = []
openticket.configs.get("openticket:options").data.forEach((option) => {
opendiscord.configs.get("openticket:options").data.forEach((option) => {
if (option.type != "ticket") return
ticketChoices.push(option.id)
})
+7 -7
View File
@@ -1,12 +1,12 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllConfigs = async () => {
const devconfigFlag = openticket.flags.get("openticket:dev-config")
const devconfigFlag = opendiscord.flags.get("openticket:dev-config")
const isDevconfig = devconfigFlag ? devconfigFlag.value : false
openticket.configs.add(new api.ODJsonConfig("openticket:general","general.json",(isDevconfig) ? "./devconfig/" : "./config/"))
openticket.configs.add(new api.ODJsonConfig("openticket:options","options.json",(isDevconfig) ? "./devconfig/" : "./config/"))
openticket.configs.add(new api.ODJsonConfig("openticket:panels","panels.json",(isDevconfig) ? "./devconfig/" : "./config/"))
openticket.configs.add(new api.ODJsonConfig("openticket:questions","questions.json",(isDevconfig) ? "./devconfig/" : "./config/"))
openticket.configs.add(new api.ODJsonConfig("openticket:transcripts","transcripts.json",(isDevconfig) ? "./devconfig/" : "./config/"))
opendiscord.configs.add(new api.ODJsonConfig("openticket:general","general.json",(isDevconfig) ? "./devconfig/" : "./config/"))
opendiscord.configs.add(new api.ODJsonConfig("openticket:options","options.json",(isDevconfig) ? "./devconfig/" : "./config/"))
opendiscord.configs.add(new api.ODJsonConfig("openticket:panels","panels.json",(isDevconfig) ? "./devconfig/" : "./config/"))
opendiscord.configs.add(new api.ODJsonConfig("openticket:questions","questions.json",(isDevconfig) ? "./devconfig/" : "./config/"))
opendiscord.configs.add(new api.ODJsonConfig("openticket:transcripts","transcripts.json",(isDevconfig) ? "./devconfig/" : "./config/"))
}
+3 -3
View File
@@ -1,7 +1,7 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllCooldowns = async () => {
await openticket.options.loopAll((option) => {
await opendiscord.options.loopAll((option) => {
if (!(option instanceof api.ODTicketOption)) return
loadTicketOptionCooldown(option)
})
@@ -12,6 +12,6 @@ export const loadTicketOptionCooldown = (option:api.ODTicketOption) => {
//option has cooldown
const minutes = option.get("openticket:cooldown-minutes").value
const milliseconds = minutes*60000
openticket.cooldowns.add(new api.ODTimeoutCooldown("openticket:option-cooldown_"+option.id.value,milliseconds))
opendiscord.cooldowns.add(new api.ODTimeoutCooldown("openticket:option-cooldown_"+option.id.value,milliseconds))
}
}
+7 -7
View File
@@ -1,15 +1,15 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as fjs from "formatted-json-stringify"
const devdatabaseFlag = openticket.flags.get("openticket:dev-database")
const devdatabaseFlag = opendiscord.flags.get("openticket:dev-database")
const isDevdatabase = devdatabaseFlag ? devdatabaseFlag.value : false
export const loadAllDatabases = async () => {
openticket.databases.add(defaultGlobalDatabase)
openticket.databases.add(defaultStatsDatabase)
openticket.databases.add(defaultTicketsDatabase)
openticket.databases.add(defaultUsersDatabase)
openticket.databases.add(defaultOptionsDatabase)
opendiscord.databases.add(defaultGlobalDatabase)
opendiscord.databases.add(defaultStatsDatabase)
opendiscord.databases.add(defaultTicketsDatabase)
opendiscord.databases.add(defaultUsersDatabase)
opendiscord.databases.add(defaultOptionsDatabase)
}
const defaultInlineFormatter = new fjs.ArrayFormatter(null,true,new fjs.ObjectFormatter(null,false,[
+2 -2
View File
@@ -1,4 +1,4 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllEvents = () => {
const eventList: (keyof api.ODEventIds_Default)[] = [
@@ -245,5 +245,5 @@ export const loadAllEvents = () => {
//ready
"onReadyForUsage"
]
eventList.forEach((event) => openticket.events.add(new api.ODEvent(event)))
eventList.forEach((event) => opendiscord.events.add(new api.ODEvent(event)))
}
+15 -15
View File
@@ -1,18 +1,18 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllFlags = async () => {
openticket.flags.add(new api.ODFlag("openticket:no-migration","No Migration","Disable Open Ticket data migration on update!","--no-migration",["-nm"]))
openticket.flags.add(new api.ODFlag("openticket:dev-config","Developer Config","Use the configs in /devconfig/ instead of /config/!","--dev-config",["-dc"]))
openticket.flags.add(new api.ODFlag("openticket:dev-database","Developer Database","Use the databases in /devdatabase/ instead of /database/!","--dev-database",["-nd"]))
openticket.flags.add(new api.ODFlag("openticket:debug","Debug Mode","Couldn't you find the error? Try to check this out!","--debug",["-d"]))
openticket.flags.add(new api.ODFlag("openticket:crash","Crash On Error","Crash the bot on an unknown error!","--crash",["-cr"]))
openticket.flags.add(new api.ODFlag("openticket:no-transcripts","No HTML Transcripts","Disable uploading HTML transcripts (for debugging)","--no-transcripts",["-nt"]))
openticket.flags.add(new api.ODFlag("openticket:no-checker","No Config Checker","Disable the Config Checker (for debugging)","--no-checker",["-nc"]))
openticket.flags.add(new api.ODFlag("openticket:checker","Full Config Checker","Render the Config Checker with extra details!","--checker",["-c"]))
openticket.flags.add(new api.ODFlag("openticket:no-easter","No Easter Eggs","Disable little Open Ticket easter eggs hidden in the bot!","--no-easter",["-ne"]))
openticket.flags.add(new api.ODFlag("openticket:no-plugins","No Plugins","Disable all Open Ticket plugins!","--no-plugins",["-np"]))
openticket.flags.add(new api.ODFlag("openticket:soft-plugins","Soft Plugins","Don't crash the bot when a plugin crashes!","--soft-plugins",["-sp"]))
openticket.flags.add(new api.ODFlag("openticket:force-slash-update","Force Slash Update","Force update all slash commands.","--force-slash",["-fs"]))
openticket.flags.add(new api.ODFlag("openticket:no-compile","No Compile","Disable compilation of plugins & bot before starting.","--no-compile",[]))
openticket.flags.add(new api.ODFlag("openticket:compile-only","Compile Only","This description will never be shown because the bot wouldn't run when this flag is enabled :)","--compile-only",[]))
opendiscord.flags.add(new api.ODFlag("openticket:no-migration","No Migration","Disable Open Ticket data migration on update!","--no-migration",["-nm"]))
opendiscord.flags.add(new api.ODFlag("openticket:dev-config","Developer Config","Use the configs in /devconfig/ instead of /config/!","--dev-config",["-dc"]))
opendiscord.flags.add(new api.ODFlag("openticket:dev-database","Developer Database","Use the databases in /devdatabase/ instead of /database/!","--dev-database",["-nd"]))
opendiscord.flags.add(new api.ODFlag("openticket:debug","Debug Mode","Couldn't you find the error? Try to check this out!","--debug",["-d"]))
opendiscord.flags.add(new api.ODFlag("openticket:crash","Crash On Error","Crash the bot on an unknown error!","--crash",["-cr"]))
opendiscord.flags.add(new api.ODFlag("openticket:no-transcripts","No HTML Transcripts","Disable uploading HTML transcripts (for debugging)","--no-transcripts",["-nt"]))
opendiscord.flags.add(new api.ODFlag("openticket:no-checker","No Config Checker","Disable the Config Checker (for debugging)","--no-checker",["-nc"]))
opendiscord.flags.add(new api.ODFlag("openticket:checker","Full Config Checker","Render the Config Checker with extra details!","--checker",["-c"]))
opendiscord.flags.add(new api.ODFlag("openticket:no-easter","No Easter Eggs","Disable little Open Ticket easter eggs hidden in the bot!","--no-easter",["-ne"]))
opendiscord.flags.add(new api.ODFlag("openticket:no-plugins","No Plugins","Disable all Open Ticket plugins!","--no-plugins",["-np"]))
opendiscord.flags.add(new api.ODFlag("openticket:soft-plugins","Soft Plugins","Don't crash the bot when a plugin crashes!","--soft-plugins",["-sp"]))
opendiscord.flags.add(new api.ODFlag("openticket:force-slash-update","Force Slash Update","Force update all slash commands.","--force-slash",["-fs"]))
opendiscord.flags.add(new api.ODFlag("openticket:no-compile","No Compile","Disable compilation of plugins & bot before starting.","--no-compile",[]))
opendiscord.flags.add(new api.ODFlag("openticket:compile-only","Compile Only","This description will never be shown because the bot wouldn't run when this flag is enabled :)","--compile-only",[]))
}
+5 -5
View File
@@ -1,9 +1,9 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
const lang = openticket.languages
const lang = opendiscord.languages
export const loadAllHelpMenuCategories = async () => {
const helpmenu = openticket.helpmenu
const helpmenu = opendiscord.helpmenu
helpmenu.add(new api.ODHelpMenuCategory("openticket:general",5,utilities.emojiTitle("📎","General Commands"))) //TODO TRANSLATION!!!
helpmenu.add(new api.ODHelpMenuCategory("openticket:ticket-basic",4,utilities.emojiTitle("🎫","Basic Ticket Commands"))) //TODO TRANSLATION!!!
@@ -15,8 +15,8 @@ export const loadAllHelpMenuCategories = async () => {
}
export const loadAllHelpMenuComponents = async () => {
const helpmenu = openticket.helpmenu
const generalConfig = openticket.configs.get("openticket:general")
const helpmenu = opendiscord.helpmenu
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig) return
const prefix = generalConfig.data.prefix
+24 -24
View File
@@ -1,30 +1,30 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllLanguages = async () => {
//register languages
openticket.languages.add(new api.ODJsonLanguage("openticket:custom","custom.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:english","english.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:dutch","dutch.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:portuguese","portuguese.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:czech","czech.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:german","german.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:catalan","catalan.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:hungarian","hungarian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:spanish","spanish.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:romanian","romanian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:ukrainian","ukrainian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:indonesian","indonesian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:italian","italian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:estonian","estonian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:finnish","finnish.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:danish","danish.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:thai","thai.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:turkish","turkish.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:french","french.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:arabic","arabic.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:hindi","hindi.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:lithuanian","lithuanian.json"))
openticket.languages.add(new api.ODJsonLanguage("openticket:polish","polish.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:custom","custom.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:english","english.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:dutch","dutch.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:portuguese","portuguese.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:czech","czech.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:german","german.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:catalan","catalan.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:hungarian","hungarian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:spanish","spanish.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:romanian","romanian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:ukrainian","ukrainian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:indonesian","indonesian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:italian","italian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:estonian","estonian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:finnish","finnish.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:danish","danish.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:thai","thai.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:turkish","turkish.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:french","french.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:arabic","arabic.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:hindi","hindi.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:lithuanian","lithuanian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("openticket:polish","polish.json"))
/** How to add more languages?
* - Register the language to the manager (see above)
+2 -2
View File
@@ -1,6 +1,6 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllLiveStatusSources = async () => {
//DEFAULT DJDJ DEV
openticket.livestatus.add(new api.ODLiveStatusUrlSource("openticket:default-djdj-dev","https://raw.githubusercontent.com/DJj123dj/open-ticket/refs/heads/dev/src/livestatus.json"))
opendiscord.livestatus.add(new api.ODLiveStatusUrlSource("openticket:default-djdj-dev","https://raw.githubusercontent.com/DJj123dj/open-ticket/refs/heads/dev/src/livestatus.json"))
}
+22 -22
View File
@@ -1,76 +1,76 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as discord from "discord.js"
export const loadAllPermissions = async () => {
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig) return
const mainServer = openticket.client.mainServer
const mainServer = opendiscord.client.mainServer
if (!mainServer) return
//DEVELOPER & OWNER
const developer = (await openticket.client.client.application.fetch()).owner
const developer = (await opendiscord.client.client.application.fetch()).owner
if (developer instanceof discord.User){
openticket.permissions.add(new api.ODPermission("openticket:developer-"+developer.id,"global-user","developer",developer))
opendiscord.permissions.add(new api.ODPermission("openticket:developer-"+developer.id,"global-user","developer",developer))
}else if (developer instanceof discord.Team){
developer.members.forEach((member) => {
openticket.permissions.add(new api.ODPermission("openticket:developer-"+member.user.id,"global-user","developer",member.user))
opendiscord.permissions.add(new api.ODPermission("openticket:developer-"+member.user.id,"global-user","developer",member.user))
})
}
const owner = (await mainServer.members.fetch(mainServer.ownerId)).user
openticket.permissions.add(new api.ODPermission("openticket:owner-"+owner.id,"global-user","owner",owner))
opendiscord.permissions.add(new api.ODPermission("openticket:owner-"+owner.id,"global-user","owner",owner))
//GLOBAL ADMINS
generalConfig.data.globalAdmins.forEach(async (admin) => {
const role = await mainServer.roles.fetch(admin)
if (!role) return openticket.log("Unable to register permission for global admin!","error",[
if (!role) return opendiscord.log("Unable to register permission for global admin!","error",[
{key:"roleid",value:admin}
])
openticket.permissions.add(new api.ODPermission("openticket:global-admin-"+admin,"global-role","admin",role))
opendiscord.permissions.add(new api.ODPermission("openticket:global-admin-"+admin,"global-role","admin",role))
})
//TICKET ADMINS
await openticket.tickets.loopAll(async (ticket) => {
await opendiscord.tickets.loopAll(async (ticket) => {
try {
const channel = await openticket.client.fetchGuildTextChannel(mainServer,ticket.id.value)
const channel = await opendiscord.client.fetchGuildTextChannel(mainServer,ticket.id.value)
if (!channel) return
const admins = ticket.option.exists("openticket:admins") ? ticket.option.get("openticket:admins").value : []
const readAdmins = ticket.option.exists("openticket:admins-readonly") ? ticket.option.get("openticket:admins-readonly").value : []
for (const admin of admins.concat(readAdmins)){
if (openticket.permissions.exists("openticket:ticket-admin_"+ticket.id.value+"_"+admin)) return
if (opendiscord.permissions.exists("openticket:ticket-admin_"+ticket.id.value+"_"+admin)) return
const role = await mainServer.roles.fetch(admin)
if (!role) return openticket.log("Unable to register permission for ticket admin!","error",[
if (!role) return opendiscord.log("Unable to register permission for ticket admin!","error",[
{key:"roleid",value:admin}
])
openticket.permissions.add(new api.ODPermission("openticket:ticket-admin_"+ticket.id.value+"_"+admin,"channel-role","support",role,channel))
opendiscord.permissions.add(new api.ODPermission("openticket:ticket-admin_"+ticket.id.value+"_"+admin,"channel-role","support",role,channel))
}
}catch(err){
process.emit("uncaughtException",err)
openticket.log("Ticket Admin Loading Permissions Error (see above)","error")
opendiscord.log("Ticket Admin Loading Permissions Error (see above)","error")
}
})
}
export const addTicketPermissions = async (ticket:api.ODTicket) => {
const mainServer = openticket.client.mainServer
const mainServer = opendiscord.client.mainServer
if (!mainServer) return
const channel = await openticket.client.fetchGuildTextChannel(mainServer,ticket.id.value)
const channel = await opendiscord.client.fetchGuildTextChannel(mainServer,ticket.id.value)
if (!channel) return
const admins = ticket.option.exists("openticket:admins") ? ticket.option.get("openticket:admins").value : []
const readAdmins = ticket.option.exists("openticket:admins-readonly") ? ticket.option.get("openticket:admins-readonly").value : []
for (const admin of admins.concat(readAdmins)){
if (openticket.permissions.exists("openticket:ticket-admin_"+ticket.id.value+"_"+admin)) return
if (opendiscord.permissions.exists("openticket:ticket-admin_"+ticket.id.value+"_"+admin)) return
const role = await mainServer.roles.fetch(admin)
if (!role) return openticket.log("Unable to register permission for ticket admin!","error",[
if (!role) return opendiscord.log("Unable to register permission for ticket admin!","error",[
{key:"roleid",value:admin}
])
openticket.permissions.add(new api.ODPermission("openticket:ticket-admin_"+ticket.id.value+"_"+admin,"channel-role","support",role,channel))
opendiscord.permissions.add(new api.ODPermission("openticket:ticket-admin_"+ticket.id.value+"_"+admin,"channel-role","support",role,channel))
}
}
@@ -79,7 +79,7 @@ export const removeTicketPermissions = async (ticket:api.ODTicket) => {
const readAdmins = ticket.option.exists("openticket:admins-readonly") ? ticket.option.get("openticket:admins-readonly").value : []
admins.concat(readAdmins).forEach(async (admin) => {
if (!openticket.permissions.exists("openticket:ticket-admin_"+ticket.id.value+"_"+admin)) return
openticket.permissions.remove("openticket:ticket-admin_"+ticket.id.value+"_"+admin)
if (!opendiscord.permissions.exists("openticket:ticket-admin_"+ticket.id.value+"_"+admin)) return
opendiscord.permissions.remove("openticket:ticket-admin_"+ticket.id.value+"_"+admin)
})
}
+5 -5
View File
@@ -1,14 +1,14 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllPosts = async () => {
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig) return
const transcriptConfig = openticket.configs.get("openticket:transcripts")
const transcriptConfig = opendiscord.configs.get("openticket:transcripts")
if (!transcriptConfig) return
//LOGS CHANNEL
if (generalConfig.data.system.logs.enabled) openticket.posts.add(new api.ODPost("openticket:logs",generalConfig.data.system.logs.channel))
if (generalConfig.data.system.logs.enabled) opendiscord.posts.add(new api.ODPost("openticket:logs",generalConfig.data.system.logs.channel))
//TRANSCRIPTS CHANNEL
if (transcriptConfig.data.general.enabled && transcriptConfig.data.general.enableChannel) openticket.posts.add(new api.ODPost("openticket:transcripts",transcriptConfig.data.general.channel))
if (transcriptConfig.data.general.enabled && transcriptConfig.data.general.enableChannel) opendiscord.posts.add(new api.ODPost("openticket:transcripts",transcriptConfig.data.general.channel))
}
+11 -11
View File
@@ -1,4 +1,4 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllProgressBarRenderers = async () => {
const defaultSettings: api.ODProgressBarRenderer_DefaultSettings = {
@@ -25,43 +25,43 @@ export const loadAllProgressBarRenderers = async () => {
//VALUE RENDERER
const valueRendererSettings: api.ODProgressBarRenderer_DefaultSettings = {...defaultSettings}
valueRendererSettings.labelType = "value"
openticket.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:value-renderer",valueRendererSettings))
opendiscord.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:value-renderer",valueRendererSettings))
//FRACTION RENDERER
const fractionRendererSettings: api.ODProgressBarRenderer_DefaultSettings = {...defaultSettings}
fractionRendererSettings.labelType = "fraction"
openticket.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:fraction-renderer",fractionRendererSettings))
opendiscord.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:fraction-renderer",fractionRendererSettings))
//PERCENTAGE RENDERER
const percentageRendererSettings: api.ODProgressBarRenderer_DefaultSettings = {...defaultSettings}
percentageRendererSettings.labelType = "percentage"
openticket.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:percentage-renderer",percentageRendererSettings))
opendiscord.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:percentage-renderer",percentageRendererSettings))
//TIME MS RENDERER
const timeMsRendererSettings: api.ODProgressBarRenderer_DefaultSettings = {...defaultSettings}
timeMsRendererSettings.labelType = "time-ms"
openticket.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:time-ms-renderer",timeMsRendererSettings))
opendiscord.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:time-ms-renderer",timeMsRendererSettings))
//TIME SEC RENDERER
const timeSecRendererSettings: api.ODProgressBarRenderer_DefaultSettings = {...defaultSettings}
timeSecRendererSettings.labelType = "time-sec"
openticket.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:time-sec-renderer",timeSecRendererSettings))
opendiscord.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:time-sec-renderer",timeSecRendererSettings))
//TIME MIN RENDERER
const timeMinRendererSettings: api.ODProgressBarRenderer_DefaultSettings = {...defaultSettings}
timeMinRendererSettings.labelType = "time-min"
openticket.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:time-min-renderer",timeMinRendererSettings))
opendiscord.progressbars.renderers.add(new api.ODProgressBarRenderer_Default("openticket:time-min-renderer",timeMinRendererSettings))
}
export const loadAllProgressBars = async () => {
const fractRenderer = openticket.progressbars.renderers.get("openticket:fraction-renderer")
const fractRenderer = opendiscord.progressbars.renderers.get("openticket:fraction-renderer")
//SLASH COMMAND REMOVE (doesn't have correct amount yet)
openticket.progressbars.add(new api.ODManualProgressBar("openticket:slash-command-remove",fractRenderer.withAdditionalSettings({filledBarColor:"red"}),0,"max",null,"Commands Removed"))
opendiscord.progressbars.add(new api.ODManualProgressBar("openticket:slash-command-remove",fractRenderer.withAdditionalSettings({filledBarColor:"red"}),0,"max",null,"Commands Removed"))
//SLASH COMMAND CREATE (doesn't have correct amount yet)
openticket.progressbars.add(new api.ODManualProgressBar("openticket:slash-command-create",fractRenderer.withAdditionalSettings({filledBarColor:"green"}),0,"max",null,"Commands Created"))
opendiscord.progressbars.add(new api.ODManualProgressBar("openticket:slash-command-create",fractRenderer.withAdditionalSettings({filledBarColor:"green"}),0,"max",null,"Commands Created"))
//SLASH COMMAND UPDATE (doesn't have correct amount yet)
openticket.progressbars.add(new api.ODManualProgressBar("openticket:slash-command-update",fractRenderer.withAdditionalSettings({filledBarColor:"openticket"}),0,"max",null,"Commands Updated"))
opendiscord.progressbars.add(new api.ODManualProgressBar("openticket:slash-command-update",fractRenderer.withAdditionalSettings({filledBarColor:"openticket"}),0,"max",null,"Commands Updated"))
}
+17 -17
View File
@@ -1,9 +1,9 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import ansis from "ansis"
export const loadAllStartScreenComponents = async () => {
//LOGO
openticket.startscreen.add(new api.ODStartScreenLogoComponent("openticket:logo",1000,[
opendiscord.startscreen.add(new api.ODStartScreenLogoComponent("openticket:logo",1000,[
" ██████╗ ██████╗ ███████╗███╗ ██╗ ████████╗██╗ ██████╗██╗ ██╗███████╗████████╗ ",
" ██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ╚══██╔══╝██║██╔════╝██║ ██╔╝██╔════╝╚══██╔══╝ ",
" ██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ ██║██║ █████╔╝ █████╗ ██║ ",
@@ -13,35 +13,35 @@ export const loadAllStartScreenComponents = async () => {
],true,false))
//HEADER
const currentLanguageMetadata = openticket.languages.getLanguageMetadata()
openticket.startscreen.add(new api.ODStartScreenHeaderComponent("openticket:header",999,[
{key:"Version",value:openticket.versions.get("openticket:version").toString()},
const currentLanguageMetadata = opendiscord.languages.getLanguageMetadata()
opendiscord.startscreen.add(new api.ODStartScreenHeaderComponent("openticket:header",999,[
{key:"Version",value:opendiscord.versions.get("openticket:version").toString()},
{key:"Support",value:"https://discord.dj-dj.be"},
{key:"Language",value:(currentLanguageMetadata ? currentLanguageMetadata.language : "Unknown")}
]," - ",{
align:"center",
width:openticket.startscreen.get("openticket:logo")
width:opendiscord.startscreen.get("openticket:logo")
}))
//FLAGS
openticket.startscreen.add(new api.ODStartScreenFlagsCategoryComponent("openticket:flags",4,openticket.flags.getAll()))
opendiscord.startscreen.add(new api.ODStartScreenFlagsCategoryComponent("openticket:flags",4,opendiscord.flags.getAll()))
//PLUGINS
openticket.startscreen.add(new api.ODStartScreenPluginsCategoryComponent("openticket:plugins",3,openticket.plugins.getAll(),openticket.plugins.unknownCrashedPlugins))
opendiscord.startscreen.add(new api.ODStartScreenPluginsCategoryComponent("openticket:plugins",3,opendiscord.plugins.getAll(),opendiscord.plugins.unknownCrashedPlugins))
//STATS
openticket.startscreen.add(new api.ODStartScreenPropertiesCategoryComponent("openticket:stats",2,"startup info",[
{key:"status",value:ansis.bold(openticket.client.activity.getStatusType())+openticket.client.activity.text+" ("+openticket.client.activity.status+")"},
{key:"options",value:"loaded "+ansis.bold(openticket.options.getLength().toString())+" options!"},
{key:"panels",value:"loaded "+ansis.bold(openticket.panels.getLength().toString())+" panels!"},
{key:"tickets",value:"loaded "+ansis.bold(openticket.tickets.getLength().toString())+" tickets!"},
{key:"roles",value:"loaded "+ansis.bold(openticket.roles.getLength().toString())+" roles!"},
{key:"help",value:ansis.bold(openticket.configs.get("openticket:general").data.prefix+"help")+" or "+ansis.bold("/help")}
opendiscord.startscreen.add(new api.ODStartScreenPropertiesCategoryComponent("openticket:stats",2,"startup info",[
{key:"status",value:ansis.bold(opendiscord.client.activity.getStatusType())+opendiscord.client.activity.text+" ("+opendiscord.client.activity.status+")"},
{key:"options",value:"loaded "+ansis.bold(opendiscord.options.getLength().toString())+" options!"},
{key:"panels",value:"loaded "+ansis.bold(opendiscord.panels.getLength().toString())+" panels!"},
{key:"tickets",value:"loaded "+ansis.bold(opendiscord.tickets.getLength().toString())+" tickets!"},
{key:"roles",value:"loaded "+ansis.bold(opendiscord.roles.getLength().toString())+" roles!"},
{key:"help",value:ansis.bold(opendiscord.configs.get("openticket:general").data.prefix+"help")+" or "+ansis.bold("/help")}
]))
//LIVESTATUS
openticket.startscreen.add(new api.ODStartScreenLiveStatusCategoryComponent("openticket:livestatus",1,openticket.livestatus))
opendiscord.startscreen.add(new api.ODStartScreenLiveStatusCategoryComponent("openticket:livestatus",1,opendiscord.livestatus))
//LOGS
openticket.startscreen.add(new api.ODStartScreenLogCategoryComponent("openticket:logs",0))
opendiscord.startscreen.add(new api.ODStartScreenLogCategoryComponent("openticket:logs",0))
}
+13 -13
View File
@@ -1,8 +1,8 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as discord from "discord.js"
const stats = openticket.stats
const lang = openticket.languages
const stats = opendiscord.stats
const lang = opendiscord.languages
export const loadAllStatScopes = async () => {
stats.add(new api.ODStatGlobalScope("openticket:global",utilities.emojiTitle("📊",lang.getTranslation("stats.scopes.global"))))
@@ -13,7 +13,7 @@ export const loadAllStatScopes = async () => {
}
export const loadAllStats = async () => {
const generalConfig = openticket.configs.get("openticket:general")
const generalConfig = opendiscord.configs.get("openticket:general")
if (!generalConfig) return
const global = stats.get("openticket:global")
@@ -34,10 +34,10 @@ export const loadAllStats = async () => {
const system = stats.get("openticket:system")
if (system){
system.add(new api.ODDynamicStat("openticket:startup-date",1,() => {
return lang.getTranslation("params.uppercase.startupDate")+": "+discord.time(openticket.processStartupDate,"f")
return lang.getTranslation("params.uppercase.startupDate")+": "+discord.time(opendiscord.processStartupDate,"f")
}))
system.add(new api.ODDynamicStat("openticket:version",0,() => {
return lang.getTranslation("params.uppercase.version")+": `"+openticket.versions.get("openticket:version").toString()+"`"
return lang.getTranslation("params.uppercase.version")+": `"+opendiscord.versions.get("openticket:version").toString()+"`"
}))
}
@@ -51,7 +51,7 @@ export const loadAllStats = async () => {
const scopeMember = await guild.members.fetch(scopeId)
if (!scopeMember) return ""
const permissions = await openticket.permissions.getPermissions(scopeMember.user,channel,guild)
const permissions = await opendiscord.permissions.getPermissions(scopeMember.user,channel,guild)
if (permissions.type == "developer") return lang.getTranslation("params.uppercase.role")+": 💻 `Developer`" //TODO TRANSLATION!!!
if (permissions.type == "owner") return lang.getTranslation("params.uppercase.role")+": 👑 `Server Owner`" //TODO TRANSLATION!!!
if (permissions.type == "admin") return lang.getTranslation("params.uppercase.role")+": 💼 `Server Admin`" //TODO TRANSLATION!!!
@@ -79,7 +79,7 @@ export const loadAllStats = async () => {
return lang.getTranslation("params.uppercase.ticket")+": "+discord.channelMention(scopeId)
}))
ticket.add(new api.ODDynamicStat("openticket:status",4,async (scopeId,guild,channel,user) => {
const ticket = openticket.tickets.get(scopeId)
const ticket = opendiscord.tickets.get(scopeId)
if (!ticket) return ""
const closed = ticket.exists("openticket:closed") ? ticket.get("openticket:closed").value : false
@@ -87,28 +87,28 @@ export const loadAllStats = async () => {
return closed ? lang.getTranslation("params.uppercase.status")+": 🔒 `Closed`" : lang.getTranslation("params.uppercase.status")+": 🔓 `Open`" //TODO TRANSLATION!!!
}))
ticket.add(new api.ODDynamicStat("openticket:claimed",3,async (scopeId,guild,channel,user) => {
const ticket = openticket.tickets.get(scopeId)
const ticket = opendiscord.tickets.get(scopeId)
if (!ticket) return ""
const claimed = ticket.exists("openticket:claimed") ? ticket.get("openticket:claimed").value : false
return claimed ? lang.getTranslation("params.uppercase.claimed")+": 🟢 `Yes`" : lang.getTranslation("params.uppercase.claimed")+": 🔴 `No`" //TODO TRANSLATION!!!
}))
ticket.add(new api.ODDynamicStat("openticket:pinned",2,async (scopeId,guild,channel,user) => {
const ticket = openticket.tickets.get(scopeId)
const ticket = opendiscord.tickets.get(scopeId)
if (!ticket) return ""
const pinned = ticket.exists("openticket:pinned") ? ticket.get("openticket:pinned").value : false
return pinned ? lang.getTranslation("params.uppercase.pinned")+": 🟢 `Yes`" : lang.getTranslation("params.uppercase.pinned")+": 🔴 `No`" //TODO TRANSLATION!!!
}))
ticket.add(new api.ODDynamicStat("openticket:creation-date",1,async (scopeId,guild,channel,user) => {
const ticket = openticket.tickets.get(scopeId)
const ticket = opendiscord.tickets.get(scopeId)
if (!ticket) return ""
const rawDate = ticket.get("openticket:opened-on").value ?? new Date().getTime()
return lang.getTranslation("params.uppercase.creationDate")+": "+discord.time(new Date(rawDate),"f")
}))
ticket.add(new api.ODDynamicStat("openticket:creator",0,async (scopeId,guild,channel,user) => {
const ticket = openticket.tickets.get(scopeId)
const ticket = opendiscord.tickets.get(scopeId)
if (!ticket) return ""
const creator = ticket.get("openticket:opened-by").value
@@ -119,7 +119,7 @@ export const loadAllStats = async () => {
const participants = stats.get("openticket:participants")
if (participants){
participants.add(new api.ODDynamicStat("openticket:participants",0,async (scopeId,guild,channel,user) => {
const ticket = openticket.tickets.get(scopeId)
const ticket = opendiscord.tickets.get(scopeId)
if (!ticket) return ""
const participants = ticket.exists("openticket:participants") ? ticket.get("openticket:participants").value : []
+3 -3
View File
@@ -1,11 +1,11 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllBlacklistedUsers = async () => {
const userDatabase = openticket.databases.get("openticket:users")
const userDatabase = opendiscord.databases.get("openticket:users")
if (!userDatabase) return
const users = await userDatabase.getCategory("openticket:blacklist") ?? []
users.forEach((user) => {
if (typeof user.value == "string" || user.value === null) openticket.blacklist.add(new api.ODBlacklist(user.key,user.value))
if (typeof user.value == "string" || user.value === null) opendiscord.blacklist.add(new api.ODBlacklist(user.key,user.value))
})
}
+17 -17
View File
@@ -1,47 +1,47 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllOptions = async () => {
const optionConfig = openticket.configs.get("openticket:options")
const optionConfig = opendiscord.configs.get("openticket:options")
if (!optionConfig) return
optionConfig.data.forEach((option) => {
if (option.type == "ticket"){
const loadedOption = loadTicketOption(option)
openticket.options.add(loadedOption)
openticket.options.suffix.add(loadTicketOptionSuffix(loadedOption))
opendiscord.options.add(loadedOption)
opendiscord.options.suffix.add(loadTicketOptionSuffix(loadedOption))
}else if (option.type == "website"){
openticket.options.add(loadWebsiteOption(option))
opendiscord.options.add(loadWebsiteOption(option))
}else if (option.type == "role"){
openticket.options.add(loadRoleOption(option))
opendiscord.options.add(loadRoleOption(option))
}
})
//update options on config reload
optionConfig.onReload(async () => {
//clear previous options & suffixes
await openticket.options.loopAll((data,id) => {openticket.options.remove(id)})
await openticket.options.suffix.loopAll((data,id) => {openticket.options.suffix.remove(id)})
await opendiscord.options.loopAll((data,id) => {opendiscord.options.remove(id)})
await opendiscord.options.suffix.loopAll((data,id) => {opendiscord.options.suffix.remove(id)})
//add new options
optionConfig.data.forEach((option) => {
if (option.type == "ticket"){
const loadedOption = loadTicketOption(option)
openticket.options.add(loadedOption)
openticket.options.suffix.add(loadTicketOptionSuffix(loadedOption))
opendiscord.options.add(loadedOption)
opendiscord.options.suffix.add(loadTicketOptionSuffix(loadedOption))
}else if (option.type == "website"){
openticket.options.add(loadWebsiteOption(option))
opendiscord.options.add(loadWebsiteOption(option))
}else if (option.type == "role"){
openticket.options.add(loadRoleOption(option))
opendiscord.options.add(loadRoleOption(option))
}
})
//update options in tickets
await openticket.tickets.loopAll((ticket) => {
await opendiscord.tickets.loopAll((ticket) => {
const optionId = ticket.option.id
const option = openticket.options.get(optionId)
const option = opendiscord.options.get(optionId)
if (option && option instanceof api.ODTicketOption) ticket.option = option
else{
openticket.log("Unable to move ticket to unexisting option due to config reload!","warning",[
opendiscord.log("Unable to move ticket to unexisting option due to config reload!","warning",[
{key:"channelid",value:ticket.id.value},
{key:"option",value:optionId.value}
])
@@ -49,7 +49,7 @@ export const loadAllOptions = async () => {
})
//update roles on config reload
await openticket.roles.loopAll((data,id) => {openticket.roles.remove(id)})
await opendiscord.roles.loopAll((data,id) => {opendiscord.roles.remove(id)})
await (await import("./roleLoader.js")).loadAllRoles()
})
}
@@ -134,7 +134,7 @@ export const loadRoleOption = (opt:api.ODJsonConfig_DefaultOptionRoleType): api.
export const loadTicketOptionSuffix = (option:api.ODTicketOption): api.ODOptionSuffix => {
const mode = option.get("openticket:channel-suffix").value
const globalDatabase = openticket.databases.get("openticket:global")
const globalDatabase = opendiscord.databases.get("openticket:global")
if (mode == "user-name") return new api.ODOptionUserNameSuffix(option.id.value,option)
else if (mode == "random-number") return new api.ODOptionRandomNumberSuffix(option.id.value,option,globalDatabase)
else if (mode == "random-hex") return new api.ODOptionRandomHexSuffix(option.id.value,option,globalDatabase)
+6 -6
View File
@@ -1,22 +1,22 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
import * as discord from "discord.js"
export const loadAllPanels = async () => {
const panelConfig = openticket.configs.get("openticket:panels")
const panelConfig = opendiscord.configs.get("openticket:panels")
if (!panelConfig) return
panelConfig.data.forEach((panel) => {
openticket.panels.add(loadPanel(panel))
opendiscord.panels.add(loadPanel(panel))
})
//update panels on config reload
panelConfig.onReload(async () => {
//clear previous panels
await openticket.panels.loopAll((data,id) => {openticket.panels.remove(id)})
await opendiscord.panels.loopAll((data,id) => {opendiscord.panels.remove(id)})
//add new panels
panelConfig.data.forEach((panel) => {
openticket.panels.add(loadPanel(panel))
opendiscord.panels.add(loadPanel(panel))
})
})
}
@@ -53,7 +53,7 @@ export function describePanelOptions(mode:"fields"|"text", panel:api.ODPanel): {
let websiteOnly = true
let roleOnly = true
panel.get("openticket:options").value.forEach((id) => {
const opt = openticket.options.get(id)
const opt = opendiscord.options.get(id)
if (opt){
if (opt instanceof api.ODTicketOption){
options.push(opt)
+7 -7
View File
@@ -1,28 +1,28 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllQuestions = async () => {
const questionConfig = openticket.configs.get("openticket:questions")
const questionConfig = opendiscord.configs.get("openticket:questions")
if (!questionConfig) return
questionConfig.data.forEach((question) => {
if (question.type == "short"){
openticket.questions.add(loadShortQuestion(question))
opendiscord.questions.add(loadShortQuestion(question))
}else if (question.type == "paragraph"){
openticket.questions.add(loadParagraphQuestion(question))
opendiscord.questions.add(loadParagraphQuestion(question))
}
})
//update questions on config reload
questionConfig.onReload(async () => {
//clear previous questions
await openticket.questions.loopAll((data,id) => {openticket.questions.remove(id)})
await opendiscord.questions.loopAll((data,id) => {opendiscord.questions.remove(id)})
//add new questions
questionConfig.data.forEach((question) => {
if (question.type == "short"){
openticket.questions.add(loadShortQuestion(question))
opendiscord.questions.add(loadShortQuestion(question))
}else if (question.type == "paragraph"){
openticket.questions.add(loadParagraphQuestion(question))
opendiscord.questions.add(loadParagraphQuestion(question))
}
})
})
+3 -3
View File
@@ -1,9 +1,9 @@
import {openticket, api, utilities} from "../../index"
import {opendiscord, api, utilities} from "../../index"
export const loadAllRoles = async () => {
await openticket.options.loopAll((opt) => {
await opendiscord.options.loopAll((opt) => {
if (opt instanceof api.ODRoleOption){
openticket.roles.add(loadRole(opt))
opendiscord.roles.add(loadRole(opt))
}
})
}

Some files were not shown because too many files have changed in this diff Show More