From 1f402a848e84766d9124c7ba1a9f93bed1e90bd1 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Fri, 6 Feb 2026 20:08:55 +0100 Subject: [PATCH] (v4.1.2) Massive permission system cleanup --- src/actions/closeTicket.ts | 104 +++++---------- src/actions/deleteTicket.ts | 202 +++++++++-------------------- src/commands/add.ts | 48 ++----- src/commands/autoclose.ts | 51 +++----- src/commands/autodelete.ts | 49 +++---- src/commands/blacklist.ts | 49 ++----- src/commands/claim.ts | 49 +++---- src/commands/clear.ts | 46 ++----- src/commands/close.ts | 57 +++----- src/commands/delete.ts | 51 +++----- src/commands/help.ts | 50 ++----- src/commands/move.ts | 47 ++----- src/commands/panel.ts | 52 ++------ src/commands/pin.ts | 16 ++- src/commands/priority.ts | 49 +++---- src/commands/remove.ts | 48 ++----- src/commands/rename.ts | 48 ++----- src/commands/reopen.ts | 49 +++---- src/commands/role.ts | 5 +- src/commands/stats.ts | 28 +++- src/commands/ticket.ts | 126 ++++++------------ src/commands/topic.ts | 49 +++---- src/commands/transfer.ts | 48 ++----- src/commands/unclaim.ts | 49 +++---- src/commands/unpin.ts | 49 +++---- src/core/api/modules/permission.ts | 47 +++++++ 26 files changed, 504 insertions(+), 962 deletions(-) diff --git a/src/actions/closeTicket.ts b/src/actions/closeTicket.ts index 083a903..e09bb2c 100644 --- a/src/actions/closeTicket.ts +++ b/src/actions/closeTicket.ts @@ -169,62 +169,44 @@ 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:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.close - - 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:close-ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) @@ -268,62 +250,44 @@ export const registerVerifyBars = async () => { //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:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.close - - 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:close-ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) diff --git a/src/actions/deleteTicket.ts b/src/actions/deleteTicket.ts index 07d6996..68b0d16 100644 --- a/src/actions/deleteTicket.ts +++ b/src/actions/deleteTicket.ts @@ -119,8 +119,16 @@ export const registerVerifyBars = async () => { //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:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.delete + new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,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){ @@ -130,54 +138,27 @@ export const registerVerifyBars = async () => { } } - 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:delete-ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + //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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) @@ -224,8 +205,16 @@ export const registerVerifyBars = async () => { //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:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.delete + new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,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){ @@ -235,54 +224,27 @@ export const registerVerifyBars = async () => { } } - 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:delete-ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + //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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) @@ -333,8 +295,16 @@ export const registerVerifyBars = async () => { //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:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.delete + new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,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){ @@ -344,54 +314,26 @@ export const registerVerifyBars = async () => { } } - 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:delete-ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + //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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) @@ -442,8 +384,16 @@ export const registerVerifyBars = async () => { //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:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.delete + new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,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){ @@ -453,54 +403,26 @@ export const registerVerifyBars = async () => { } } - 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:delete-ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + //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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) diff --git a/src/commands/add.ts b/src/commands/add.ts index ab68104..43d4b89 100644 --- a/src/commands/add.ts +++ b/src/commands/add.ts @@ -10,50 +10,30 @@ export const registerCommandResponders = async () => { //ADD COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:add",generalConfig.data.prefix,"add")) opendiscord.responders.commands.get("opendiscord:add").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.add - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:add",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.add,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check if 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})) diff --git a/src/commands/autoclose.ts b/src/commands/autoclose.ts index 6200479..bdf5a8b 100644 --- a/src/commands/autoclose.ts +++ b/src/commands/autoclose.ts @@ -10,62 +10,43 @@ export const registerCommandResponders = async () => { //AUTOCLOSE COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:autoclose",generalConfig.data.prefix,/^autoclose/)) opendiscord.responders.commands.get("opendiscord:autoclose").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.autoclose - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:autoclose",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.autoclose,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check is in guild/server if (!guild){ - //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.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 } + //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() } + //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() } + //subcommands const scope = instance.options.getSubCommand() if (!scope || (scope != "disable" && scope != "enable")) return diff --git a/src/commands/autodelete.ts b/src/commands/autodelete.ts index acf4941..f912668 100644 --- a/src/commands/autodelete.ts +++ b/src/commands/autodelete.ts @@ -10,57 +10,38 @@ export const registerCommandResponders = async () => { //AUTODELETE COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:autodelete",generalConfig.data.prefix,/^autodelete/)) opendiscord.responders.commands.get("opendiscord:autodelete").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.autodelete - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:autodelete",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.autodelete,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check is in guild/server if (!guild){ //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.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 } + //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() } + //subcommands const scope = instance.options.getSubCommand() if (!scope || (scope != "disable" && scope != "enable")) return diff --git a/src/commands/blacklist.ts b/src/commands/blacklist.ts index b33c3fe..16e8548 100644 --- a/src/commands/blacklist.ts +++ b/src/commands/blacklist.ts @@ -10,49 +10,26 @@ export const registerCommandResponders = async () => { //BLACKLIST COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:blacklist",generalConfig.data.prefix,/^blacklist/)) opendiscord.responders.commands.get("opendiscord:blacklist").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.blacklist - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:blacklist",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.blacklist,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check is in guild/server if (!guild){ - //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user})) return cancel() } + + //subcommands const scope = instance.options.getSubCommand() if (!scope || (scope != "add" && scope != "get" && scope != "remove" && scope != "view")) return - if (scope == "view"){ await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:blacklist-view").build(source,{guild,channel,user})) diff --git a/src/commands/claim.ts b/src/commands/claim.ts index d47aedb..72c2b6c 100644 --- a/src/commands/claim.ts +++ b/src/commands/claim.ts @@ -10,55 +10,36 @@ export const registerCommandResponders = async () => { //CLAIM COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:claim",generalConfig.data.prefix,"claim")) opendiscord.responders.commands.get("opendiscord:claim").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:claim",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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 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})) diff --git a/src/commands/clear.ts b/src/commands/clear.ts index 3eb7b66..1de6e25 100644 --- a/src/commands/clear.ts +++ b/src/commands/clear.ts @@ -10,42 +10,18 @@ export const registerCommandResponders = async () => { //CLEAR COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:clear",generalConfig.data.prefix,"clear")) opendiscord.responders.commands.get("opendiscord:clear").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.clear - - 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"){ - //only allow global admins (ticket admins aren't allowed to clear tickets) - if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelUserScope:false,allowChannelRoleScope:false}))){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:clear",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {user,member,channel,guild} = instance + + //check permissions (only allow global admins: ticket admins aren't allowed to clear tickets) + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.clear,"support",user,member,channel,guild,{allowChannelUserScope:false,allowChannelRoleScope:false}) + 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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check is in guild/server if (!guild || channel.isDMBased()){ instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user})) return cancel() diff --git a/src/commands/close.ts b/src/commands/close.ts index 8aac86a..8f2c01b 100644 --- a/src/commands/close.ts +++ b/src/commands/close.ts @@ -11,62 +11,44 @@ export const registerCommandResponders = async () => { //CLOSE COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:close",generalConfig.data.prefix,"close")) opendiscord.responders.commands.get("opendiscord:close").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.close - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:close",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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:opendiscord.languages.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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) @@ -77,11 +59,10 @@ export const registerCommandResponders = async () => { return cancel() } } - - const reason = instance.options.getString("reason",false) - + //start closing ticket await instance.defer(false) + const reason = instance.options.getString("reason",false) await opendiscord.actions.get("opendiscord:close-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false}) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(source,{guild,channel,user,ticket,reason})) }), diff --git a/src/commands/delete.ts b/src/commands/delete.ts index 24ea2ec..ebe4c32 100644 --- a/src/commands/delete.ts +++ b/src/commands/delete.ts @@ -11,57 +11,38 @@ export const registerCommandResponders = async () => { //DELETE COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:delete",generalConfig.data.prefix,"delete")) opendiscord.responders.commands.get("opendiscord:delete").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.delete - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:delete",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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 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 (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage){ + 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")})) diff --git a/src/commands/help.ts b/src/commands/help.ts index 3679785..a8eb799 100644 --- a/src/commands/help.ts +++ b/src/commands/help.ts @@ -10,47 +10,21 @@ export const registerCommandResponders = async () => { //HELP COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:help",generalConfig.data.prefix,"help")) opendiscord.responders.commands.get("opendiscord:help").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.help - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:help",0,async (instance,params,source,cancel) => { - const preferSlashOverText = generalConfig.data.system.preferSlashOverText + const {guild,channel,user,member} = instance + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.help,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //calculate slash/text mode for help menu let mode: "slash"|"text" - if (generalConfig.data.slashCommands && generalConfig.data.textCommands){ - mode = (preferSlashOverText) ? "slash" : "text" - - }else if (!generalConfig.data.slashCommands) mode = "text" + if (generalConfig.data.slashCommands && generalConfig.data.textCommands) mode = (generalConfig.data.system.preferSlashOverText) ? "slash" : "text" + else if (!generalConfig.data.slashCommands) mode = "text" else mode = "slash" await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:help-menu").build(source,{mode,page:0})) diff --git a/src/commands/move.ts b/src/commands/move.ts index 3a63498..93ad8ed 100644 --- a/src/commands/move.ts +++ b/src/commands/move.ts @@ -10,45 +10,24 @@ export const registerCommandResponders = async () => { //MOVE COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:move",generalConfig.data.prefix,"move")) opendiscord.responders.commands.get("opendiscord:move").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.move - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:move",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.move,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check if 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})) diff --git a/src/commands/panel.ts b/src/commands/panel.ts index 22218db..cb84407 100644 --- a/src/commands/panel.ts +++ b/src/commands/panel.ts @@ -10,56 +10,30 @@ export const registerCommandResponders = async () => { //PANEL COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:panel",generalConfig.data.prefix,/^panel/)) opendiscord.responders.commands.get("opendiscord:panel").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.panel - - //command is disabled - if (permissionMode == "none"){ - //no permissions - instance.reply(await 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:panel",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.panel,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check is in guild/server if (!guild || instance.channel.type == discord.ChannelType.GroupDM){ - //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user})) return cancel() } + //get panel data const id = instance.options.getString("id",true) const panel = opendiscord.panels.get(id) - if (!panel){ - //invalid panel instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-panel-unknown").build(source,{guild,channel,user})) return cancel() - } + } await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:panel-ready").build(source,{guild,channel,user,panel})) const panelMessage = await instance.channel.send((await opendiscord.builders.messages.getSafe("opendiscord:panel").build(source,{guild,channel,user,panel})).message) diff --git a/src/commands/pin.ts b/src/commands/pin.ts index e58858f..f1a8499 100644 --- a/src/commands/pin.ts +++ b/src/commands/pin.ts @@ -44,21 +44,35 @@ export const registerCommandResponders = async () => { } }), new api.ODWorker("opendiscord:pin",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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 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})) diff --git a/src/commands/priority.ts b/src/commands/priority.ts index cbf6744..39812ca 100644 --- a/src/commands/priority.ts +++ b/src/commands/priority.ts @@ -10,56 +10,37 @@ export const registerCommandResponders = async () => { //PRIORITY COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:priority",generalConfig.data.prefix,"priority")) opendiscord.responders.commands.get("opendiscord:priority").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.priority - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:priority",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.priority,"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(source,{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 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() } + //subcommands const scope = instance.options.getSubCommand() if (!scope || (scope != "set" && scope != "get")) return diff --git a/src/commands/remove.ts b/src/commands/remove.ts index 6e71533..c6ec472 100644 --- a/src/commands/remove.ts +++ b/src/commands/remove.ts @@ -10,50 +10,30 @@ export const registerCommandResponders = async () => { //REMOVE COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:remove",generalConfig.data.prefix,"remove")) opendiscord.responders.commands.get("opendiscord:remove").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.remove - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:remove",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.remove,"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(source,{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 busy if (ticket.get("opendiscord:busy").value){ instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user})) diff --git a/src/commands/rename.ts b/src/commands/rename.ts index f84740d..7bbee26 100644 --- a/src/commands/rename.ts +++ b/src/commands/rename.ts @@ -10,50 +10,30 @@ export const registerCommandResponders = async () => { //RENAME COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:rename",generalConfig.data.prefix,"rename")) opendiscord.responders.commands.get("opendiscord:rename").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.rename - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:rename",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {guild,channel,user,member} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.rename,"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(source,{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 busy if (ticket.get("opendiscord:busy").value){ instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user})) diff --git a/src/commands/reopen.ts b/src/commands/reopen.ts index f398aec..fb86a30 100644 --- a/src/commands/reopen.ts +++ b/src/commands/reopen.ts @@ -10,55 +10,36 @@ export const registerCommandResponders = async () => { //REOPEN COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:reopen",generalConfig.data.prefix,"reopen")) opendiscord.responders.commands.get("opendiscord:reopen").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:reopen",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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 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})) diff --git a/src/commands/role.ts b/src/commands/role.ts index 0081df6..e9de633 100644 --- a/src/commands/role.ts +++ b/src/commands/role.ts @@ -12,13 +12,14 @@ export const registerButtonResponders = async () => { opendiscord.responders.buttons.get("opendiscord:role-option").workers.add( new api.ODWorker("opendiscord:role-option",0,async (instance,params,source,cancel) => { const {guild,channel,user} = instance + + //check is in guild/server if (!guild){ - //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user})) return cancel() } - //get option + //get option data const optionId = instance.interaction.customId.split("_")[2] const option = opendiscord.options.get(optionId) if (!option || !(option instanceof api.ODRoleOption)){ diff --git a/src/commands/stats.ts b/src/commands/stats.ts index c308c3f..46be1fb 100644 --- a/src/commands/stats.ts +++ b/src/commands/stats.ts @@ -57,12 +57,36 @@ export const registerCommandResponders = async () => { } }), new api.ODWorker("opendiscord:stats",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {user,member,channel,guild} = instance + + //check permissions + if (generalConfig.data.system.permissions.stats === "none"){ + //command is disabled + 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 (instance.options.getSubCommand() === "reset" && !opendiscord.permissions.hasPermissions("owner",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){ + //reset --> owner/developer role is required + instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["owner","developer"]})) + return cancel() + + }else{ + //default permissions check + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.stats,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + } + + //check is in guild/server if (!guild){ - //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user})) return cancel() } + + //subcommands const scope = instance.options.getSubCommand() if (!scope || (scope != "global" && scope != "ticket" && scope != "user" && scope != "reset")) return diff --git a/src/commands/ticket.ts b/src/commands/ticket.ts index 45fcddb..055dc1d 100644 --- a/src/commands/ticket.ts +++ b/src/commands/ticket.ts @@ -7,52 +7,46 @@ import * as discord from "discord.js" const generalConfig = opendiscord.configs.get("opendiscord:general") const lang = opendiscord.languages +async function checkTicketCreationPerms(instance:api.ODButtonResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance|api.ODCommandResponderInstance,source:api.ODActionManagerIds_Default["opendiscord:create-ticket-permissions"]["source"],guild:discord.Guild,user:discord.User,option:api.ODTicketOption){ + //check ticket permissions + const permsRes = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run(source,{guild,user,option}) + if (!permsRes.valid && instance.channel){ + //error + const newSource = (source === "slash" || source === "text") ? source : "other" + if (permsRes.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user})) + else if (permsRes.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,until:permsRes.cooldownUntil})) + else if (permsRes.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"})) + else if (permsRes.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"})) + else if (permsRes.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"})) + else if (permsRes.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"})) + else if (permsRes.reason == "custom") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,layout:"simple",error:permsRes.customReason ?? lang.getTranslation("errors.descriptions.unableToCreateTicket")+" `Unknown invalid_permission_reason => no reason specified by plugin`",customTitle:lang.getTranslation("errors.titles.permissionError")})) + else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"})) + return false + }else return true +} + export const registerCommandResponders = async () => { //TICKET COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:ticket",generalConfig.data.prefix,/^ticket/)) opendiscord.responders.commands.get("opendiscord:ticket").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.ticket - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:ticket",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {user,member,channel,guild} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.ticket,"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(source,{guild,channel,user,permissions:["support"]})) + return cancel() + } + + //check is in guild/server if (!guild){ - //error instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user})) return cancel() } - //get option + //get option data const optionId = instance.options.getString("id",true) const option = opendiscord.options.get(optionId) if (!option || !(option instanceof api.ODTicketOption)){ @@ -61,26 +55,14 @@ export const registerCommandResponders = async () => { return cancel() } - //check ticket permissions - const res = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run(source,{guild,user,option}) - if (!res.valid){ - //error - if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user})) - else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil})) - else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"})) - else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"})) - else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"})) - else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"})) - else if (res.reason == "custom") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,layout:"simple",error:res.customReason ?? lang.getTranslation("errors.descriptions.unableToCreateTicket")+" `Unknown invalid_permission_reason => no reason specified by plugin`",customTitle:lang.getTranslation("errors.titles.permissionError")})) - else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"})) - return cancel() - } - //start ticket creation if (option.exists("opendiscord:questions") && option.get("opendiscord:questions").value.length > 0){ //send modal instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build(source,{guild,channel,user,option})) }else{ + //check ticket permissions + if (!checkTicketCreationPerms(instance,source,guild,user,option)) return cancel() + //create ticket await instance.defer(true) const res = await opendiscord.actions.get("opendiscord:create-ticket").run(source,{guild,user,answers:[],option}) @@ -124,26 +106,14 @@ export const registerButtonResponders = async () => { return cancel() } - //check ticket permissions - const res = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run("panel-button",{guild,user,option}) - if (!res.valid){ - //error - if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user})) - else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil})) - else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"})) - else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"})) - else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"})) - else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"})) - else if (res.reason == "custom") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,layout:"simple",error:res.customReason ?? lang.getTranslation("errors.descriptions.unableToCreateTicket")+" `Unknown invalid_permission_reason => no reason specified by plugin`",customTitle:lang.getTranslation("errors.titles.permissionError")})) - else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"})) - return cancel() - } - //start ticket creation if (option.exists("opendiscord:questions") && option.get("opendiscord:questions").value.length > 0){ //send modal instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build("panel-button",{guild,channel,user,option})) }else{ + //check ticket permissions + if (!checkTicketCreationPerms(instance,"panel-button",guild,user,option)) return cancel() + //create ticket await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true) @@ -180,26 +150,14 @@ export const registerDropdownResponders = async () => { return cancel() } - //check ticket permissions - const res = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run("panel-dropdown",{guild,user,option}) - if (!res.valid){ - //error - if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user})) - else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil})) - else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"})) - else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"})) - else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"})) - else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"})) - else if (res.reason == "custom") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,layout:"simple",error:res.customReason ?? lang.getTranslation("errors.descriptions.unableToCreateTicket")+" `Unknown invalid_permission_reason => no reason specified by plugin`",customTitle:lang.getTranslation("errors.titles.permissionError")})) - else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"})) - return cancel() - } - //start ticket creation if (option.exists("opendiscord:questions") && option.get("opendiscord:questions").value.length > 0){ //send modal instance.modal(await opendiscord.builders.modals.getSafe("opendiscord:ticket-questions").build("panel-dropdown",{guild,channel,user,option})) }else{ + //check ticket permissions + if (!checkTicketCreationPerms(instance,"panel-dropdown",guild,user,option)) return cancel() + //create ticket await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true) @@ -229,6 +187,7 @@ export const registerModalResponders = async () => { opendiscord.responders.modals.get("opendiscord:ticket-questions").workers.add([ new api.ODWorker("opendiscord:ticket-questions",0,async (instance,params,source,cancel) => { const {guild,channel,user} = instance + await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true) if (!channel) throw new api.ODSystemError("The 'Ticket Questions' modal requires a channel for responding!") if (!guild){ //error @@ -247,6 +206,9 @@ export const registerModalResponders = async () => { return cancel() } + //check ticket permissions + if (!checkTicketCreationPerms(instance,originalSource,guild,user,option)) return cancel() + //get answers const answers: {id:string,name:string,type:"short"|"paragraph",value:string|null}[] = [] option.get("opendiscord:questions").value.forEach((id) => { @@ -270,8 +232,6 @@ export const registerModalResponders = async () => { }) //create ticket - await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true) - const res = await opendiscord.actions.get("opendiscord:create-ticket").run(originalSource,{guild,user,answers,option}) if (!res.channel || !res.ticket){ //error diff --git a/src/commands/topic.ts b/src/commands/topic.ts index f8423c7..79992c2 100644 --- a/src/commands/topic.ts +++ b/src/commands/topic.ts @@ -10,56 +10,37 @@ export const registerCommandResponders = async () => { //TOPIC COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:topic",generalConfig.data.prefix,"topic")) opendiscord.responders.commands.get("opendiscord:topic").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.topic - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:topic",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {user,member,channel,guild} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.topic,"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(source,{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 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() } + //subcommands const scope = instance.options.getSubCommand() if (!scope || (scope != "set")) return diff --git a/src/commands/transfer.ts b/src/commands/transfer.ts index 18c8c8b..5aa2298 100644 --- a/src/commands/transfer.ts +++ b/src/commands/transfer.ts @@ -10,50 +10,30 @@ export const registerCommandResponders = async () => { //TRANSFER COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:transfer",generalConfig.data.prefix,"transfer")) opendiscord.responders.commands.get("opendiscord:transfer").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => { - const permissionMode = generalConfig.data.system.permissions.transfer - - 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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:transfer",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + const {user,member,channel,guild} = instance + + //check permissions + const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.transfer,"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(source,{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 busy if (ticket.get("opendiscord:busy").value){ instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user})) diff --git a/src/commands/unclaim.ts b/src/commands/unclaim.ts index 0cdec44..73cb608 100644 --- a/src/commands/unclaim.ts +++ b/src/commands/unclaim.ts @@ -10,55 +10,36 @@ export const registerCommandResponders = async () => { //UNCLAIM COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:unclaim",generalConfig.data.prefix,"unclaim")) opendiscord.responders.commands.get("opendiscord:unclaim").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:unclaim",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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 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})) diff --git a/src/commands/unpin.ts b/src/commands/unpin.ts index 06095ca..30a9579 100644 --- a/src/commands/unpin.ts +++ b/src/commands/unpin.ts @@ -10,55 +10,36 @@ export const registerCommandResponders = async () => { //UNPIN COMMAND RESPONDER opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:unpin",generalConfig.data.prefix,"unpin")) opendiscord.responders.commands.get("opendiscord:unpin").workers.add([ - new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,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(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]})) - return cancel() - }else return - }else{ - if (!instance.guild || !instance.member){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"})) - return cancel() - } - const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode) - if (!role){ - //error - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"})) - return cancel() - } - if (!role.members.has(instance.member.id)){ - //no permissions - instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]})) - return cancel() - }else return - } - }), new api.ODWorker("opendiscord:unpin",0,async (instance,params,source,cancel) => { - const {guild,channel,user} = instance + 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(source,{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 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() } + //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})) diff --git a/src/core/api/modules/permission.ts b/src/core/api/modules/permission.ts index 5ae1d72..4b4f883 100644 --- a/src/core/api/modules/permission.ts +++ b/src/core/api/modules/permission.ts @@ -101,6 +101,20 @@ export interface ODPermissionSettings { */ export type ODPermissionCalculationCallback = (user:discord.User, channel?:discord.Channel|null, guild?:discord.Guild|null, settings?:ODPermissionSettings|null) => Promise +/**## ODPermissionCommandResult `type` + * The result of calculating permissions for a command. + */ +export type ODPermissionCommandResult = { + /**Returns `true` when the user has valid permissions. */ + hasPerms:false, + reason:"no-perms"|"disabled"|"not-in-server" +}|{ + /**Returns `true` when the user has valid permissions. */ + hasPerms:true, + /**Is the user a server admin or a normal member? This does not decide if the user has permissions or not. */ + isAdmin:boolean +} + /**## ODPermissionManager `class` * This is an Open Ticket permission manager. * @@ -110,6 +124,8 @@ export type ODPermissionCalculationCallback = (user:discord.User, channel?:disco * Add new permissions using the `ODPermission` class in your plugin! */ export class ODPermissionManager extends ODManager { + /**Alias for Open Ticket debugger. */ + #debug: ODDebugger /**The function for calculating permissions in this manager. */ #calculation: ODPermissionCalculationCallback|null /**An alias to the Open Discord client manager. */ @@ -124,6 +140,7 @@ export class ODPermissionManager extends ODManager { constructor(debug:ODDebugger, client:ODClientManager, useDefaultCalculation?:boolean){ super(debug,"permission") + this.#debug = debug this.#calculation = useDefaultCalculation ? this.#defaultCalculation : null this.#client = client } @@ -290,4 +307,34 @@ export class ODPermissionManager extends ODManager { //spread result to prevent accidental modification because of referencing return {...this.defaultResult} } + + /**Check the permissions for a certain command of the bot. */ + async checkCommandPerms(permissionMode:string,requiredLevel:ODPermissionType,user:discord.User,member?:discord.GuildMember|null,channel?:discord.Channel|null,guild?:discord.Guild|null,settings?:ODPermissionSettings): Promise { + if (permissionMode === "none"){ + return {hasPerms:false,reason:"disabled"} + + }else if (permissionMode === "everyone"){ + const isAdmin = this.hasPermissions(requiredLevel,await this.getPermissions(user,channel,guild,settings)) + return {hasPerms:true,isAdmin} + + }else if (permissionMode === "admin"){ + const isAdmin = this.hasPermissions(requiredLevel,await this.getPermissions(user,channel,guild,settings)) + if (!isAdmin) return {hasPerms:false,reason:"no-perms"} + else return {hasPerms:true,isAdmin} + }else{ + if (!guild || !member){ + this.#debug.debug("ODPermissionManager.checkCommandPerms(): Permission Error, Not in server! (#1)") + return {hasPerms:false,reason:"not-in-server"} + } + const role = await this.#client.fetchGuildRole(guild,permissionMode) + if (!role){ + this.#debug.debug("ODPermissionManager.checkCommandPerms(): Permission Error, Not in server! (#2)") + return {hasPerms:false,reason:"not-in-server"} + } + if (!role.members.has(member.id)) return {hasPerms:false,reason:"no-perms"} + + const isAdmin = this.hasPermissions(requiredLevel,await this.getPermissions(user,channel,guild,settings)) + return {hasPerms:true,isAdmin} + } + } } \ No newline at end of file