Finished Message States & Overhauled Verifybars
This commit is contained in:
+10
-181
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerActions(){
|
||||
opendiscord.actions.add(new api.ODAction("opendiscord:claim-ticket"))
|
||||
@@ -62,7 +63,15 @@ export async function registerActions(){
|
||||
}
|
||||
|
||||
//reply with new message
|
||||
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (params.sendMessage){
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (sentMsg) await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"claim-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},false)
|
||||
}
|
||||
ticket.get("opendiscord:busy").value = false
|
||||
await opendiscord.events.get("afterTicketClaimed").emit([ticket,user,channel,reason])
|
||||
|
||||
@@ -100,183 +109,3 @@ export async function registerActions(){
|
||||
params.ticket.get("opendiscord:busy").value = false
|
||||
})
|
||||
}
|
||||
|
||||
export async function registerVerifyBars(){
|
||||
//CLAIM TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:claim-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:claim-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.claim
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:claim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when already claimed
|
||||
if (ticket.get("opendiscord:claimed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start claiming ticket
|
||||
if (params.data == "reason"){
|
||||
//claim with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:claim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//claim without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:claim-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//CLAIM TICKET UNCLAIM MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:claim-ticket-unclaim-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-unclaim-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:claim-ticket-unclaim-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.claim
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:claim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when already claimed
|
||||
if (ticket.get("opendiscord:claimed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start claiming ticket
|
||||
if (params.data == "reason"){
|
||||
//claim with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:claim-ticket-reason").build("unclaim-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//claim without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run("unclaim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build("unclaim-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:claim-ticket-unclaim-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-unclaim-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
}
|
||||
+9
-169
@@ -127,7 +127,15 @@ export async function registerActions(){
|
||||
}
|
||||
|
||||
//reply with new message
|
||||
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (params.sendMessage){
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (sentMsg) await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"close-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},false)
|
||||
}
|
||||
ticket.get("opendiscord:busy").value = false
|
||||
await opendiscord.events.get("afterTicketClosed").emit([ticket,user,channel,reason])
|
||||
|
||||
@@ -165,171 +173,3 @@ export async function registerActions(){
|
||||
params.ticket.get("opendiscord:busy").value = false
|
||||
})
|
||||
}
|
||||
|
||||
export const registerVerifyBars = async () => {
|
||||
//CLOSE TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:close-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:close-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:close-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.close,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when already closed
|
||||
if (ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:lang.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//start closing ticket
|
||||
if (params.data == "reason"){
|
||||
//close with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:close-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//close without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:close-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//CLOSE TICKET REOPEN MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:close-ticket-reopen-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:close-ticket-reopen-message").success.add([
|
||||
new api.ODWorker("opendiscord:close-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.close,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when already closed
|
||||
if (ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:lang.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//start closing ticket
|
||||
if (params.data == "reason"){
|
||||
//close with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:close-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//close without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:close-ticket-reopen-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-reopen-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import * as discord from "discord.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerActions(){
|
||||
opendiscord.actions.add(new api.ODAction("opendiscord:create-ticket"))
|
||||
@@ -207,17 +208,23 @@ export async function registerActions(){
|
||||
//check if ticket message is enabled
|
||||
if (!option.get("opendiscord:ticket-message-enabled").value) return
|
||||
try {
|
||||
const msg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build(origin,{guild,channel,user,ticket})).message)
|
||||
const ticketMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build(origin,{guild,channel,user,ticket})).message)
|
||||
|
||||
ticket.get("opendiscord:ticket-message").value = msg.id
|
||||
if (ticketMsg) await interactiveMsgState.setMsgState({channel,message:ticketMsg},{
|
||||
messageType:"ticket-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id
|
||||
},false)
|
||||
|
||||
ticket.get("opendiscord:ticket-message").value = ticketMsg.id
|
||||
|
||||
//pin ticket message (if required)
|
||||
if (generalConfig.data.system.pinFirstTicketMessage && msg.pinnable) await msg.pin("Ticket Message")
|
||||
if (generalConfig.data.system.pinFirstTicketMessage && ticketMsg.pinnable) await ticketMsg.pin("Ticket Message")
|
||||
|
||||
//manage stats
|
||||
await opendiscord.statistics.get("opendiscord:ticket").setStat("opendiscord:messages-sent",ticket.id.value,1,"increase")
|
||||
|
||||
await opendiscord.events.get("afterTicketMainMessageCreated").emit([ticket,msg,channel,user])
|
||||
await opendiscord.events.get("afterTicketMainMessageCreated").emit([ticket,ticketMsg,channel,user])
|
||||
}catch(err){
|
||||
process.emit("uncaughtException",err)
|
||||
//something went wrong while sending the ticket message
|
||||
|
||||
@@ -114,356 +114,3 @@ export async function registerActions(){
|
||||
params.ticket.get("opendiscord:for-deletion").value = false
|
||||
})
|
||||
}
|
||||
|
||||
export async function registerVerifyBars(){
|
||||
//DELETE TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//don't allow deleteWithoutTranscript to non-global-admins when enabled
|
||||
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
|
||||
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//start deleting ticket
|
||||
if (params.data == "reason"){
|
||||
//delete with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord: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
|
||||
opendiscord.actions.get("opendiscord: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("opendiscord:for-deletion").value = true
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//DELETE TICKET CLOSE MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-close-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-close-message").success.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//don't allow deleteWithoutTranscript to non-global-admins when enabled
|
||||
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
|
||||
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//start deleting ticket
|
||||
if (params.data == "reason"){
|
||||
//delete with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord: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
|
||||
opendiscord.actions.get("opendiscord: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("opendiscord:for-deletion").value = true
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build("close-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-close-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-close-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
|
||||
//DELETE TICKET REOPEN MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-reopen-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-reopen-message").success.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//don't allow deleteWithoutTranscript to non-global-admins when enabled
|
||||
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
|
||||
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//start deleting ticket
|
||||
if (params.data == "reason"){
|
||||
//delete with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord: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
|
||||
opendiscord.actions.get("opendiscord: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("opendiscord:for-deletion").value = true
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-reopen-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-reopen-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
|
||||
//DELETE TICKET AUTOCLOSE MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-autoclose-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-autoclose-message").success.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//don't allow deleteWithoutTranscript to non-global-admins when enabled
|
||||
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
|
||||
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
|
||||
//start deleting ticket
|
||||
if (params.data == "reason"){
|
||||
//delete with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord: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
|
||||
opendiscord.actions.get("opendiscord: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("opendiscord:for-deletion").value = true
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket-autoclose-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-autoclose-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:autoclose-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
}
|
||||
@@ -3,30 +3,19 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
|
||||
export const registerButtonResponders = async () => {
|
||||
//VERIFYBAR SUCCESS
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:verifybar-success",/^od:verifybar-success_([^_]+)/))
|
||||
opendiscord.responders.buttons.get("opendiscord:verifybar-success").workers.add(
|
||||
export async function registerButtonResponders(){
|
||||
//HANDLE VERIFYBAR BUTTON
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:verifybar-button",/^od:verifybar\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.buttons.get("opendiscord:verifybar-button").workers.add(
|
||||
new api.ODWorker("opendiscord:handle-verifybar",0,async (instance,params,origin,cancel) => {
|
||||
const id = instance.interaction.customId.split("_")[1]
|
||||
const customData = instance.interaction.customId.split("_")[2] as string|undefined
|
||||
const match = /^od:verifybar\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const verifyBarId = match[1]
|
||||
const verifyButtonId = match[2]
|
||||
|
||||
const verifybar = opendiscord.verifybars.get(id)
|
||||
const verifybar = opendiscord.verifybars.get(verifyBarId)
|
||||
if (!verifybar) return
|
||||
if (verifybar.success) await verifybar.success.executeWorkers(instance,"verifybar",{data:customData ?? null,verifybarMessage:instance.message})
|
||||
})
|
||||
)
|
||||
|
||||
//VERIFYBAR FAILURE
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:verifybar-failure",/^od:verifybar-failure_([^_]+)/))
|
||||
opendiscord.responders.buttons.get("opendiscord:verifybar-failure").workers.add(
|
||||
new api.ODWorker("opendiscord:handle-verifybar",0,async (instance,params,origin,cancel) => {
|
||||
const id = instance.interaction.customId.split("_")[1]
|
||||
const customData = instance.interaction.customId.split("_")[2] as string|undefined
|
||||
|
||||
const verifybar = opendiscord.verifybars.get(id)
|
||||
if (!verifybar) return
|
||||
if (verifybar.failure) await verifybar.failure.executeWorkers(instance,"verifybar",{data:customData ?? null,verifybarMessage:instance.message})
|
||||
await verifybar.activate(instance,verifyButtonId)
|
||||
})
|
||||
)
|
||||
}
|
||||
+10
-185
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerActions(){
|
||||
opendiscord.actions.add(new api.ODAction("opendiscord:pin-ticket"))
|
||||
@@ -61,7 +62,15 @@ export async function registerActions(){
|
||||
}
|
||||
|
||||
//reply with new message
|
||||
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (params.sendMessage){
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (sentMsg) await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"pin-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},false)
|
||||
}
|
||||
ticket.get("opendiscord:busy").value = false
|
||||
await opendiscord.events.get("afterTicketPinned").emit([ticket,user,channel,reason])
|
||||
|
||||
@@ -95,187 +104,3 @@ export async function registerActions(){
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerVerifyBars(){
|
||||
//PIN TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:pin-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:pin-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.pin
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:pin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when already pinned
|
||||
if (ticket.get("opendiscord:pinned").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start pinning ticket
|
||||
if (params.data == "reason"){
|
||||
//pin with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:pin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//pin without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:pin-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//PIN TICKET UNPIN MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:pin-ticket-unpin-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-unpin-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:pin-ticket-unpin-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.pin
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:pin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when already pinned
|
||||
if (ticket.get("opendiscord:pinned").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start pinning ticket
|
||||
if (params.data == "reason"){
|
||||
//pin with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:pin-ticket-reason").build("unpin-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//pin without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run("unpin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build("unpin-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:pin-ticket-unpin-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-unpin-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
opendiscord.actions.get("opendiscord:pin-ticket").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
|
||||
//set busy to false in case of crash or cancel
|
||||
params.ticket.get("opendiscord:busy").value = false
|
||||
})
|
||||
}
|
||||
+10
-273
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerActions(){
|
||||
opendiscord.actions.add(new api.ODAction("opendiscord:reopen-ticket"))
|
||||
@@ -157,7 +158,15 @@ export async function registerActions(){
|
||||
}
|
||||
}
|
||||
|
||||
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (params.sendMessage){
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (sentMsg) await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"reopen-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},false)
|
||||
}
|
||||
ticket.get("opendiscord:busy").value = false
|
||||
await opendiscord.events.get("afterTicketReopened").emit([ticket,user,channel,reason])
|
||||
|
||||
@@ -191,275 +200,3 @@ export async function registerActions(){
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerVerifyBars(){
|
||||
//REOPEN TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:reopen-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:reopen-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not closed
|
||||
if (!ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start reopening ticket
|
||||
if (params.data == "reason"){
|
||||
//reopen with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:reopen-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//reopen without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//REOPEN TICKET CLOSE MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:reopen-ticket-close-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket-close-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:reopen-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not closed
|
||||
if (!ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start reopening ticket
|
||||
if (params.data == "reason"){
|
||||
//reopen with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:reopen-ticket-reason").build("close-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//reopen without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("close-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket-close-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-close-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
|
||||
//REOPEN TICKET AUTOCLOSE MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:reopen-ticket-autoclose-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket-autoclose-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:reopen-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not closed
|
||||
if (!ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start reopening ticket
|
||||
if (params.data == "reason"){
|
||||
//reopen with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:reopen-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//reopen without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket-autoclose-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-autoclose-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:autoclose-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
opendiscord.actions.get("opendiscord:reopen-ticket").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
|
||||
//set busy to false in case of crash or cancel
|
||||
params.ticket.get("opendiscord:busy").value = false
|
||||
})
|
||||
}
|
||||
+10
-185
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerActions(){
|
||||
opendiscord.actions.add(new api.ODAction("opendiscord:unclaim-ticket"))
|
||||
@@ -91,7 +92,15 @@ export async function registerActions(){
|
||||
}
|
||||
|
||||
//reply with new message
|
||||
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (params.sendMessage){
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (sentMsg) await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"unclaim-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},false)
|
||||
}
|
||||
ticket.get("opendiscord:busy").value = false
|
||||
await opendiscord.events.get("afterTicketUnclaimed").emit([ticket,user,channel,reason])
|
||||
|
||||
@@ -125,187 +134,3 @@ export async function registerActions(){
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerVerifyBars(){
|
||||
//UNCLAIM TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:unclaim-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:unclaim-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.unclaim
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:unclaim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not claimed
|
||||
if (!ticket.get("opendiscord:claimed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start unclaiming ticket
|
||||
if (params.data == "reason"){
|
||||
//unclaim with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:unclaim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//unclaim without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:unclaim-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//UNCLAIM TICKET CLAIM MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:unclaim-ticket-claim-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-claim-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:unclaim-ticket-claim-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.unclaim
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:unclaim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not claimed
|
||||
if (!ticket.get("opendiscord:claimed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start unclaiming ticket
|
||||
if (params.data == "reason"){
|
||||
//unclaim with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:unclaim-ticket-reason").build("claim-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//unclaim without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run("claim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build("claim-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:unclaim-ticket-claim-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-claim-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:claim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
opendiscord.actions.get("opendiscord:unclaim-ticket").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
|
||||
//set busy to false in case of crash or cancel
|
||||
params.ticket.get("opendiscord:busy").value = false
|
||||
})
|
||||
}
|
||||
+10
-185
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerActions(){
|
||||
opendiscord.actions.add(new api.ODAction("opendiscord:unpin-ticket"))
|
||||
@@ -52,7 +53,15 @@ export async function registerActions(){
|
||||
}
|
||||
|
||||
//reply with new message
|
||||
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (params.sendMessage){
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build(origin,{guild,channel,user,ticket,reason})).message)
|
||||
if (sentMsg) await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"unpin-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},false)
|
||||
}
|
||||
ticket.get("opendiscord:busy").value = false
|
||||
await opendiscord.events.get("afterTicketUnpinned").emit([ticket,user,channel,reason])
|
||||
|
||||
@@ -86,187 +95,3 @@ export async function registerActions(){
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerVerifyBars(){
|
||||
//UNPIN TICKET TICKET MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:unpin-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:unpin-ticket-ticket-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.unpin
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:unpin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not pinned
|
||||
if (!ticket.get("opendiscord:pinned").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start unpining ticket
|
||||
if (params.data == "reason"){
|
||||
//unpin with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:unpin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//unpin without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:unpin-ticket-ticket-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-ticket-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
})
|
||||
])
|
||||
|
||||
//UNPIN TICKET PIN MESSAGE
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:unpin-ticket-pin-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-pin-message"),!generalConfig.data.system.disableVerifyBars))
|
||||
opendiscord.verifybars.get("opendiscord:unpin-ticket-pin-message").success.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.unpin
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:unpin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
//return when not pinned
|
||||
if (!ticket.get("opendiscord:pinned").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//start unpinning ticket
|
||||
if (params.data == "reason"){
|
||||
//unpin with reason
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:unpin-ticket-reason").build("pin-message",{guild,channel,user,ticket}))
|
||||
}else{
|
||||
//unpin without reason
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run("pin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build("pin-message",{guild,channel,user,ticket,reason:null}))
|
||||
}
|
||||
})
|
||||
])
|
||||
opendiscord.verifybars.get("opendiscord:unpin-ticket-pin-message").failure.add([
|
||||
new api.ODWorker("opendiscord:back-to-pin-message",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
const {verifybarMessage} = params
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 opendiscord.builders.messages.getSafe("opendiscord:pin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
})
|
||||
])
|
||||
opendiscord.actions.get("opendiscord:unpin-ticket").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
|
||||
//set busy to false in case of crash or cancel
|
||||
params.ticket.get("opendiscord:busy").value = false
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
///////////////////////////////////////
|
||||
//ACTION UTILITY FUNCTIONS
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const lang = opendiscord.languages
|
||||
|
||||
/**Fetch the interactive message state. If not present, auto replies with error and returns `null`. When `null` is received, the worker should be returned and canceled. */
|
||||
export async function replyInteractiveMessageState(instance:api.ODButtonResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",channel:discord.TextBasedChannel,message:discord.Message|null,replacementCommandName:string){
|
||||
//check message state
|
||||
const {user,member,guild} = instance
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
if (!message){
|
||||
//TODO TRANSLATION!!!
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:"Unable to locate message of interaction. Use the command `{0}` instead.".replace("{0}",replacementCommandName),layout:"simple",customTitle:"Message State Error"}))
|
||||
return null
|
||||
}
|
||||
|
||||
const state = await interactiveMsgState.getMsgState({channel,message})
|
||||
if (!state){
|
||||
//TODO TRANSLATION!!!
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:"This interaction is no longer valid or has expired. Use the command `{0}` instead. It is normal to receive this error after a major Open Ticket update.".replace("{0}",replacementCommandName),layout:"simple",customTitle:"Message State Expired"}))
|
||||
return null
|
||||
}else return state
|
||||
}
|
||||
|
||||
/**Check the permissions for this command. If not allowed, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyHasPermissions(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",commandName:keyof api.ODGeneralJsonConfig_SystemPermissions) {
|
||||
//check permissions
|
||||
const {user,member,channel,guild} = instance
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions[commandName],"support",user,member,channel,guild)
|
||||
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server" && channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if channel is in guild/server. If not, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyIsInGuild(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other"){
|
||||
//check is in guild/server
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
if (!guild){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if channel is valid ticket. If not, auto replies with error and returns `null`. When `null` is received, the worker should be returned and canceled. */
|
||||
export async function replyIsTicket(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other") {
|
||||
//check if ticket exists
|
||||
const {user,member,channel,guild} = instance
|
||||
if (!channel) return null
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
|
||||
if (!ticket || channel.isDMBased()){
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build(origin,{guild,channel,user}))
|
||||
return null
|
||||
}else return ticket
|
||||
}
|
||||
|
||||
/**Check if ticket is not busy and available. If not, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketIsAvailable(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket) {
|
||||
//return when busy
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build(origin,{guild,channel,user}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if ticket is open. If closed, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketMustBeOpen(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket){
|
||||
//return when already closed
|
||||
const {user,member,channel,guild} = instance
|
||||
if (ticket.get("opendiscord:closed").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if ticket is closed. If open, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketMustBeClosed(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket) {
|
||||
//return when already open
|
||||
const {user,member,channel,guild} = instance
|
||||
if (!ticket.get("opendiscord:closed").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if ticket is unclaimed. If claimed, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketMustBeUnclaimed(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket) {
|
||||
//return when already claimed
|
||||
const {user,member,channel,guild} = instance
|
||||
if (ticket.get("opendiscord:claimed").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if ticket is claimed. If unclaimed, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketMustBeClaimed(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket) {
|
||||
//return when already unclaimed
|
||||
const {user,member,channel,guild} = instance
|
||||
if (!ticket.get("opendiscord:claimed").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if ticket is unpinned. If pinned, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketMustBeUnpinned(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket) {
|
||||
//return when already pinned
|
||||
const {user,member,channel,guild} = instance
|
||||
if (ticket.get("opendiscord:pinned").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if ticket is pinned. If unpinned, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyTicketMustBePinned(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket) {
|
||||
//return when already unpinned
|
||||
const {user,member,channel,guild} = instance
|
||||
if (!ticket.get("opendiscord:pinned").value){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
|
||||
return false
|
||||
}else return true
|
||||
}
|
||||
|
||||
/**Check if the ticket can be closed/deleted before a message has been sent by an admin or user. If not passing the test, auto replies with error and returns `false`. When `false` is received, the worker should be returned and canceled. */
|
||||
export async function replyMessageMustBeSentBeforeClose(instance:api.ODButtonResponderInstance|api.ODCommandResponderInstance|api.ODDropdownResponderInstance,origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",ticket:api.ODTicket,commandName:keyof api.ODGeneralJsonConfig_SystemPermissions) {
|
||||
//return when not allowed because of missing messages
|
||||
const {user,member,channel,guild} = instance
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions[commandName],"support",user,member,channel,guild)
|
||||
|
||||
if (!permsResult.hasPerms) throw new api.ODSystemError("Please check permissions before using replyMessageMustBeSentBeforeClose()")
|
||||
if (!guild || channel.isDMBased()) throw new api.ODSystemError("replyMessageMustBeSentBeforeClose() must be used in a guild and not a DM channel.")
|
||||
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return false
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
if (channel) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}else return true
|
||||
}
|
||||
+30
-54
@@ -8,8 +8,27 @@ const buttons = opendiscord.builders.buttons
|
||||
const lang = opendiscord.languages
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
|
||||
export const registerAllButtons = async () => {
|
||||
verifybarButtons()
|
||||
export async function registerAllButtons(){
|
||||
//VERIFYBAR BUTTON
|
||||
buttons.add(new api.ODButton("opendiscord:verifybar-button"))
|
||||
buttons.get("opendiscord:verifybar-button").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-button",0,async (instance,params) => {
|
||||
const {verifybar,verifyButtonId} = params
|
||||
if (params.verifyButtonId.length > 40) throw new api.ODSystemError("ODButton:opendiscord:verifybar-button => verifyButtonId '"+verifyButtonId+"' exceeds 40 characters limit!")
|
||||
|
||||
const color = ("customColor" in params && params.customColor) ? params.customColor : "gray"
|
||||
const label = ("customLabel" in params && params.customLabel) ? params.customLabel : null
|
||||
const defaultEmoji = ("buttonStyle" in params && params.buttonStyle && params.buttonStyle == "✅") ? "✅" : "❌"
|
||||
const emoji = ("customEmoji" in params && params.customEmoji) ? params.customEmoji : defaultEmoji
|
||||
|
||||
instance.setCustomId("od:verifybar|"+verifybar.id.value+"|"+verifyButtonId)
|
||||
instance.setMode("button")
|
||||
instance.setColor(color)
|
||||
if (label) instance.setLabel(label)
|
||||
if (emoji) instance.setEmoji(emoji)
|
||||
})
|
||||
)
|
||||
|
||||
errorButtons()
|
||||
helpMenuButtons()
|
||||
panelButtons()
|
||||
@@ -18,50 +37,6 @@ export const registerAllButtons = async () => {
|
||||
clearButtons()
|
||||
}
|
||||
|
||||
const verifybarButtons = () => {
|
||||
//VERIFYBAR SUCCESS
|
||||
buttons.add(new api.ODButton("opendiscord:verifybar-success"))
|
||||
buttons.get("opendiscord:verifybar-success").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-success",0,async (instance,params) => {
|
||||
const {verifybar,customData,customColor,customLabel,customEmoji} = params
|
||||
|
||||
if (customData && customData.length > 40) throw new api.ODSystemError("ODButton:opendiscord:verifybar-success => customData exceeds 40 characters limit!")
|
||||
|
||||
const newData = (customData) ? "_"+customData : ""
|
||||
const newColor = customColor ?? "gray"
|
||||
const newLabel = customLabel ?? ""
|
||||
const newEmoji = customEmoji ?? "✅"
|
||||
|
||||
instance.setCustomId("od:verifybar-success_"+verifybar.id.value+newData)
|
||||
instance.setMode("button")
|
||||
instance.setColor(newColor)
|
||||
if (newLabel) instance.setLabel(newLabel)
|
||||
if (newEmoji) instance.setEmoji(newEmoji)
|
||||
})
|
||||
)
|
||||
|
||||
//VERIFYBAR FAILURE
|
||||
buttons.add(new api.ODButton("opendiscord:verifybar-failure"))
|
||||
buttons.get("opendiscord:verifybar-failure").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-failure",0,async (instance,params) => {
|
||||
const {verifybar,customData,customColor,customLabel,customEmoji} = params
|
||||
|
||||
if (customData && customData.length > 40) throw new api.ODSystemError("ODButton:opendiscord:verifybar-success => customData exceeds 40 characters limit!")
|
||||
|
||||
const newData = (customData) ? "_"+customData : ""
|
||||
const newColor = customColor ?? "gray"
|
||||
const newLabel = customLabel ?? ""
|
||||
const newEmoji = customEmoji ?? "❌"
|
||||
|
||||
instance.setCustomId("od:verifybar-failure_"+verifybar.id.value+newData)
|
||||
instance.setMode("button")
|
||||
instance.setColor(newColor)
|
||||
if (newLabel) instance.setLabel(newLabel)
|
||||
if (newEmoji) instance.setEmoji(newEmoji)
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
const errorButtons = () => {
|
||||
//ERROR TICKET DEPRECATED TRANSCRIPT
|
||||
buttons.add(new api.ODButton("opendiscord:error-ticket-deprecated-transcript"))
|
||||
@@ -205,7 +180,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:close-ticket_"+origin)
|
||||
instance.setCustomId("od:close-ticket")
|
||||
instance.setColor("gray")
|
||||
instance.setEmoji("🔒")
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.close"))
|
||||
@@ -219,7 +194,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:delete-ticket_"+origin)
|
||||
instance.setCustomId("od:delete-ticket")
|
||||
instance.setColor("red")
|
||||
instance.setEmoji("✖")
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.delete"))
|
||||
@@ -233,7 +208,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:reopen-ticket_"+origin)
|
||||
instance.setCustomId("od:reopen-ticket")
|
||||
instance.setColor("green")
|
||||
instance.setEmoji("🔓")
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.reopen"))
|
||||
@@ -247,7 +222,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:claim-ticket_"+origin)
|
||||
instance.setCustomId("od:claim-ticket")
|
||||
instance.setColor("green")
|
||||
instance.setEmoji("👋")
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.claim"))
|
||||
@@ -261,7 +236,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:unclaim-ticket_"+origin)
|
||||
instance.setCustomId("od:unclaim-ticket")
|
||||
instance.setColor("green")
|
||||
instance.setEmoji("↩️")
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.unclaim"))
|
||||
@@ -275,7 +250,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:pin-ticket_"+origin)
|
||||
instance.setCustomId("od:pin-ticket")
|
||||
instance.setColor("gray")
|
||||
instance.setEmoji(generalConfig.data.system.pinEmoji)
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.pin"))
|
||||
@@ -289,7 +264,7 @@ const ticketButtons = () => {
|
||||
const {guild,channel,ticket} = params
|
||||
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:unpin-ticket_"+origin)
|
||||
instance.setCustomId("od:unpin-ticket")
|
||||
instance.setColor("gray")
|
||||
instance.setEmoji(generalConfig.data.system.pinEmoji)
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.unpin"))
|
||||
@@ -342,10 +317,11 @@ const clearButtons = () => {
|
||||
buttons.get("opendiscord:clear-continue").workers.add(
|
||||
new api.ODWorker("opendiscord:clear-continue",0,async (instance,params,origin) => {
|
||||
instance.setMode("button")
|
||||
instance.setCustomId("od:clear-continue_"+origin+"_"+params.filter)
|
||||
instance.setCustomId("od:clear-continue")
|
||||
instance.setColor("red")
|
||||
instance.setEmoji("✖")
|
||||
instance.setLabel(lang.getTranslation("actions.buttons.clear"))
|
||||
instance.setDisabled(params.inProgress)
|
||||
})
|
||||
)
|
||||
}
|
||||
+3
-305
@@ -13,7 +13,6 @@ const lang = opendiscord.languages
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
|
||||
export async function registerAllMessages(){
|
||||
verifyBarMessages()
|
||||
errorMessages()
|
||||
helpMenuMessages()
|
||||
statsMessages()
|
||||
@@ -27,307 +26,6 @@ export async function registerAllMessages(){
|
||||
extraMessages()
|
||||
}
|
||||
|
||||
const verifyBarMessages = () => {
|
||||
//VERIFYBAR TICKET MESSAGE
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-ticket-message"))
|
||||
messages.get("opendiscord:verifybar-ticket-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-ticket-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-ticket-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-ticket-message`")
|
||||
return
|
||||
}
|
||||
const option = ticket.option
|
||||
|
||||
//add pings
|
||||
const pingOptions = option.get("opendiscord:ticket-message-ping").value
|
||||
const pings: string[] = []
|
||||
const creator = ticket.get("opendiscord:opened-by").value
|
||||
if (creator) pings.push(discord.userMention(creator))
|
||||
if (pingOptions["@everyone"]) pings.push("@everyone")
|
||||
if (pingOptions["@here"]) pings.push("@here")
|
||||
pingOptions.custom.forEach((ping) => pings.push(discord.roleMention(ping)))
|
||||
const pingText = (pings.length > 0) ? pings.join(" ")+"\n" : ""
|
||||
|
||||
//add text
|
||||
const text = option.get("opendiscord:ticket-message-text").value
|
||||
if (text !== "") instance.setContent(pingText+text)
|
||||
else instance.setContent(pingText)
|
||||
|
||||
//add embed
|
||||
if (option.get("opendiscord:ticket-message-embed").value.enabled) instance.addEmbed(await embeds.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:claim-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:unclaim-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:pin-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:unpin-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:close-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:reopen-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:delete-ticket-ticket-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET CLOSED
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-close-message"))
|
||||
messages.get("opendiscord:verifybar-close-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-close-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-close-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-close-message`")
|
||||
return
|
||||
}
|
||||
|
||||
const rawReason = (originalMessage.embeds[0] && originalMessage.embeds[0].fields[0]) ? originalMessage.embeds[0].fields[0].value : null
|
||||
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:reopen-ticket-close-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:delete-ticket-close-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET REOPENED
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-reopen-message"))
|
||||
messages.get("opendiscord:verifybar-reopen-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-reopen-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-reopen-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-reopen-message`")
|
||||
return
|
||||
}
|
||||
|
||||
const rawReason = (originalMessage.embeds[0] && originalMessage.embeds[0].fields[0]) ? originalMessage.embeds[0].fields[0].value : null
|
||||
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:close-ticket-reopen-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:delete-ticket-reopen-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET CLAIM
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-claim-message"))
|
||||
messages.get("opendiscord:verifybar-claim-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-claim-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-claim-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-claim-message`")
|
||||
return
|
||||
}
|
||||
|
||||
const rawReason = (originalMessage.embeds[0] && originalMessage.embeds[0].fields[0]) ? originalMessage.embeds[0].fields[0].value : null
|
||||
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:claim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:unclaim-ticket-claim-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET UNCLAIM
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-unclaim-message"))
|
||||
messages.get("opendiscord:verifybar-unclaim-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-unclaim-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-unclaim-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-unclaim-message`")
|
||||
return
|
||||
}
|
||||
|
||||
const rawReason = (originalMessage.embeds[0] && originalMessage.embeds[0].fields[0]) ? originalMessage.embeds[0].fields[0].value : null
|
||||
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:claim-ticket-unclaim-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET PIN
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-pin-message"))
|
||||
messages.get("opendiscord:verifybar-pin-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-pin-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-pin-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-pin-message`")
|
||||
return
|
||||
}
|
||||
|
||||
const rawReason = (originalMessage.embeds[0] && originalMessage.embeds[0].fields[0]) ? originalMessage.embeds[0].fields[0].value : null
|
||||
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:pin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:unpin-ticket-pin-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET UNPIN
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-unpin-message"))
|
||||
messages.get("opendiscord:verifybar-unpin-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-unpin-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-unpin-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-unpin-message`")
|
||||
return
|
||||
}
|
||||
|
||||
const rawReason = (originalMessage.embeds[0] && originalMessage.embeds[0].fields[0]) ? originalMessage.embeds[0].fields[0].value : null
|
||||
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:unpin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:pin-ticket-unpin-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
//TICKET AUTOCLOSED
|
||||
messages.add(new api.ODMessage("opendiscord:verifybar-autoclose-message"))
|
||||
messages.get("opendiscord:verifybar-autoclose-message").workers.add(
|
||||
new api.ODWorker("opendiscord:verifybar-autoclose-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,verifybar,originalMessage} = params
|
||||
if (!guild || channel.isDMBased()){
|
||||
instance.setContent("ODError: Not In Guild => `opendiscord:verifybar-autoclose-message`")
|
||||
return
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket){
|
||||
instance.setContent("ODError: Unknown Ticket => `opendiscord:verifybar-autoclose-message`")
|
||||
return
|
||||
}
|
||||
|
||||
//add embed
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:autoclose-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
//add verifybar components
|
||||
if (verifybar.id.value == "opendiscord:reopen-ticket-autoclose-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
|
||||
}else if (verifybar.id.value == "opendiscord:delete-ticket-autoclose-message"){
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:verifybar-failure").build("verifybar",{guild,channel,user,verifybar}))
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"}))
|
||||
if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("opendiscord:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
const errorMessages = () => {
|
||||
//ERROR
|
||||
messages.add(new api.ODMessage("opendiscord:error"))
|
||||
@@ -990,9 +688,9 @@ const clearMessages = () => {
|
||||
messages.add(new api.ODMessage("opendiscord:clear-verify-message"))
|
||||
messages.get("opendiscord:clear-verify-message").workers.add(
|
||||
new api.ODWorker("opendiscord:clear-verify-message",0,async (instance,params,origin) => {
|
||||
const {guild,channel,user,filter,list} = params
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:clear-verify-message").build(origin,{guild,channel,user,filter,list}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:clear-continue").build(origin,{guild,channel,user,filter,list}))
|
||||
const {guild,channel,user,filter,list,inProgress} = params
|
||||
instance.addEmbed(await embeds.getSafe("opendiscord:clear-verify-message").build(origin,{guild,channel,user,filter,list,inProgress}))
|
||||
instance.addComponent(await buttons.getSafe("opendiscord:clear-continue").build(origin,{guild,channel,user,filter,list,inProgress}))
|
||||
instance.setEphemeral(true)
|
||||
})
|
||||
)
|
||||
|
||||
+14
-14
@@ -49,9 +49,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:close-ticket-reason"))
|
||||
modals.get("opendiscord:close-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:close-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:close-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:close-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.close"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
@@ -67,9 +67,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:reopen-ticket-reason"))
|
||||
modals.get("opendiscord:reopen-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:reopen-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:reopen-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:reopen-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.reopen"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
@@ -85,9 +85,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:delete-ticket-reason"))
|
||||
modals.get("opendiscord:delete-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:delete-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:delete-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:delete-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.delete"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
@@ -103,9 +103,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:claim-ticket-reason"))
|
||||
modals.get("opendiscord:claim-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:claim-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:claim-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:claim-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.claim"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
@@ -121,9 +121,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:unclaim-ticket-reason"))
|
||||
modals.get("opendiscord:unclaim-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:unclaim-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:unclaim-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:unclaim-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.unclaim"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
@@ -139,9 +139,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:pin-ticket-reason"))
|
||||
modals.get("opendiscord:pin-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:pin-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:pin-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:pin-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.pin"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
@@ -157,9 +157,9 @@ const ticketModals = () => {
|
||||
modals.add(new api.ODModal("opendiscord:unpin-ticket-reason"))
|
||||
modals.get("opendiscord:unpin-ticket-reason").workers.add(
|
||||
new api.ODWorker("opendiscord:unpin-ticket-reason",0,async (instance,params,origin) => {
|
||||
const {ticket} = params
|
||||
const {channel,message} = params
|
||||
|
||||
instance.setCustomId("od:unpin-ticket-reason_"+ticket.id.value+"_"+origin)
|
||||
instance.setCustomId("od:unpin-ticket-reason|"+channel.id+"|"+message.id)
|
||||
instance.setTitle(lang.getTranslation("actions.buttons.unpin"))
|
||||
instance.addQuestion({
|
||||
customId:"reason",
|
||||
|
||||
+184
-67
@@ -3,8 +3,11 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//CLAIM COMMAND RESPONDER
|
||||
@@ -13,46 +16,36 @@ export async function registerCommandResponders(){
|
||||
new api.ODWorker("opendiscord:claim",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user,member} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.claim,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"claim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when already claimed
|
||||
if (ticket.get("opendiscord:claimed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
const claimUser = instance.options.getUser("user",false) ?? user
|
||||
const reason = instance.options.getString("reason",false)
|
||||
const isTicketUnclaimed = await actionUtils.replyTicketMustBeUnclaimed(instance,origin,ticket)
|
||||
if (!isTicketUnclaimed) return cancel()
|
||||
|
||||
//start claiming ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
const claimUser = instance.options.getUser("user",false) ?? user
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(origin,{guild,channel,user:claimUser,ticket,reason,sendMessage:false})
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build(origin,{guild,channel,user:claimUser,ticket,reason}))
|
||||
|
||||
//send message & set state
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build(origin,{guild,channel,user:claimUser,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"claim-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:claimUser.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'claim' command!","info",[
|
||||
@@ -70,50 +63,174 @@ export async function registerButtonResponders(){
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:claim-ticket",/^od:claim-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:claim-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:claim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:claim-ticket"]["origin"],"slash"|"text">
|
||||
const {guild,channel,user,message} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:claim-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "unclaim-message") await opendiscord.verifybars.get("opendiscord:claim-ticket-unclaim-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"claim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/claim")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketUnclaimed = await actionUtils.replyTicketMustBeUnclaimed(instance,origin,ticket)
|
||||
if (!isTicketUnclaimed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:claim-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:claim-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "unclaim-message"){
|
||||
//unclaim message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:claim-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:unclaim-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//CLAIM WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:claim-ticket-reason",/^od:claim-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:claim-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:claim-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
export async function registerVerifyBars(){
|
||||
//CLAIM TICKET
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:claim-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:claim-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:claim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:claim-ticket"]["origin"],"slash"|"text">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"claim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//claim with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "unclaim-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/claim")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketUnclaimed = await actionUtils.replyTicketMustBeUnclaimed(instance,origin,ticket)
|
||||
if (!isTicketUnclaimed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start claiming ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "unclaim-message"){
|
||||
//unclaim message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept"){
|
||||
//CLAIM TICKET
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "unclaim-message"){
|
||||
//converted to claim message
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"claim-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//CLAIM WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:claim-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//CLAIM WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:claim-ticket-reason",/^od:claim-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:claim-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:claim-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:claim-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"claim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/claim")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketUnclaimed = await actionUtils.replyTicketMustBeUnclaimed(instance,origin,ticket)
|
||||
if (!isTicketUnclaimed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start claiming ticket
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "unclaim-message"){
|
||||
//converted to claim message
|
||||
await opendiscord.actions.get("opendiscord:claim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"claim-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
+45
-19
@@ -3,8 +3,10 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const clearMsgState = opendiscord.states.get("opendiscord:clear-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//CLEAR COMMAND RESPONDER
|
||||
@@ -29,7 +31,7 @@ export async function registerCommandResponders(){
|
||||
|
||||
const tempFilter = instance.options.getString("filter",false)
|
||||
const filter = (tempFilter) ? tempFilter.toLowerCase() as api.ODTicketClearFilter : "all"
|
||||
const list: string[] = []
|
||||
const channelNameList: string[] = []
|
||||
const ticketList = opendiscord.tickets.getAll().filter((ticket) => {
|
||||
if (filter == "all") return true
|
||||
else if (filter == "open" && ticket.get("opendiscord:open").value) return true
|
||||
@@ -43,12 +45,17 @@ export async function registerCommandResponders(){
|
||||
})
|
||||
for (const ticket of ticketList){
|
||||
const ticketChannel = await opendiscord.tickets.getTicketChannel(ticket)
|
||||
if (ticketChannel) list.push("#"+ticketChannel.name)
|
||||
if (ticketChannel) channelNameList.push("#"+ticketChannel.name)
|
||||
}
|
||||
|
||||
//reply with clear verify
|
||||
await instance.defer(true)
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:clear-verify-message").build(origin,{guild,channel,user,filter,list}))
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:clear-verify-message").build(origin,{guild,channel,user,filter,list:channelNameList,inProgress:false}))
|
||||
if (sentMsg.success) await clearMsgState.setMsgState({channel,message:sentMsg.message,user},{
|
||||
messageOrigin:origin,
|
||||
clearFilter:filter,
|
||||
clearChannelNameList:channelNameList
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'clear' command!","info",[
|
||||
@@ -63,26 +70,45 @@ export async function registerCommandResponders(){
|
||||
|
||||
export async function registerButtonResponders(){
|
||||
//CLEAR CONTINUE BUTTON RESPONDER
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:clear-continue",/^od:clear-continue_/))
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:clear-continue","od:clear-continue"))
|
||||
opendiscord.responders.buttons.get("opendiscord:clear-continue").workers.add(
|
||||
new api.ODWorker("opendiscord:clear-continue",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!guild || channel.isDMBased()) return
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as api.ODActionManagerIdMappings["opendiscord:clear-tickets"]["origin"]
|
||||
const filter = instance.interaction.customId.split("_")[2] as api.ODTicketClearFilter
|
||||
const {guild,channel,user,message} = instance
|
||||
|
||||
//check message state
|
||||
const state = await clearMsgState.getMsgState({channel,message,user})
|
||||
if (!state){
|
||||
//TODO TRANSLATION!!!
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild,channel,user,error:"This interaction is no longer valid or has expired. Use the command `{0}` instead. It is normal to receive this error after a major Open Ticket update.".replace("{0}","/clear"),layout:"simple",customTitle:"Message State Expired"}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"clear")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.userId) ? await opendiscord.client.fetchUser(state.userId) : user) ?? user
|
||||
const originalOrigin = state.data.messageOrigin
|
||||
const originalClearFilter = state.data.clearFilter
|
||||
const originalClearChannelNameList = state.data.clearChannelNameList
|
||||
|
||||
//start ticket clear
|
||||
await instance.defer("update",true)
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:clear-verify-message").build(originalOrigin,{guild,channel,user:originalUser,filter:originalClearFilter,list:originalClearChannelNameList,inProgress:true}))
|
||||
|
||||
const list: string[] = []
|
||||
const ticketList = opendiscord.tickets.getAll().filter((ticket) => {
|
||||
if (filter == "all") return true
|
||||
else if (filter == "open" && ticket.get("opendiscord:open").value) return true
|
||||
else if (filter == "closed" && ticket.get("opendiscord:closed").value) return true
|
||||
else if (filter == "claimed" && ticket.get("opendiscord:claimed").value) return true
|
||||
else if (filter == "pinned" && ticket.get("opendiscord:pinned").value) return true
|
||||
else if (filter == "unclaimed" && !ticket.get("opendiscord:claimed").value) return true
|
||||
else if (filter == "unpinned" && !ticket.get("opendiscord:pinned").value) return true
|
||||
else if (filter == "autoclosed" && ticket.get("opendiscord:closed").value) return true
|
||||
if (originalClearFilter == "all") return true
|
||||
else if (originalClearFilter == "open" && ticket.get("opendiscord:open").value) return true
|
||||
else if (originalClearFilter == "closed" && ticket.get("opendiscord:closed").value) return true
|
||||
else if (originalClearFilter == "claimed" && ticket.get("opendiscord:claimed").value) return true
|
||||
else if (originalClearFilter == "pinned" && ticket.get("opendiscord:pinned").value) return true
|
||||
else if (originalClearFilter == "unclaimed" && !ticket.get("opendiscord:claimed").value) return true
|
||||
else if (originalClearFilter == "unpinned" && !ticket.get("opendiscord:pinned").value) return true
|
||||
else if (originalClearFilter == "autoclosed" && ticket.get("opendiscord:closed").value) return true
|
||||
else return false
|
||||
})
|
||||
for (const ticket of ticketList){
|
||||
@@ -90,8 +116,8 @@ export async function registerButtonResponders(){
|
||||
if (ticketChannel) list.push("#"+ticketChannel.name)
|
||||
}
|
||||
|
||||
await opendiscord.actions.get("opendiscord:clear-tickets").run(originalOrigin,{guild,channel,user,filter,list:ticketList})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:clear-message").build(originalOrigin,{guild,channel,user,filter,list}))
|
||||
await opendiscord.actions.get("opendiscord:clear-tickets").run(originalOrigin,{guild,channel,user,filter:originalClearFilter,list:ticketList})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:clear-message").build(originalOrigin,{guild,channel,user,filter:originalClearFilter,list}))
|
||||
})
|
||||
)
|
||||
}
|
||||
+191
-78
@@ -3,9 +3,11 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//CLOSE COMMAND RESPONDER
|
||||
@@ -14,57 +16,38 @@ export async function registerCommandResponders(){
|
||||
new api.ODWorker("opendiscord:close",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.close,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"close")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when already closed
|
||||
if (ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isTicketOpen = await actionUtils.replyTicketMustBeOpen(instance,origin,ticket)
|
||||
if (!isTicketOpen) return cancel()
|
||||
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
const messagesHaveBeenSent = await actionUtils.replyMessageMustBeSentBeforeClose(instance,origin,ticket,"close")
|
||||
if (!messagesHaveBeenSent) return cancel()
|
||||
|
||||
//start closing ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(origin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
|
||||
//send message & set state
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"close-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'close' command!","info",[
|
||||
@@ -77,55 +60,185 @@ export async function registerCommandResponders(){
|
||||
])
|
||||
}
|
||||
|
||||
export const registerButtonResponders = async () => {
|
||||
export async function registerButtonResponders(){
|
||||
//CLOSE TICKET BUTTON RESPONDER
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:close-ticket",/^od:close-ticket_/))
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:close-ticket",/^od:close-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:close-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:close-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:close-ticket"]["origin"],"slash"|"text"|"autoclose">
|
||||
const {guild,channel,message,user,member} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:close-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "reopen-message") await opendiscord.verifybars.get("opendiscord:close-ticket-reopen-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"close")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/close")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketOpen = await actionUtils.replyTicketMustBeOpen(instance,origin,ticket)
|
||||
if (!isTicketOpen) return cancel()
|
||||
|
||||
const messagesHaveBeenSent = await actionUtils.replyMessageMustBeSentBeforeClose(instance,origin,ticket,"close")
|
||||
if (!messagesHaveBeenSent) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:close-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:close-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//reopen message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:close-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:reopen-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//CLOSE WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:close-ticket-reason",/^od:close-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:close-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:close-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
export async function registerVerifyBars(){
|
||||
//CLOSE TICKET VERIFYBAR
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:close-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:close-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:close-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:close-ticket"]["origin"],"slash"|"text"|"autoclose">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"close")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//close with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "reopen-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/close")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketOpen = await actionUtils.replyTicketMustBeOpen(instance,origin,ticket)
|
||||
if (!isTicketOpen) return cancel()
|
||||
|
||||
const messagesHaveBeenSent = await actionUtils.replyMessageMustBeSentBeforeClose(instance,origin,ticket,"close")
|
||||
if (!messagesHaveBeenSent) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start closing ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//reopen message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept"){
|
||||
//CLOSE TICKET
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//converted to close message
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"close-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//CLOSE WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:close-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//CLOSE WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:close-ticket-reason",/^od:close-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:close-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:close-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:close-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"close")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/close")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketOpen = await actionUtils.replyTicketMustBeOpen(instance,origin,ticket)
|
||||
if (!isTicketOpen) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start closing ticket
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//converted to close message
|
||||
await opendiscord.actions.get("opendiscord:close-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"close-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
+206
-84
@@ -3,9 +3,11 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//DELETE COMMAND RESPONDER
|
||||
@@ -14,50 +16,27 @@ export async function registerCommandResponders(){
|
||||
new api.ODWorker("opendiscord:delete",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"delete")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when not allowed because of missing messages
|
||||
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
|
||||
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
|
||||
return cancel()
|
||||
}
|
||||
}
|
||||
const isTicketOpen = await actionUtils.replyTicketMustBeOpen(instance,origin,ticket)
|
||||
if (!isTicketOpen) return cancel()
|
||||
|
||||
const reason = instance.options.getString("reason",false)
|
||||
const withoutTranscript = instance.options.getBoolean("notranscript",false) ?? false
|
||||
const messagesHaveBeenSent = await actionUtils.replyMessageMustBeSentBeforeClose(instance,origin,ticket,"delete")
|
||||
if (!messagesHaveBeenSent) return cancel()
|
||||
|
||||
//don't allow deleteWithoutTranscript to non-global-admins when enabled
|
||||
const withoutTranscript = instance.options.getBoolean("notranscript",false) ?? false
|
||||
if (withoutTranscript && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
|
||||
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||
@@ -67,6 +46,7 @@ export async function registerCommandResponders(){
|
||||
|
||||
//start deleting ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
await opendiscord.actions.get("opendiscord:delete-ticket").run(origin,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript})
|
||||
}),
|
||||
@@ -86,65 +66,207 @@ export async function registerButtonResponders(){
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:delete-ticket",/^od:delete-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:delete-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:delete-ticket"]["origin"],"slash"|"text"|"autodelete"|"clear">
|
||||
const {guild,channel,message,user,member} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:delete-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "close-message") await opendiscord.verifybars.get("opendiscord:delete-ticket-close-message").activate(instance)
|
||||
else if (originalOrigin == "reopen-message") await opendiscord.verifybars.get("opendiscord:delete-ticket-reopen-message").activate(instance)
|
||||
else if (originalOrigin == "autoclose-message") await opendiscord.verifybars.get("opendiscord:delete-ticket-autoclose-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"delete")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/delete")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const messagesHaveBeenSent = await actionUtils.replyMessageMustBeSentBeforeClose(instance,origin,ticket,"delete")
|
||||
if (!messagesHaveBeenSent) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:delete-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:delete-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//close message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:delete-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:close-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//reopen message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:delete-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:reopen-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//autoclose message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:delete-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:autoclose-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//REOPEN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:delete-ticket-reason",/^od:delete-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:delete-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
export async function registerVerifyBars(){
|
||||
//DELETE TICKET
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:delete-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"delete")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/delete")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const messagesHaveBeenSent = await actionUtils.replyMessageMustBeSentBeforeClose(instance,origin,ticket,"delete")
|
||||
if (!messagesHaveBeenSent) return cancel()
|
||||
|
||||
//don't allow deleteWithoutTranscript to non-global-admins when enabled
|
||||
const withoutTranscript = (params.selectedButtonId == "accept-without-transcript")
|
||||
if (withoutTranscript && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
|
||||
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:delete-ticket"]["origin"],"slash"|"text"|"autodelete"|"clear">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//delete with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
//start deleting ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//close message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//reopen message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//autoclose message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:autoclose-message").build("verifybar",{guild,channel,user:originalUser,ticket}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept" || params.selectedButtonId == "accept-without-transcript"){
|
||||
//DELETE TICKET
|
||||
await instance.defer("update",false)
|
||||
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalOrigin,{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("opendiscord:for-deletion").value = true
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true,withoutTranscript})
|
||||
ticket.get("opendiscord:for-deletion").value = true //disable ticket message buttons
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "close-message"){
|
||||
await instance.defer("update",false)
|
||||
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else if (originalOrigin == "reopen-message"){
|
||||
await instance.defer("update",false)
|
||||
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else if (originalOrigin == "autoclose-message"){
|
||||
await instance.defer("update",false)
|
||||
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
|
||||
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//converted to delete message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(originalMsgType,{guild,channel,user,ticket,reason:null}))
|
||||
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//converted to delete message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(originalMsgType,{guild,channel,user,ticket,reason:null}))
|
||||
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//converted to delete message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(originalMsgType,{guild,channel,user,ticket,reason:null}))
|
||||
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//DELETE WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:delete-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//DELETE WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:delete-ticket-reason",/^od:delete-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:delete-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:delete-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:delete-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"delete")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/delete")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start deleting ticket
|
||||
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
|
||||
ticket.get("opendiscord:for-deletion").value = true //disable ticket message buttons
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//converted to delete message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
|
||||
}else if (originalMsgType == "reopen-message"){
|
||||
//converted to delete message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//converted to delete message
|
||||
opendiscord.actions.get("opendiscord:delete-ticket").run(originalMsgType,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
|
||||
}
|
||||
})
|
||||
])
|
||||
|
||||
+184
-99
@@ -3,88 +3,48 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//PIN COMMAND RESPONDER
|
||||
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:pin",generalConfig.data.prefix,"pin"))
|
||||
opendiscord.responders.commands.get("opendiscord:pin").workers.add([
|
||||
new api.ODWorker("opendiscord:permissions",1,async (instance,params,origin,cancel) => {
|
||||
const permissionMode = generalConfig.data.system.permissions.pin
|
||||
|
||||
if (permissionMode == "none"){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord: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 (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||
//no permissions
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{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 opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||
return cancel()
|
||||
}
|
||||
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
|
||||
if (!role){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(origin,{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 opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||
return cancel()
|
||||
}else return
|
||||
}
|
||||
}),
|
||||
new api.ODWorker("opendiscord:pin",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user,member} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.pin,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"pin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when already pinned
|
||||
if (ticket.get("opendiscord:pinned").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
const reason = instance.options.getString("reason",false)
|
||||
const isTicketUnpinned = await actionUtils.replyTicketMustBeUnpinned(instance,origin,ticket)
|
||||
if (!isTicketUnpinned) return cancel()
|
||||
|
||||
//start pinning ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(origin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
|
||||
//send message & set state
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"pin-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'pin' command!","info",[
|
||||
@@ -102,50 +62,175 @@ export async function registerButtonResponders(){
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:pin-ticket",/^od:pin-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:pin-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:pin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:pin-ticket"]["origin"],"slash"|"text">
|
||||
const {guild,channel,user,message} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:pin-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "unpin-message") await opendiscord.verifybars.get("opendiscord:pin-ticket-unpin-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"pin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/pin")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketUnpinned = await actionUtils.replyTicketMustBeUnpinned(instance,origin,ticket)
|
||||
if (!isTicketUnpinned) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:pin-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:pin-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "unpin-message"){
|
||||
//unpin message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:pin-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:unpin-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//PIN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:pin-ticket-reason",/^od:pin-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:pin-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:pin-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:pin-ticket"]["origin"],"slash"|"text">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
export async function registerVerifyBars(){
|
||||
//PIN TICKET
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:pin-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:pin-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:pin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
//pin with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "unpin-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"pin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/pin")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketUnpinned = await actionUtils.replyTicketMustBeUnpinned(instance,origin,ticket)
|
||||
if (!isTicketUnpinned) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start pinning ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "unpin-message"){
|
||||
//unpin message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept"){
|
||||
//PIN TICKET
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "unpin-message"){
|
||||
//converted to pin message
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"pin-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//PIN WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:pin-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//PIN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:pin-ticket-reason",/^od:pin-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:pin-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:pin-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:pin-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"pin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/pin")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketUnpinned = await actionUtils.replyTicketMustBeUnpinned(instance,origin,ticket)
|
||||
if (!isTicketUnpinned) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start pinning ticket
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "unpin-message"){
|
||||
//converted to pin message
|
||||
await opendiscord.actions.get("opendiscord:pin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"pin-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
+210
-71
@@ -3,8 +3,11 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//REOPEN COMMAND RESPONDER
|
||||
@@ -13,45 +16,35 @@ export async function registerCommandResponders(){
|
||||
new api.ODWorker("opendiscord:reopen",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user,member} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.reopen,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"reopen")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when not closed
|
||||
if (!ticket.get("opendiscord:closed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
const reason = instance.options.getString("reason",false)
|
||||
const isTicketClosed = await actionUtils.replyTicketMustBeClosed(instance,origin,ticket)
|
||||
if (!isTicketClosed) return cancel()
|
||||
|
||||
//start reopening ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(origin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
|
||||
//send message & set state
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"reopen-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'reopen' command!","info",[
|
||||
@@ -69,55 +62,201 @@ export async function registerButtonResponders(){
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:reopen-ticket",/^od:reopen-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:reopen-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:reopen-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:reopen-ticket"]["origin"],"slash"|"text">
|
||||
const {guild,channel,message,user,member} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:reopen-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "close-message") await opendiscord.verifybars.get("opendiscord:reopen-ticket-close-message").activate(instance)
|
||||
else if (originalOrigin == "autoclose-message") await opendiscord.verifybars.get("opendiscord:reopen-ticket-autoclose-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"reopen")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/reopen")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketClosed = await actionUtils.replyTicketMustBeClosed(instance,origin,ticket)
|
||||
if (!isTicketClosed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:reopen-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:reopen-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//close message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:reopen-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:close-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//autoclose message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:reopen-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:autoclose-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//REOPEN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:reopen-ticket-reason",/^od:reopen-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:reopen-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:reopen-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
export async function registerVerifyBars(){
|
||||
//REOPEN TICKET
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:reopen-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:reopen-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:reopen-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:reopen-ticket"]["origin"],"slash"|"text">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"reopen")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//reopen with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "close-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else if (originalOrigin == "autoclose-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/reopen")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketClosed = await actionUtils.replyTicketMustBeClosed(instance,origin,ticket)
|
||||
if (!isTicketClosed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start reopening ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//close message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//autoclose message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:autoclose-message").build("verifybar",{guild,channel,user:originalUser,ticket}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept"){
|
||||
//REOPEN TICKET
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//converted to reopen message
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"reopen-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//converted to reopen message
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"reopen-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//REOPEN WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:reopen-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//REOPEN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:reopen-ticket-reason",/^od:reopen-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:reopen-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:reopen-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:reopen-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"reopen")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/reopen")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketClosed = await actionUtils.replyTicketMustBeClosed(instance,origin,ticket)
|
||||
if (!isTicketClosed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start reopening ticket
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "close-message"){
|
||||
//converted to reopen message
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"reopen-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}else if (originalMsgType == "autoclose-message"){
|
||||
//converted to reopen message
|
||||
await opendiscord.actions.get("opendiscord:reopen-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"reopen-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
+183
-65
@@ -3,8 +3,11 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//UNCLAIM COMMAND RESPONDER
|
||||
@@ -13,45 +16,35 @@ export async function registerCommandResponders(){
|
||||
new api.ODWorker("opendiscord:unclaim",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.unclaim,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unclaim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/Server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when not claimed
|
||||
if (!ticket.get("opendiscord:claimed").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
|
||||
const reason = instance.options.getString("reason",false)
|
||||
const isTicketClaimed = await actionUtils.replyTicketMustBeClaimed(instance,origin,ticket)
|
||||
if (!isTicketClaimed) return cancel()
|
||||
|
||||
//start unclaiming ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(origin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
|
||||
//send message & set state
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"unclaim-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'unclaim' command!","info",[
|
||||
@@ -69,48 +62,173 @@ export async function registerButtonResponders(){
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:unclaim-ticket",/^od:unclaim-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:unclaim-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:unclaim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:unclaim-ticket"]["origin"],"slash"|"text">
|
||||
const {guild,channel,user,message} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:unclaim-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "claim-message") await opendiscord.verifybars.get("opendiscord:unclaim-ticket-claim-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unclaim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/unclaim")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketClaimed = await actionUtils.replyTicketMustBeClaimed(instance,origin,ticket)
|
||||
if (!isTicketClaimed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:unclaim-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:unclaim-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "claim-message"){
|
||||
//claim message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:unclaim-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:claim-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//UNCLAIM WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:unclaim-ticket-reason",/^od:unclaim-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:unclaim-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:unclaim-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
export async function registerVerifyBars(){
|
||||
//UNCLAIM TICKET
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:unclaim-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:unclaim-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:unclaim-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:unclaim-ticket"]["origin"],"slash"|"text">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unclaim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//unclaim with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/unclaim")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketClaimed = await actionUtils.replyTicketMustBeClaimed(instance,origin,ticket)
|
||||
if (!isTicketClaimed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start unclaiming ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "claim-message"){
|
||||
//claim message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept"){
|
||||
//UNCLAIM TICKET
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "claim-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "claim-message"){
|
||||
//converted to unclaim message
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"unclaim-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//UNCLAIM WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:unclaim-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//UNCLAIM WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:unclaim-ticket-reason",/^od:unclaim-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:unclaim-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:unclaim-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:unclaim-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unclaim")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/unclaim")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketClaimed = await actionUtils.replyTicketMustBeClaimed(instance,origin,ticket)
|
||||
if (!isTicketClaimed) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start claiming ticket
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "claim-message"){
|
||||
//converted to unclaim message
|
||||
await opendiscord.actions.get("opendiscord:unclaim-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"unclaim-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
})
|
||||
])
|
||||
|
||||
+184
-66
@@ -3,8 +3,11 @@
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
import * as actionUtils from "../actions/utilities.js"
|
||||
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
const lang = opendiscord.languages
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
export async function registerCommandResponders(){
|
||||
//UNPIN COMMAND RESPONDER
|
||||
@@ -13,45 +16,35 @@ export async function registerCommandResponders(){
|
||||
new api.ODWorker("opendiscord:unpin",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild} = instance
|
||||
|
||||
//check permissions
|
||||
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.unpin,"support",user,member,channel,guild)
|
||||
if (!permsResult.hasPerms){
|
||||
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(origin,{guild,channel,user,permissions:["support"]}))
|
||||
return cancel()
|
||||
}
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unpin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//check is in guild/Server
|
||||
if (!guild){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
//check if ticket exists
|
||||
const ticket = opendiscord.tickets.get(channel.id)
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
//return when not pinned yet
|
||||
if (!ticket.get("opendiscord:pinned").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
|
||||
return cancel()
|
||||
}
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
//return when busy
|
||||
if (ticket.get("opendiscord:busy").value){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
|
||||
return cancel()
|
||||
}
|
||||
const isTicketPinned = await actionUtils.replyTicketMustBePinned(instance,origin,ticket)
|
||||
if (!isTicketPinned) return cancel()
|
||||
|
||||
const reason = instance.options.getString("reason",false)
|
||||
|
||||
//start unpinning ticket
|
||||
//start unpining ticket
|
||||
await instance.defer(false)
|
||||
const reason = instance.options.getString("reason",false)
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(origin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
|
||||
//send message & set state
|
||||
const sentMsg = await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build(origin,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"unpin-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}),
|
||||
new api.ODWorker("opendiscord:logs",-1,(instance,params,origin,cancel) => {
|
||||
opendiscord.log(instance.user.displayName+" used the 'unpin' command!","info",[
|
||||
@@ -69,48 +62,173 @@ export async function registerButtonResponders(){
|
||||
opendiscord.responders.buttons.add(new api.ODButtonResponder("opendiscord:unpin-ticket",/^od:unpin-ticket/))
|
||||
opendiscord.responders.buttons.get("opendiscord:unpin-ticket").workers.add(
|
||||
new api.ODWorker("opendiscord:unpin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const originalOrigin = instance.interaction.customId.split("_")[1] as Exclude<api.ODActionManagerIdMappings["opendiscord:unpin-ticket"]["origin"],"slash"|"text">
|
||||
const {guild,channel,user,message} = instance
|
||||
|
||||
if (originalOrigin == "ticket-message") await opendiscord.verifybars.get("opendiscord:unpin-ticket-ticket-message").activate(instance)
|
||||
else if (originalOrigin == "pin-message") await opendiscord.verifybars.get("opendiscord:unpin-ticket-pin-message").activate(instance)
|
||||
else await instance.defer("update",false)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unpin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/unpin")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketPinned = await actionUtils.replyTicketMustBePinned(instance,origin,ticket)
|
||||
if (!isTicketPinned) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const verifybar = opendiscord.verifybars.get("opendiscord:unpin-ticket")
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//send verifybar
|
||||
if (generalConfig.data.system.disableVerifyBars){
|
||||
//verifybar disabled, directly run response
|
||||
await verifybar.activate(instance,"accept")
|
||||
|
||||
}else if (originalMsgType == "ticket-message"){
|
||||
//ticket message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:unpin-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:ticket-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "pin-message"){
|
||||
//pin message verifybar
|
||||
const modifiedMsg = opendiscord.components.modifiers.get("opendiscord:unpin-ticket-verifybar").modify(opendiscord.builders.messages.getSafe("opendiscord:pin-message"),originalMsgType,{guild,channel,user,verifybar})
|
||||
await instance.update(await modifiedMsg.build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//UNPIN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:unpin-ticket-reason",/^od:unpin-ticket-reason_/))
|
||||
opendiscord.responders.modals.get("opendiscord:unpin-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:unpin-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,channel,user} = instance
|
||||
if (!channel) return
|
||||
if (!guild){
|
||||
//error
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(origin,{channel,user:instance.user}))
|
||||
return cancel()
|
||||
}
|
||||
const ticket = opendiscord.tickets.get(instance.interaction.customId.split("_")[1])
|
||||
if (!ticket || channel.isDMBased()){
|
||||
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||
return
|
||||
}
|
||||
export async function registerVerifyBars(){
|
||||
//UNPIN TICKET
|
||||
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:unpin-ticket"))
|
||||
opendiscord.verifybars.get("opendiscord:unpin-ticket").workers.add([
|
||||
new api.ODWorker("opendiscord:unpin-ticket",0,async (instance,params,origin,cancel) => {
|
||||
const {user,member,channel,guild,message} = instance
|
||||
|
||||
const originalOrigin = instance.interaction.customId.split("_")[2] as Exclude<api.ODActionManagerIdMappings["opendiscord:unpin-ticket"]["origin"],"slash"|"text">
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unpin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
//unpin with reason
|
||||
if (originalOrigin == "ticket-message"){
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/unpin")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketPinned = await actionUtils.replyTicketMustBePinned(instance,origin,ticket)
|
||||
if (!isTicketPinned) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const originalUser = ((state.data.messageAuthor) ? await opendiscord.client.fetchUser(state.data.messageAuthor) : user) ?? user
|
||||
const originalReason = state.data.messageReason ?? null
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start unpinning ticket
|
||||
if (params.selectedButtonId == "cancel"){
|
||||
//CANCEL
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "pin-message"){
|
||||
//pin message
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build("verifybar",{guild,channel,user:originalUser,ticket,reason:originalReason}))
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept"){
|
||||
//UNPIN TICKET
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
}else if (originalOrigin == "pin-message"){
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||
}else{
|
||||
await instance.defer("update",false)
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalOrigin,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("verifybar",{guild,channel,user,ticket}))
|
||||
}else if (originalMsgType == "pin-message"){
|
||||
//converted to unpin message
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build("verifybar",{guild,channel,user,ticket,reason:null}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"unpin-message",
|
||||
messageOrigin:origin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:null
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
}else if (params.selectedButtonId == "accept-with-reason"){
|
||||
//UNPIN WITH REASON (MODAL)
|
||||
instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:unpin-ticket-reason").build("other",{guild,channel,user,ticket,message}))
|
||||
}
|
||||
})
|
||||
])
|
||||
}
|
||||
|
||||
export async function registerModalResponders(){
|
||||
//UNPIN WITH REASON MODAL RESPONDER
|
||||
opendiscord.responders.modals.add(new api.ODModalResponder("opendiscord:unpin-ticket-reason",/^od:unpin-ticket-reason\|([^|]+)\|([^|]+)/))
|
||||
opendiscord.responders.modals.get("opendiscord:unpin-ticket-reason").workers.add([
|
||||
new api.ODWorker("opendiscord:unpin-ticket-reason",0,async (instance,params,origin,cancel) => {
|
||||
const {guild,user} = instance
|
||||
|
||||
const match = /^od:unpin-ticket-reason\|([^|]+)\|([^|]+)/.exec(instance.interaction.customId)
|
||||
if (!match) return cancel()
|
||||
const channel = await opendiscord.client.fetchTextChannel(match[1])
|
||||
const message = await opendiscord.client.fetchChannelMessage(match[1],match[2])
|
||||
|
||||
//responder checks
|
||||
const hasPerms = await actionUtils.replyHasPermissions(instance,origin,"unpin")
|
||||
if (!hasPerms) return cancel()
|
||||
|
||||
const isInGuild = await actionUtils.replyIsInGuild(instance,origin)
|
||||
if (!isInGuild || !guild || !channel || channel.isDMBased()) return cancel()
|
||||
|
||||
const state = await actionUtils.replyInteractiveMessageState(instance,origin,channel,message,"/unpin")
|
||||
if (!state) return cancel()
|
||||
|
||||
const ticket = await actionUtils.replyIsTicket(instance,origin)
|
||||
if (!ticket) return cancel()
|
||||
|
||||
const isAvailable = await actionUtils.replyTicketIsAvailable(instance,origin,ticket)
|
||||
if (!isAvailable) return cancel()
|
||||
|
||||
const isTicketPinned = await actionUtils.replyTicketMustBePinned(instance,origin,ticket)
|
||||
if (!isTicketPinned) return cancel()
|
||||
|
||||
//fetch state details
|
||||
const reason = instance.values.getTextField("reason",true)
|
||||
const originalMsgOrigin = state.data.messageOrigin
|
||||
const originalMsgType = state.data.messageType
|
||||
|
||||
//start pinning ticket
|
||||
await instance.defer("update",false)
|
||||
|
||||
if (originalMsgType == "ticket-message"){
|
||||
//ticket message
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||
await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||
|
||||
}else if (originalMsgType == "pin-message"){
|
||||
//converted to unpin message
|
||||
await opendiscord.actions.get("opendiscord:unpin-ticket").run(originalMsgType,{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||
const sentMsg = await instance.update(await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build(originalMsgType,{guild,channel,user,ticket,reason}))
|
||||
if (sentMsg.success) await interactiveMsgState.setMsgState({channel,message:sentMsg.message},{
|
||||
messageType:"unpin-message",
|
||||
messageOrigin:originalMsgOrigin,
|
||||
messageAuthor:user.id,
|
||||
messageReason:reason
|
||||
},sentMsg.ephemeral)
|
||||
}
|
||||
})
|
||||
])
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
///////////////////////////////////////
|
||||
//VERIFYBAR MESSAGE MODIFIERS
|
||||
///////////////////////////////////////
|
||||
import {opendiscord, api, utilities} from "../index.js"
|
||||
import * as discord from "discord.js"
|
||||
|
||||
const modifiers = opendiscord.components.modifiers
|
||||
const lang = opendiscord.languages
|
||||
const generalConfig = opendiscord.configs.get("opendiscord:general")
|
||||
|
||||
export async function addVerifyButton(instance:api.ODMessageInstance|api.ODComponentFactoryInstance<api.ODMessageComponent>,params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},buttonStyle:"✅"|"❌",verifyButtonId:string,customLabel?:string,customColor?:api.ODValidButtonColor,customEmoji?:string){
|
||||
const {guild,channel,user,verifybar} = params
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
//message builders
|
||||
instance.addComponent(await opendiscord.builders.buttons.getSafe("opendiscord:verifybar-button").build("verifybar",{
|
||||
guild,channel,user,verifybar,
|
||||
buttonStyle,customColor,customEmoji,customLabel,
|
||||
verifyButtonId
|
||||
}))
|
||||
}else{
|
||||
//message components
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers addVerifyButton() => verifybar doesn't support ODComponents v2 yet!")
|
||||
//const message = instance.getComponent()
|
||||
//if (!message) return
|
||||
//const actionRow: api.ODActionRowComponent|null = message.getComponentsOfType("action-row")[0]
|
||||
//if (actionRow) actionRow.addComponent(new api.ODButtonComponent("opendiscord:verifybar-button",{
|
||||
// //TODO
|
||||
//}),"end")
|
||||
}
|
||||
}
|
||||
|
||||
export async function registerAllVerifyBarModifiers(){
|
||||
//CLOSE TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:close-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:close-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:close-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or close with reason
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
}))
|
||||
|
||||
//REOPEN TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:reopen-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:reopen-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:reopen-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or reopen with reason
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
}))
|
||||
|
||||
//DELETE TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:delete-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:delete-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:delete-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or delete with reason or without transcript
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
if (generalConfig.data.system.enableDeleteWithoutTranscript) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithoutTranscript,lang.getTranslation("actions.buttons.withoutTranscript"),"red","📄")
|
||||
}))
|
||||
|
||||
//CLAIM TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:claim-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:claim-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:claim-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or claim with reason
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
}))
|
||||
|
||||
//UNCLAIM TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:unclaim-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:unclaim-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:unclaim-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or unclaim with reason
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
}))
|
||||
|
||||
//PIN TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:pin-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:pin-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:pin-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or pin with reason
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
}))
|
||||
|
||||
//UNPIN TICKET VERIFYBAR
|
||||
modifiers.add(new api.ODMessageComponentModifier("opendiscord:unpin-ticket-verifybar"))
|
||||
modifiers.get("opendiscord:unpin-ticket-verifybar").workers.add(new api.ODWorker("opendiscord:unpin-ticket-verifybar",100,async (instance,params,origin,cancel) => {
|
||||
if (instance instanceof api.ODMessageInstance){
|
||||
instance.data.components = [] //clear actionrow
|
||||
}else{
|
||||
throw new api.ODSystemError("registerAllVerifyBarModifiers()... => verifybars don't support ODComponents v2 yet!")
|
||||
}
|
||||
|
||||
//cancel, accept or unpin with reason
|
||||
await addVerifyButton(instance,params,"❌",api.ODVerifyButtonId.Cancel)
|
||||
await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.Accept)
|
||||
if (generalConfig.data.system.enableTicketActionWithReason) await addVerifyButton(instance,params,"✅",api.ODVerifyButtonId.AcceptWithReason,lang.getTranslation("actions.buttons.withReason"),"blue","✏️")
|
||||
}))
|
||||
}
|
||||
@@ -16,8 +16,7 @@ import * as discord from "discord.js"
|
||||
* It's used to generate typescript declarations for this class.
|
||||
*/
|
||||
export interface ODButtonManagerIdMappings extends api.ODButtonManagerIdConstraint {
|
||||
"opendiscord:verifybar-success":{origin:"verifybar"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,customData?:string,customColor?:api.ODValidButtonColor,customLabel?:string,customEmoji?:string},workers:"opendiscord:verifybar-success"},
|
||||
"opendiscord:verifybar-failure":{origin:"verifybar"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,customData?:string,customColor?:api.ODValidButtonColor,customLabel?:string,customEmoji?:string},workers:"opendiscord:verifybar-failure"},
|
||||
"opendiscord:verifybar-button":{origin:"verifybar"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>,verifyButtonId:string,buttonStyle:"✅"|"❌",customLabel?:string,customColor?:api.ODValidButtonColor,customEmoji?:string},workers:"opendiscord:verifybar-button"},
|
||||
|
||||
"opendiscord:error-ticket-deprecated-transcript":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{},workers:"opendiscord:error-ticket-deprecated-transcript"},
|
||||
|
||||
@@ -44,7 +43,7 @@ export interface ODButtonManagerIdMappings extends api.ODButtonManagerIdConstrai
|
||||
"opendiscord:transcript-error-retry":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,reason:string|null},workers:"opendiscord:transcript-error-retry"},
|
||||
"opendiscord:transcript-error-continue":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any,object|null>,reason:string|null},workers:"opendiscord:transcript-error-continue"},
|
||||
|
||||
"opendiscord:clear-continue":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-continue"},
|
||||
"opendiscord:clear-continue":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[],inProgress:boolean},workers:"opendiscord:clear-continue"},
|
||||
}
|
||||
|
||||
/**## ODDropdownManagerIdMappings `interface`
|
||||
@@ -97,14 +96,14 @@ export interface ODEmbedManagerIdMappings extends api.ODEmbedManagerIdConstraint
|
||||
"opendiscord:ticket-created":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-created"},
|
||||
"opendiscord:ticket-created-dm":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-created-dm"},
|
||||
"opendiscord:ticket-created-logs":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-created-logs"},
|
||||
"opendiscord:ticket-message":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-message"},
|
||||
"opendiscord:close-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:close-message"},
|
||||
"opendiscord:reopen-message":{origin:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:reopen-message"},
|
||||
"opendiscord:delete-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:delete-message"},
|
||||
"opendiscord:claim-message":{origin:"slash"|"text"|"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:claim-message"},
|
||||
"opendiscord:unclaim-message":{origin:"slash"|"text"|"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unclaim-message"},
|
||||
"opendiscord:pin-message":{origin:"slash"|"text"|"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:pin-message"},
|
||||
"opendiscord:unpin-message":{origin:"slash"|"text"|"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unpin-message"},
|
||||
"opendiscord:ticket-message":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-message"},
|
||||
"opendiscord:close-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:close-message"},
|
||||
"opendiscord:reopen-message":{origin:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:reopen-message"},
|
||||
"opendiscord:delete-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:delete-message"},
|
||||
"opendiscord:claim-message":{origin:"slash"|"text"|"ticket-message"|"unclaim-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:claim-message"},
|
||||
"opendiscord:unclaim-message":{origin:"slash"|"text"|"ticket-message"|"claim-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unclaim-message"},
|
||||
"opendiscord:pin-message":{origin:"slash"|"text"|"ticket-message"|"unpin-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:pin-message"},
|
||||
"opendiscord:unpin-message":{origin:"slash"|"text"|"ticket-message"|"pin-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unpin-message"},
|
||||
"opendiscord:rename-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:string},workers:"opendiscord:rename-message"},
|
||||
"opendiscord:move-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:ODTicketOption},workers:"opendiscord:move-message"},
|
||||
"opendiscord:add-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:discord.User},workers:"opendiscord:add-message"},
|
||||
@@ -128,11 +127,11 @@ export interface ODEmbedManagerIdMappings extends api.ODEmbedManagerIdConstraint
|
||||
"opendiscord:reaction-role-dm":{origin:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role-dm"},
|
||||
"opendiscord:reaction-role-logs":{origin:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role-logs"},
|
||||
|
||||
"opendiscord:clear-verify-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-verify-message"},
|
||||
"opendiscord:clear-verify-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[],inProgress:boolean},workers:"opendiscord:clear-verify-message"},
|
||||
"opendiscord:clear-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-message"},
|
||||
"opendiscord:clear-logs":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-logs"},
|
||||
|
||||
"opendiscord:autoclose-message":{origin:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:autoclose-message"},
|
||||
"opendiscord:autoclose-message":{origin:"timeout"|"leave"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:autoclose-message"},
|
||||
"opendiscord:autodelete-message":{origin:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:autodelete-message"},
|
||||
"opendiscord:autoclose-enable":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"opendiscord:autoclose-enable"},
|
||||
"opendiscord:autodelete-enable":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"opendiscord:autodelete-enable"},
|
||||
@@ -150,15 +149,6 @@ export interface ODEmbedManagerIdMappings extends api.ODEmbedManagerIdConstraint
|
||||
* It's used to generate typescript declarations for this class.
|
||||
*/
|
||||
export interface ODMessageManagerIdMappings extends api.ODMessageManagerIdConstraint {
|
||||
"opendiscord:verifybar-ticket-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-ticket-message"},
|
||||
"opendiscord:verifybar-close-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-close-message"},
|
||||
"opendiscord:verifybar-reopen-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-reopen-message"},
|
||||
"opendiscord:verifybar-claim-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-claim-message"},
|
||||
"opendiscord:verifybar-unclaim-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-unclaim-message"},
|
||||
"opendiscord:verifybar-pin-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-pin-message"},
|
||||
"opendiscord:verifybar-unpin-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-unpin-message"}
|
||||
"opendiscord:verifybar-autoclose-message":{origin:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"opendiscord:verifybar-autoclose-message"}
|
||||
|
||||
"opendiscord:error":{origin:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:string,layout:"simple"|"advanced",customTitle?:string},workers:"opendiscord:error"},
|
||||
"opendiscord:error-option-missing":{origin:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:api.ODTextCommandErrorMissingOption},workers:"opendiscord:error-option-missing"},
|
||||
"opendiscord:error-option-invalid":{origin:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:api.ODTextCommandErrorInvalidOption},workers:"opendiscord:error-option-invalid"},
|
||||
@@ -190,14 +180,14 @@ export interface ODMessageManagerIdMappings extends api.ODMessageManagerIdConstr
|
||||
"opendiscord:ticket-created":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-created"},
|
||||
"opendiscord:ticket-created-dm":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-created-dm"},
|
||||
"opendiscord:ticket-created-logs":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-created-logs"},
|
||||
"opendiscord:ticket-message":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-message-layout"|"opendiscord:ticket-message-components"|"opendiscord:ticket-message-disable-components"},
|
||||
"opendiscord:close-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:close-message"},
|
||||
"opendiscord:reopen-message":{origin:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:reopen-message"},
|
||||
"opendiscord:delete-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:delete-message"},
|
||||
"opendiscord:claim-message":{origin:"slash"|"text"|"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:claim-message"},
|
||||
"opendiscord:unclaim-message":{origin:"slash"|"text"|"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unclaim-message"},
|
||||
"opendiscord:pin-message":{origin:"slash"|"text"|"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:pin-message"},
|
||||
"opendiscord:unpin-message":{origin:"slash"|"text"|"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unpin-message"},
|
||||
"opendiscord:ticket-message":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:ticket-message-layout"|"opendiscord:ticket-message-components"|"opendiscord:ticket-message-disable-components"},
|
||||
"opendiscord:close-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:close-message"},
|
||||
"opendiscord:reopen-message":{origin:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:reopen-message"},
|
||||
"opendiscord:delete-message":{origin:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:delete-message"},
|
||||
"opendiscord:claim-message":{origin:"slash"|"text"|"ticket-message"|"unclaim-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:claim-message"},
|
||||
"opendiscord:unclaim-message":{origin:"slash"|"text"|"ticket-message"|"claim-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unclaim-message"},
|
||||
"opendiscord:pin-message":{origin:"slash"|"text"|"ticket-message"|"unpin-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:pin-message"},
|
||||
"opendiscord:unpin-message":{origin:"slash"|"text"|"ticket-message"|"pin-message"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"opendiscord:unpin-message"},
|
||||
"opendiscord:rename-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:string},workers:"opendiscord:rename-message"},
|
||||
"opendiscord:move-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:ODTicketOption},workers:"opendiscord:move-message"},
|
||||
"opendiscord:add-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:discord.User},workers:"opendiscord:add-message"},
|
||||
@@ -221,11 +211,11 @@ export interface ODMessageManagerIdMappings extends api.ODMessageManagerIdConstr
|
||||
"opendiscord:reaction-role-dm":{origin:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role-dm"},
|
||||
"opendiscord:reaction-role-logs":{origin:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:ODRoleUpdateResult[]},workers:"opendiscord:reaction-role-logs"},
|
||||
|
||||
"opendiscord:clear-verify-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-verify-message"},
|
||||
"opendiscord:clear-verify-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[],inProgress:boolean},workers:"opendiscord:clear-verify-message"},
|
||||
"opendiscord:clear-message":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-message"},
|
||||
"opendiscord:clear-logs":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"opendiscord:clear-logs"},
|
||||
|
||||
"opendiscord:autoclose-message":{origin:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:autoclose-message"},
|
||||
"opendiscord:autoclose-message":{origin:"timeout"|"leave"|"verifybar"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:autoclose-message"},
|
||||
"opendiscord:autodelete-message":{origin:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:autodelete-message"},
|
||||
"opendiscord:autoclose-enable":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"opendiscord:autoclose-enable"},
|
||||
"opendiscord:autodelete-enable":{origin:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"opendiscord:autodelete-enable"},
|
||||
@@ -244,13 +234,13 @@ export interface ODMessageManagerIdMappings extends api.ODMessageManagerIdConstr
|
||||
*/
|
||||
export interface ODModalManagerIdMappings extends api.ODModalManagerIdConstraint {
|
||||
"opendiscord:ticket-questions":{origin:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,option:ODTicketOption},workers:"opendiscord:ticket-questions"}
|
||||
"opendiscord:close-ticket-reason":{origin:"ticket-message"|"reopen-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:close-ticket-reason"}
|
||||
"opendiscord:reopen-ticket-reason":{origin:"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:reopen-ticket-reason"}
|
||||
"opendiscord:delete-ticket-reason":{origin:"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:delete-ticket-reason"}
|
||||
"opendiscord:claim-ticket-reason":{origin:"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:claim-ticket-reason"}
|
||||
"opendiscord:unclaim-ticket-reason":{origin:"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:unclaim-ticket-reason"}
|
||||
"opendiscord:pin-ticket-reason":{origin:"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:pin-ticket-reason"}
|
||||
"opendiscord:unpin-ticket-reason":{origin:"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"opendiscord:unpin-ticket-reason"}
|
||||
"opendiscord:close-ticket-reason":{origin:"ticket-message"|"reopen-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:close-ticket-reason"}
|
||||
"opendiscord:reopen-ticket-reason":{origin:"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:reopen-ticket-reason"}
|
||||
"opendiscord:delete-ticket-reason":{origin:"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:delete-ticket-reason"}
|
||||
"opendiscord:claim-ticket-reason":{origin:"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:claim-ticket-reason"}
|
||||
"opendiscord:unclaim-ticket-reason":{origin:"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:unclaim-ticket-reason"}
|
||||
"opendiscord:pin-ticket-reason":{origin:"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:pin-ticket-reason"}
|
||||
"opendiscord:unpin-ticket-reason":{origin:"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,message:discord.Message},workers:"opendiscord:unpin-ticket-reason"}
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
|
||||
@@ -33,7 +33,13 @@ export interface ODModalComponentManagerIdMappings extends api.ODComponentManage
|
||||
* It's used to generate typescript declarations for this class.
|
||||
*/
|
||||
export interface ODComponentModifierManagerIdMappings extends api.ODComponentModifierManagerIdConstraint {
|
||||
//"opendiscord:example-modifier":api.ODMessageComponentModifier<string,{}>,
|
||||
"opendiscord:close-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"reopen-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
"opendiscord:reopen-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"close-message"|"autoclose-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
"opendiscord:delete-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"close-message"|"autoclose-message"|"reopen-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
"opendiscord:claim-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"unclaim-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
"opendiscord:unclaim-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"claim-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
"opendiscord:pin-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"unpin-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
"opendiscord:unpin-ticket-verifybar":api.ODMessageComponentModifier<"ticket-message"|"pin-message",{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:api.ODVerifyBar<string>},string>,
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
|
||||
@@ -40,8 +40,7 @@ export interface ODCommandResponderManagerIdMappings extends api.ODCommandRespon
|
||||
* It's used to generate typescript declarations for this class.
|
||||
*/
|
||||
export interface ODButtonResponderManagerIdMappings extends api.ODButtonResponderManagerIdConstraint {
|
||||
"opendiscord:verifybar-success":{origin:"button",params:{},workers:"opendiscord:handle-verifybar"},
|
||||
"opendiscord:verifybar-failure":{origin:"button",params:{},workers:"opendiscord:handle-verifybar"},
|
||||
"opendiscord:verifybar-button":{origin:"button",params:{},workers:"opendiscord:verifybar-button"},
|
||||
|
||||
"opendiscord:help-menu-switch":{origin:"button",params:{},workers:"opendiscord:update-help-menu"},
|
||||
"opendiscord:help-menu-previous":{origin:"button",params:{},workers:"opendiscord:update-help-menu"},
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
///////////////////////////////////////
|
||||
import * as api from "@open-discord-bots/framework/api"
|
||||
import * as discord from "discord.js"
|
||||
import { ODTicketClearFilter } from "../api/ticket.js"
|
||||
|
||||
/**## ODStateManagerIdMappings `interface`
|
||||
* A list of all available IDs in the default `ODStateManager` class in `opendiscord`.
|
||||
@@ -10,6 +11,7 @@ import * as discord from "discord.js"
|
||||
*/
|
||||
export interface ODStateManagerIdMappings extends api.ODStateManagerIdConstraint {
|
||||
"opendiscord:interactive-message":ODInteractiveMessageState,
|
||||
"opendiscord:clear-message":ODClearMessageState,
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
@@ -35,4 +37,26 @@ export class ODInteractiveMessageState extends api.ODState<{
|
||||
messageAuthor?:string,
|
||||
/**Additional data of this interactive message. */
|
||||
messageExtraData?:any,
|
||||
},false,false> {}
|
||||
},false,false> {
|
||||
constructor(id:api.ODValidId,client:api.ODClientManager,database:api.ODDatabase){
|
||||
super(id,client,database,{})
|
||||
}
|
||||
}
|
||||
|
||||
/**## ODClearMessageState `class
|
||||
* A special class with state types for the Open Ticket clear tickets message.
|
||||
*/
|
||||
export class ODClearMessageState extends api.ODState<{
|
||||
/**The method this message was generated with. */
|
||||
messageOrigin:"slash"|"text"|"other",
|
||||
/**The clear filters. */
|
||||
clearFilter:ODTicketClearFilter,
|
||||
/**The list of ticket channel names (e.g. `#ticket-1`) to be cleared. */
|
||||
clearChannelNameList:string[]
|
||||
},false,true> {
|
||||
constructor(id:api.ODValidId,client:api.ODClientManager,database:api.ODDatabase){
|
||||
super(id,client,database,{
|
||||
autodeleteOnRestart:true
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ import * as api from "@open-discord-bots/framework/api"
|
||||
export interface ODVerifyBarManagerIdMappings extends api.ODVerifyBarManagerIdConstraint {
|
||||
"opendiscord:close-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason","opendiscord:close-ticket">,
|
||||
"opendiscord:reopen-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason","opendiscord:reopen-ticket">,
|
||||
"opendiscord:delete-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason","opendiscord:delete-ticket">,
|
||||
"opendiscord:delete-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason"|"accept-without-transcript","opendiscord:delete-ticket">,
|
||||
"opendiscord:claim-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason","opendiscord:claim-ticket">,
|
||||
"opendiscord:unclaim-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason","opendiscord:unclaim-ticket">,
|
||||
"opendiscord:pin-ticket":api.ODVerifyBar<"accept"|"cancel"|"accept-with-reason","opendiscord:pin-ticket">,
|
||||
|
||||
@@ -381,6 +381,8 @@ export async function loadDatabaseSaversCode(){
|
||||
}
|
||||
|
||||
const loadAutoCode = () => {
|
||||
const interactiveMsgState = opendiscord.states.get("opendiscord:interactive-message")
|
||||
|
||||
//AUTOCLOSE TIMEOUT
|
||||
opendiscord.code.add(new api.ODCode("opendiscord:autoclose-timeout",3,() => {
|
||||
setInterval(async () => {
|
||||
@@ -399,7 +401,13 @@ const loadAutoCode = () => {
|
||||
if (enabled && (new Date().getTime() - lastMessage.createdTimestamp) >= time){
|
||||
//autoclose ticket
|
||||
await opendiscord.actions.get("opendiscord: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("opendiscord:autoclose-message").build("timeout",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:autoclose-message").build("timeout",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
|
||||
await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"autoclose-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:opendiscord.client.client.user.id,
|
||||
messageReason:"Autoclose"
|
||||
},false)
|
||||
count++
|
||||
await opendiscord.statistics.get("opendiscord:global").setStat("opendiscord:tickets-autoclosed",1,"increase")
|
||||
}
|
||||
@@ -426,7 +434,13 @@ const loadAutoCode = () => {
|
||||
if (enabled){
|
||||
//autoclose ticket
|
||||
await opendiscord.actions.get("opendiscord: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("opendiscord:autoclose-message").build("leave",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
|
||||
const sentMsg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:autoclose-message").build("leave",{guild:channel.guild,channel,user:opendiscord.client.client.user,ticket})).message)
|
||||
await interactiveMsgState.setMsgState({channel,message:sentMsg},{
|
||||
messageType:"autoclose-message",
|
||||
messageOrigin:"other",
|
||||
messageAuthor:opendiscord.client.client.user.id,
|
||||
messageReason:"Autoclose"
|
||||
},false)
|
||||
await opendiscord.statistics.get("opendiscord:global").setStat("opendiscord:tickets-autoclosed",1,"increase")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,5 +3,6 @@ import {opendiscord, api, utilities} from "../../index.js"
|
||||
export async function loadAllStates(){
|
||||
const stateDatabase = opendiscord.databases.get("opendiscord:message-states")
|
||||
|
||||
opendiscord.states.add(new api.ODInteractiveMessageState("opendiscord:interactive-message",opendiscord.client,stateDatabase,{}))
|
||||
opendiscord.states.add(new api.ODInteractiveMessageState("opendiscord:interactive-message",opendiscord.client,stateDatabase))
|
||||
opendiscord.states.add(new api.ODClearMessageState("opendiscord:clear-message",opendiscord.client,stateDatabase))
|
||||
}
|
||||
+8
-8
@@ -676,7 +676,7 @@ const main = async () => {
|
||||
//load component modifiers
|
||||
opendiscord.log("Loading component modifiers...","system")
|
||||
if (opendiscord.sharedFuses.getFuse("componentModifiersLoading")){
|
||||
//TODO!!
|
||||
await (await import("./components/verifybarModifiers.js")).registerAllVerifyBarModifiers()
|
||||
}
|
||||
await opendiscord.events.get("onComponentModifierLoad").emit([opendiscord.components.modifiers,opendiscord.components.messages,opendiscord.builders.messages])
|
||||
await opendiscord.events.get("afterComponentModifiersLoaded").emit([opendiscord.components.modifiers,opendiscord.components.messages,opendiscord.builders.messages])
|
||||
@@ -806,13 +806,13 @@ const main = async () => {
|
||||
//load verifybars
|
||||
opendiscord.log("Loading verifybars...","system")
|
||||
if (opendiscord.sharedFuses.getFuse("verifyBarsLoading")){
|
||||
await (await import("./actions/closeTicket.js")).registerVerifyBars()
|
||||
await (await import("./actions/deleteTicket.js")).registerVerifyBars()
|
||||
await (await import("./actions/reopenTicket.js")).registerVerifyBars()
|
||||
await (await import("./actions/claimTicket.js")).registerVerifyBars()
|
||||
await (await import("./actions/unclaimTicket.js")).registerVerifyBars()
|
||||
await (await import("./actions/pinTicket.js")).registerVerifyBars()
|
||||
await (await import("./actions/unpinTicket.js")).registerVerifyBars()
|
||||
await (await import("./commands/close.js")).registerVerifyBars()
|
||||
await (await import("./commands/delete.js")).registerVerifyBars()
|
||||
await (await import("./commands/reopen.js")).registerVerifyBars()
|
||||
await (await import("./commands/claim.js")).registerVerifyBars()
|
||||
await (await import("./commands/unclaim.js")).registerVerifyBars()
|
||||
await (await import("./commands/pin.js")).registerVerifyBars()
|
||||
await (await import("./commands/unpin.js")).registerVerifyBars()
|
||||
}
|
||||
await opendiscord.events.get("onVerifyBarLoad").emit([opendiscord.verifybars])
|
||||
await opendiscord.events.get("afterVerifyBarsLoaded").emit([opendiscord.verifybars])
|
||||
|
||||
Reference in New Issue
Block a user