From 034247ea9989225501716686bade10a46daf2860 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Wed, 10 Aug 2022 19:35:10 +0200 Subject: [PATCH 1/5] v2.5.0 first push --- .gitignore | 3 +- README.md | 6 +- commands/add.js | 22 ++-- commands/close.js | 52 +++++---- commands/delete.js | 56 +++++---- commands/help.js | 16 +-- commands/remove.js | 26 ++--- commands/rename.js | 38 ++++--- commands/reopen.js | 29 ++--- config.json | 2 +- core/api/modules/events.js | 19 +++- core/checker.js | 2 +- core/dynamicdatabase/storage.js | 22 +--- core/errorLogSystem.js | 21 ++-- core/getoptions.js | 6 +- core/interactionHandlers/buttons/close.js | 78 +++++++++++++ core/interactionHandlers/buttons/firstmsg.js | 52 +++++++++ .../interactionHandlers/buttons/verifyBars.js | 63 +++++++++++ core/interactionHandlers/embeds/commands.js | 84 ++++++++++++++ .../handlers/accepted/closing.js | 60 ++++++++++ .../handlers/accepted/reopening.js | 29 +++++ core/interactionHandlers/handlers/firstmsg.js | 21 ++++ core/interactionHandlers/handlers/handlers.js | 9 ++ .../handlers/sendTranscript.js | 42 +++++++ .../handlers/verifyBars.js | 35 ++++++ core/slashSystem/slashEnable.js | 4 +- core/ticketCloser.js | 107 ++++++++++-------- core/ticketOpener.js | 32 ++---- core/ticketReopener.js | 92 +++++++-------- core/utils/errorTypes.js | 3 - core/utils/getButton.js | 2 +- core/utils/hiddendata.js | 52 +++++++++ index.js | 46 +++++--- language/english.json | 28 ++--- package.json | 2 +- 35 files changed, 844 insertions(+), 317 deletions(-) create mode 100644 core/interactionHandlers/buttons/close.js create mode 100644 core/interactionHandlers/buttons/firstmsg.js create mode 100644 core/interactionHandlers/buttons/verifyBars.js create mode 100644 core/interactionHandlers/embeds/commands.js create mode 100644 core/interactionHandlers/handlers/accepted/closing.js create mode 100644 core/interactionHandlers/handlers/accepted/reopening.js create mode 100644 core/interactionHandlers/handlers/firstmsg.js create mode 100644 core/interactionHandlers/handlers/handlers.js create mode 100644 core/interactionHandlers/handlers/sendTranscript.js create mode 100644 core/interactionHandlers/handlers/verifyBars.js delete mode 100644 core/utils/errorTypes.js create mode 100644 core/utils/hiddendata.js diff --git a/.gitignore b/.gitignore index 4da0179..e485366 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ devConfig5.json openticketdebug.txt developerChangelog.md storage/dynamicDB/ -storage/.DS_Store \ No newline at end of file +storage/.DS_Store +.vscode/ \ No newline at end of file diff --git a/README.md b/README.md index a5be7c1..525c76a 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ make a ticket in our server to start! *if you translate, you will come in the credits* # open-ticket -[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-2.4.0%20stable-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v2.4.0) [![npm](https://img.shields.io/badge/npm-external%20libraries%20needed-CB3837.svg?style=flat-square&logo=npm)](#packages) [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) +[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-2.5.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v2.5.0) [![npm](https://img.shields.io/badge/npm-external%20libraries%20needed-CB3837.svg?style=flat-square&logo=npm)](#packages) [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options! @@ -68,7 +68,7 @@ if there are any errors, you can open an **issue on github** or **contact me in ### config Our config documentation is moved to another file: -[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.4.0) +[click here to view](https://www.github.com/DJj123dj/open-ticket/wiki/config-v2.5.0) ### intents & permissions In the discord developer portal in the "bot" panel you will find 3 switches under the title "Gateaway Intents". The following switches should always be turned on @@ -80,7 +80,7 @@ You can also configure your own permissions ## information -_v2.4.0 stable_ +_v2.5.0 stable_ changelog: [click here](https://www.github.com/DJj123dj/open-ticket/wiki/Changelog) diff --git a/commands/add.js b/commands/add.js index be5b848..e59c82e 100644 --- a/commands/add.js +++ b/commands/add.js @@ -22,18 +22,18 @@ module.exports = () => { msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - msg.channel.permissionOverwrites.create(user.id, { VIEW_CHANNEL:true, ADD_REACTIONS:true,ATTACH_FILES:true, EMBED_LINKS:true, SEND_MESSAGES:true}) - msg.channel.send({embeds:[bot.errorLog.success(l.commands.userAddedTitle,l.commands.userAddedDescription.replace("{0}",user.tag))]}) + msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) + msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user)]}) var loguser = msg.mentions.users.first() log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}]) log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}]) - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) @@ -52,22 +52,20 @@ module.exports = () => { return } - interaction.deferReply() - interaction.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - interaction.channel.permissionOverwrites.create(user.id, { VIEW_CHANNEL:true, ADD_REACTIONS:true,ATTACH_FILES:true, EMBED_LINKS:true, SEND_MESSAGES:true}) - interaction.reply({embeds:[bot.errorLog.success(l.commands.userAddedTitle,l.commands.userAddedDescription.replace("{0}",user.tag))]}) + interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) + interaction.reply({embeds:[bot.embeds.commands.addEmbed(user)]}) var loguser = user log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}]) log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}]) - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) diff --git a/commands/close.js b/commands/close.js index 3c622f1..c117980 100644 --- a/commands/close.js +++ b/commands/close.js @@ -15,19 +15,22 @@ module.exports = () => { msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - - const closebutton = new discord.ActionRowBuilder() - .addComponents([ - new discord.ButtonBuilder() - .setCustomId("closeTicketTrue1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("🔒") - ]) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - msg.channel.send({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]}) + msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author)],components:[bot.buttons.close.closeCommandRow]}) + + var name = msg.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",false,true) log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}]) APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date()) @@ -41,23 +44,26 @@ module.exports = () => { if (!interaction.isChatInputCommand()) return if (interaction.commandName != "close") return - interaction.deferReply() + //interaction.deferReply() interaction.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) - - const closebutton = new discord.ActionRowBuilder() - .addComponents([ - new discord.ButtonBuilder() - .setCustomId("closeTicketTrue1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("🔒") - ]) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - interaction.reply({embeds:[bot.errorLog.success(l.commands.closeTitle,l.commands.closeDescription)],components:[closebutton]}) + interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) + + var name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true) log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date()) diff --git a/commands/delete.js b/commands/delete.js index e3f1190..92a0571 100644 --- a/commands/delete.js +++ b/commands/delete.js @@ -20,19 +20,22 @@ module.exports = () => { msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - - const closebutton = new discord.ActionRowBuilder() - .addComponents([ - new discord.ButtonBuilder() - .setCustomId("deleteTicketTrue") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("❌") - ]) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - msg.channel.send({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]}) + msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]}) + + var name = msg.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true) log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}]) APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) @@ -45,7 +48,7 @@ module.exports = () => { if (!interaction.isChatInputCommand()) return if (interaction.commandName != "delete") return - interaction.deferReply() + //interaction.deferReply() if (!interaction.guild) return if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ @@ -53,23 +56,26 @@ module.exports = () => { return } - interaction.channel.messages.fetchPinned().then(msglist => { + interaction.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) - - const closebutton = new discord.ActionRowBuilder() - .addComponents([ - new discord.ButtonBuilder() - .setCustomId("deleteTicketTrue") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("❌") - ]) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - interaction.reply({embeds:[bot.errorLog.success(l.commands.deleteTitle,l.commands.deleteDescription)],components:[closebutton]}) + interaction.reply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) - log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) + var name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) + + log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}]) APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) diff --git a/commands/help.js b/commands/help.js index 25df27e..cfdeaee 100644 --- a/commands/help.js +++ b/commands/help.js @@ -10,7 +10,7 @@ const APIEvents = require("../core/api/modules/events") module.exports = () => { const helpEmbed = new discord.EmbedBuilder() .setColor(config.main_color) - .setTitle(l.helpMenu.title) + .setTitle("❔ "+l.helpMenu.title) const prefix = config.prefix const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2 @@ -18,23 +18,25 @@ module.exports = () => { if (config.credits) helpEmbed.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code",iconURL:"https://raw.githubusercontent.com/DJj123dj/open-ticket/main/logo.png"}) + var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix)) return var args = msg.content.split(config.prefix) - if (!args[1]){ + if (msg.content == config.prefix || msg.content == config.prefix+" " || msg.content == otherprefix){ msg.channel.send({embeds:[helpEmbed]}) log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date()) return } - if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen")){ - - msg.channel.send({embeds:[helpEmbed]}) - log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) - APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date()) + if (args[1]){ + if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen")){ + msg.channel.send({embeds:[helpEmbed]}) + log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}]) + APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date()) + } } }) diff --git a/commands/remove.js b/commands/remove.js index 29730b3..acba3c3 100644 --- a/commands/remove.js +++ b/commands/remove.js @@ -20,30 +20,28 @@ module.exports = () => { return } - interaction.deferReply() - msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") msg.channel.permissionOverwrites.delete(user.id) - msg.channel.send({embeds:[bot.errorLog.success(l.commands.userRemovedTitle,l.commands.userRemovedDescription.replace("{0}",user.tag))]}) + msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user)]}) var loguser = msg.mentions.users.first() log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}]) log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}]) - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) }) }) - client.on("interactionCreate",(interaction) => { + client.on("interactionCreate",async (interaction) => { if (!interaction.isChatInputCommand()) return if (interaction.commandName != "remove") return const user = interaction.options.getUser("user") @@ -53,28 +51,24 @@ module.exports = () => { permsChecker.sendUserNoPerms(interaction.user) return } - - - interaction.channel.messages.fetchPinned().then(msglist => { + await interaction.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") interaction.channel.permissionOverwrites.delete(user.id) - interaction.reply({embeds:[bot.errorLog.success(l.commands.userRemovedTitle,l.commands.userRemovedDescription.replace("{0}",user.tag))]}) + interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user)]}) var loguser = user log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}]) log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}]) - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("../core/getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) - - }) } \ No newline at end of file diff --git a/commands/rename.js b/commands/rename.js index e9ef4ef..b9da6d1 100644 --- a/commands/rename.js +++ b/commands/rename.js @@ -12,16 +12,17 @@ module.exports = () => { client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"rename")) return + if (!msg.guild) return + if (!permsChecker.command(msg.author.id,msg.guild.id)){ + permsChecker.sendUserNoPerms(msg.author) + return + } + msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - - if (!msg.guild) return - if (!permsChecker.command(msg.author.id,msg.guild.id)){ - permsChecker.sendUserNoPerms(msg.author) - return - } + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") var newname = msg.content.split(config.prefix+"rename")[1].substring(1) @@ -39,7 +40,7 @@ module.exports = () => { if (!prefix) prefix = "noprefix-" msg.channel.setName(prefix+newname) - msg.channel.send({embeds:[bot.errorLog.success(l.commands.renameTitle,l.commands.renameWarning)]}) + msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]}) log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}]) log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) @@ -53,18 +54,19 @@ module.exports = () => { if (!interaction.isChatInputCommand()) return if (interaction.commandName != "rename") return - interaction.deferReply() + if (!interaction.guild) return + if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ + permsChecker.sendUserNoPerms(interaction.user) + return + } + + //interaction.deferReply() interaction.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - - if (firstmsg == undefined || firstmsg.author.id != client.user.id)return interaction.reply({embeds:[bot.errorLog.notInATicket]}) - - if (!interaction.guild) return - if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ - permsChecker.sendUserNoPerms(interaction.user) - return - } + if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") var newname = interaction.options.getString("name") var name = interaction.channel.name @@ -79,7 +81,7 @@ module.exports = () => { if (!prefix) prefix = "noprefix-" interaction.channel.setName(prefix+newname) - interaction.reply({embeds:[bot.errorLog.success(l.commands.renameTitle,l.commands.renameWarning)]}) + interaction.reply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]}) log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}]) log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) diff --git a/commands/reopen.js b/commands/reopen.js index 20e6e6f..2e7ee04 100644 --- a/commands/reopen.js +++ b/commands/reopen.js @@ -9,25 +9,18 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { - var reopenCommandBar = new discord.ActionRowBuilder() - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicket1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("🔓") - ) - client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"reopen")) return msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - msg.channel.send({embeds:[bot.errorLog.success(l.commands.reopenTitle,l.commands.reopenDescription)],components:[reopenCommandBar]}) + msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]}) + require("../core/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author) log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}]) APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date()) @@ -39,19 +32,17 @@ module.exports = () => { if (!interaction.isChatInputCommand()) return if (interaction.commandName != "reopen") return - await interaction.deferReply() + //interaction.deferReply() interaction.channel.messages.fetchPinned().then(async msglist => { var firstmsg = msglist.last() + if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - - try { - await interaction.reply({embeds:[bot.errorLog.success(l.commands.reopenTitle,l.commands.reopenDescription)],components:[reopenCommandBar]}) - }catch{ - await interaction.editReply({embeds:[bot.errorLog.success(l.commands.reopenTitle,l.commands.reopenDescription)],components:[reopenCommandBar]}) - } + await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) + require("../core/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user) log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}]) APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date()) diff --git a/config.json b/config.json index 8a8ccbf..d09e42b 100644 --- a/config.json +++ b/config.json @@ -79,7 +79,7 @@ "description":"You can click one of the buttons below!", "enableFooter":false, - "footer":"Open Ticket v2.4.0 - I'm a footer!", + "footer":"Open Ticket v2.5.0 - I'm a footer!", "enableThumbnail":false, "thumbnail":"https://www.example.com/catmemes/cat.png", diff --git a/core/api/modules/events.js b/core/api/modules/events.js index 7014799..150f2a5 100644 --- a/core/api/modules/events.js +++ b/core/api/modules/events.js @@ -49,14 +49,15 @@ exports.onTicketOpen = (user,channel,guild,date,ticketdata) => { * @param {discord.Guild} guild * @param {Date} date * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {String} reason */ -exports.onTicketClose = (user,channel,guild,date,ticketdata) => { +exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => { //system - bot.errorLog.log("api","ticket closed",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}]) + bot.errorLog.log("api","ticket closed",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)},{key:"reason",value:reason}]) ticketCloseListeners.forEach((func) => { try { - func(user,channel,guild,date,ticketdata) + func(user,channel,guild,date,ticketdata,reason) }catch{} }) @@ -238,6 +239,16 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => { * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata */ +/** + * @callback TicketCloseEvent + * @param {discord.User} user + * @param {discord.TextChannel} channel + * @param {discord.Guild} guild + * @param {Date} date + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {String} reason + */ + /** * @callback TranscriptCreationEvent * @param {discord.Message[]} messages @@ -290,7 +301,7 @@ const onTicketOpen = (callback) => { ticketOpenListeners.push(callback) } -/**@param {TicketActionEvent} callback */ +/**@param {TicketCloseEvent} callback */ const onTicketClose = (callback) => { ticketCloseListeners.push(callback) } diff --git a/core/checker.js b/core/checker.js index 0a2e6b2..64a69ef 100644 --- a/core/checker.js +++ b/core/checker.js @@ -41,7 +41,7 @@ exports.checker = async () => { } /**@param {String} value */ const checkToken = (value) => { - if (value.includes(" ") || value.length < 40 || value.length > 90){ + if (value.includes(" ") || value.length < 40){ createError("'auth_token' | your token is invalid") } } diff --git a/core/dynamicdatabase/storage.js b/core/dynamicdatabase/storage.js index 7fa0482..80ad75d 100644 --- a/core/dynamicdatabase/storage.js +++ b/core/dynamicdatabase/storage.js @@ -10,24 +10,4 @@ try { process.exit(1) } -module.exports = db - - -/** ============================= - ** NOT READY YET - ** must be dynamic - ** =============================*/ -//const LocalStorage = require("node-localstorage") -// -//const ticketStorage = new LocalStorage.LocalStorage("./storage/tickets") -//exports.ticketStorage = ticketStorage -// -//const userTicketStorage = new LocalStorage.LocalStorage("./storage/userTickets") -//exports.userTicketStorage = userTicketStorage -// -//const transcriptStorage = new LocalStorage.LocalStorage("./storage/transcripts") -//exports.transcriptStorage = transcriptStorage - -//const ticketNumberStorage = new LocalStorage.LocalStorage("./storage/ticketNumbers") -//exports.ticketNumberStorage = ticketNumberStorage - +module.exports = db \ No newline at end of file diff --git a/core/errorLogSystem.js b/core/errorLogSystem.js index 169f8b7..b2ab1ff 100644 --- a/core/errorLogSystem.js +++ b/core/errorLogSystem.js @@ -12,14 +12,19 @@ const c = discord.Colors exports.noPermsMessage = new embed() .setColor(c.Red) - .setTitle(":x: "+l.errors.noPermsTitle+" :x:") + .setTitle(":x: "+l.errors.noPermsTitle) .setDescription(l.errors.noPermsDescription) +exports.noPermsDelete = new embed() + .setColor(c.Red) + .setTitle(":x: "+l.errors.noPermsTitle) + .setDescription(l.errors.noPermsDelete) + /**@param {String} message */ exports.invalidArgsMessage = (message) => { var x = new embed() .setColor(c.Red) - .setTitle(":x: "+l.errors.missingArgsTitle+" :x:") + .setTitle(":x: "+l.errors.missingArgsTitle) .setDescription(message) return x @@ -29,7 +34,7 @@ exports.invalidArgsMessage = (message) => { exports.serverError = (message) => { var x = new embed() .setColor(c.Orange) - .setTitle(":warning: "+l.errors.boterror+" :warning:") + .setTitle(":warning: "+l.errors.boterror) .setDescription(message) return x @@ -39,14 +44,14 @@ exports.serverError = (message) => { exports.invalidIdChooseFromList = (list) => { var x = new embed() .setColor(c.Red) - .setTitle(":x: "+l.errors.chooseFromListTitle+" :x:") + .setTitle(":x: "+l.errors.chooseFromListTitle) .setDescription(l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`") return x } exports.notInATicket = new embed() .setColor(c.Red) - .setTitle(":x: "+l.errors.notInTicketTitle+" :x:") + .setTitle(":x: "+l.errors.notInTicketTitle) .setDescription(l.errors.notInTicketDescription) @@ -54,7 +59,7 @@ exports.notInATicket = new embed() exports.success = (title,message) => { var x = new embed() .setColor(config.main_color) - .setTitle(":white_check_mark: "+title+" :white_check_mark:") + .setTitle(":white_check_mark: "+title) .setDescription(message) return x @@ -64,7 +69,7 @@ exports.success = (title,message) => { exports.warning = (title,message) => { var x = new embed() .setColor(c.Orange) - .setTitle(":warning: "+title+" :warning:") + .setTitle(":warning: "+title) .setDescription(message) return x @@ -74,7 +79,7 @@ exports.warning = (title,message) => { exports.custom = (title,message,emoji,color) => { var x = new embed() .setColor(color) - .setTitle(emoji+" "+title+" "+emoji) + .setTitle(emoji+" "+title) .setDescription(message) return x diff --git a/core/getoptions.js b/core/getoptions.js index ada3a01..b691a67 100644 --- a/core/getoptions.js +++ b/core/getoptions.js @@ -7,7 +7,7 @@ const config = bot.config */ exports.getTicketValue = (index,value) => { if (value == "id"){ - return "newT"+config.options[index][value] + return "OTnewT"+config.options[index][value] } return config.options[index][value] } @@ -35,7 +35,7 @@ exports.getRoleValue = (index,value) => { var result = [] config.options.forEach((o) => { if (value == "id"){ - result.push("newT"+o[value]) + result.push("OTnewT"+o[value]) }else{ result.push(o[value]) } @@ -90,7 +90,7 @@ class TicketOptions { exports.getOptionsById = (id) => { var result = false config.options.forEach((option) => { - if ("newT"+option.id == id){ + if ("OTnewT"+option.id == id){ result = option } }) diff --git a/core/interactionHandlers/buttons/close.js b/core/interactionHandlers/buttons/close.js new file mode 100644 index 0000000..1a8a445 --- /dev/null +++ b/core/interactionHandlers/buttons/close.js @@ -0,0 +1,78 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + + +exports.closeCommandRow = new arb() + .addComponents( + new button() + .setCustomId("OTdeleteTicket1") + .setDisabled(false) + .setStyle(bs.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") + ) + .addComponents( + new button() + .setCustomId("OTsendTranscript") + .setDisabled(false) + .setStyle(bs.Secondary) + .setLabel(l.buttons.sendTranscript) + .setEmoji("📄") + ) + .addComponents( + new button() + .setCustomId("OTreopenTicket") + .setDisabled(false) + .setStyle(bs.Success) + .setLabel(l.buttons.reopen) + .setEmoji("✔") + ) + +exports.openRowNormal = new arb() + .addComponents( + new button() + .setCustomId("OTcloseTicket") + .setDisabled(false) + .setStyle(bs.Secondary) + .setLabel(l.buttons.close) + .setEmoji("🔒") + ) + .addComponents( + new button() + .setCustomId("OTdeleteTicket") + .setDisabled(false) + .setStyle(bs.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") + ) + +exports.openRowDisabled = new arb() + .addComponents( + new button() + .setCustomId("OTcloseTicket") + .setDisabled(true) + .setStyle(bs.Secondary) + .setLabel(l.buttons.close) + .setEmoji("🔒") + ) + .addComponents( + new button() + .setCustomId("OTdeleteTicket") + .setDisabled(true) + .setStyle(bs.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") + ) \ No newline at end of file diff --git a/core/interactionHandlers/buttons/firstmsg.js b/core/interactionHandlers/buttons/firstmsg.js new file mode 100644 index 0000000..53edd15 --- /dev/null +++ b/core/interactionHandlers/buttons/firstmsg.js @@ -0,0 +1,52 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + + +exports.firstmsgRowNormal = new arb() + .addComponents( + new button() + .setCustomId("OTcloseTicket") + .setDisabled(false) + .setStyle(bs.Secondary) + .setLabel(l.buttons.close) + .setEmoji("🔒") + ) + .addComponents( + new button() + .setCustomId("OTdeleteTicket") + .setDisabled(false) + .setStyle(bs.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") + ) + +exports.firstmsgRowDisabled = new arb() + .addComponents( + new button() + .setCustomId("OTcloseTicket") + .setDisabled(true) + .setStyle(bs.Secondary) + .setLabel(l.buttons.close) + .setEmoji("🔒") + ) + .addComponents( + new button() + .setCustomId("OTdeleteTicket") + .setDisabled(true) + .setStyle(bs.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") + ) \ No newline at end of file diff --git a/core/interactionHandlers/buttons/verifyBars.js b/core/interactionHandlers/buttons/verifyBars.js new file mode 100644 index 0000000..7d1b864 --- /dev/null +++ b/core/interactionHandlers/buttons/verifyBars.js @@ -0,0 +1,63 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + +exports.closeVerifyBar = new arb() + .addComponents( + new button() + .setCustomId("OTcloseTicketTrue") + .setDisabled(false) + .setStyle(bs.Secondary) + .setEmoji("✅") + ) + .addComponents( + new button() + .setCustomId("OTcloseTicketFalse") + .setDisabled(false) + .setStyle(bs.Secondary) + .setEmoji("❌") + ) + +exports.deleteVerifyBar = new arb() + .addComponents( + new button() + .setCustomId("OTdeleteTicketTrue") + .setDisabled(false) + .setStyle(bs.Secondary) + .setEmoji("✅") + ) + .addComponents( + new button() + .setCustomId("OTdeleteTicketFalse") + .setDisabled(false) + .setStyle(bs.Secondary) + .setEmoji("❌") + ) + +exports.delete1VerifyBar = new arb() + .addComponents( + new button() + .setCustomId("OTdeleteTicketTrue1") + .setDisabled(false) + .setStyle(bs.Secondary) + .setEmoji("✅") + ) + .addComponents( + new button() + .setCustomId("OTdeleteTicketFalse1") + .setDisabled(false) + .setStyle(bs.Secondary) + .setEmoji("❌") + ) \ No newline at end of file diff --git a/core/interactionHandlers/embeds/commands.js b/core/interactionHandlers/embeds/commands.js new file mode 100644 index 0000000..425b093 --- /dev/null +++ b/core/interactionHandlers/embeds/commands.js @@ -0,0 +1,84 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +/** + * + * @param {discord.User} addedUser + * @returns {discord.EmbedBuilder} + */ +exports.addEmbed = (addedUser) => { + return new embed() + .setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username)) + .setColor(mc) + .setFooter({text:addedUser.tag,iconURL:addedUser.displayAvatarURL()}) +} + +/** + * + * @param {discord.User} removedUser + * @returns {discord.EmbedBuilder} + */ +exports.removeEmbed = (removedUser) => { + return new embed() + .setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username)) + .setColor(mc) + .setFooter({text:removedUser.tag,iconURL:removedUser.displayAvatarURL()}) +} + +/** + * + * @param {discord.User} closer + * @returns {discord.EmbedBuilder} + */ +exports.closeEmbed = (closer) => { + return new embed() + .setTitle("🔒 "+l.commands.closeTitle) + .setColor(mc) + .setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()}) +} + +/** + * + * @param {discord.User} deleter + * @returns {discord.EmbedBuilder} + */ +exports.deleteEmbed = (deleter) => { + return new embed() + .setTitle("❌ "+l.commands.deleteTitle) + .setColor(mc) + .setFooter({text:deleter.tag,iconURL:deleter.displayAvatarURL()}) +} + +/** + * + * @param {discord.User} renamer + * @param {String} newname + * @returns {discord.EmbedBuilder} + */ +exports.renameEmbed = (renamer,newname) => { + return new embed() + .setTitle("🔄 "+l.commands.renameTitle.replace("{0}",newname)) + .setColor(mc) + .setFooter({text:renamer.tag,iconURL:renamer.displayAvatarURL()}) +} + +/** + * + * @param {discord.User} reopener + * @returns {discord.EmbedBuilder} + */ + exports.reopenEmbed = (reopener) => { + return new embed() + .setTitle("🔓 "+l.commands.reopenTitle) + .setColor(mc) + .setFooter({text:reopener.tag,iconURL:reopener.displayAvatarURL()}) +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/accepted/closing.js b/core/interactionHandlers/handlers/accepted/closing.js new file mode 100644 index 0000000..0fa09ad --- /dev/null +++ b/core/interactionHandlers/handlers/accepted/closing.js @@ -0,0 +1,60 @@ +const discord = require('discord.js') +const bot = require('../../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../../getoptions") +const permissionChecker = require("../../../utils/permisssionChecker") +const storage = bot.storage +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + +module.exports = () => { + //CLOSE + var closeTicketButtonChecker = false + client.on("interactionCreate",async interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTcloseTicketTrue") return + + interaction.deferUpdate() + + if (closeTicketButtonChecker == true) return + closeTicketButtonChecker = true + + const firstcomponents = interaction.message.components + + if (config.system.closeMode == "adminonly"){ + if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ + if (!permissionChecker.sendUserNoPerms(interaction.user)){ + permissionChecker.sendChannelNoPerms(interaction.channel) + } + interaction.message.edit({components:firstcomponents}) + } + } + + interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) + + /** + * @type {String} + */ + const name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) + await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true) + closeTicketButtonChecker = false + }) +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/accepted/reopening.js b/core/interactionHandlers/handlers/accepted/reopening.js new file mode 100644 index 0000000..4b404b5 --- /dev/null +++ b/core/interactionHandlers/handlers/accepted/reopening.js @@ -0,0 +1,29 @@ +const discord = require('discord.js') +const bot = require('../../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../../getoptions") +const permissionChecker = require("../../../utils/permisssionChecker") +const storage = bot.storage +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + +module.exports = () => { + //REOPEN + client.on("interactionCreate",(interaction) => { + if (!interaction.isButton()) return + if (interaction.customId != "OTreopenTicket") return + + interaction.deferUpdate() + interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) + require("../../../ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user) + }) +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/firstmsg.js b/core/interactionHandlers/handlers/firstmsg.js new file mode 100644 index 0000000..bf340db --- /dev/null +++ b/core/interactionHandlers/handlers/firstmsg.js @@ -0,0 +1,21 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const storage = bot.storage +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + + +module.exports = () => { + +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/handlers.js b/core/interactionHandlers/handlers/handlers.js new file mode 100644 index 0000000..b3d1ac7 --- /dev/null +++ b/core/interactionHandlers/handlers/handlers.js @@ -0,0 +1,9 @@ +module.exports = () => { + require("./firstmsg")() + require("./sendTranscript")() + require("./verifyBars")() + + //accepted + require("./accepted/closing")() + require("./accepted/reopening")() +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/sendTranscript.js b/core/interactionHandlers/handlers/sendTranscript.js new file mode 100644 index 0000000..6321979 --- /dev/null +++ b/core/interactionHandlers/handlers/sendTranscript.js @@ -0,0 +1,42 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const storage = bot.storage +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + + +module.exports = () => { + client.on("interactionCreate",async (interaction) => { + if (!interaction.isButton()) return + if (interaction.customId != "OTsendTranscript") return + + interaction.deferUpdate() + + const channelmessages = await interaction.channel.messages.fetch() + + channelmessages.sweep((msgSweep) => { + return msgSweep.author.id == client.user.id + }) + + var fileattachment = await require("../../transcript").createTranscript(channelmessages,interaction.channel) + + if (fileattachment == false){ + log("system","internal error: transcript is not created!") + interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]}) + return + } + + interaction.channel.send({content:"**"+l.messages.hereIsTheTranscript+"**",files:[fileattachment]}) + }) +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/verifyBars.js b/core/interactionHandlers/handlers/verifyBars.js new file mode 100644 index 0000000..941a3cd --- /dev/null +++ b/core/interactionHandlers/handlers/verifyBars.js @@ -0,0 +1,35 @@ +const discord = require('discord.js') +const bot = require('../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../getoptions") +const storage = bot.storage +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + +module.exports = () => { + //CLOSE + client.on("interactionCreate",interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTcloseTicket") return + + interaction.deferUpdate() + interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]}) + + }) + client.on("interactionCreate",interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTcloseTicketFalse") return + + interaction.deferUpdate() + interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) + }) +} \ No newline at end of file diff --git a/core/slashSystem/slashEnable.js b/core/slashSystem/slashEnable.js index 2fa1510..ee86197 100644 --- a/core/slashSystem/slashEnable.js +++ b/core/slashSystem/slashEnable.js @@ -29,10 +29,10 @@ module.exports = async () => { var readystats = 0 - process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)") + //process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)") setInterval(() => { process.stdout.cursorTo(0) - process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 9")+" commands ready! (this can take up to 40 seconds)") + process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 10")+" commands ready! (this can take up to 40 seconds)") if (readystats >= 10){ console.log(chalk.green("\nready!")) console.log(chalk.bgBlue("you can now start the bot with 'npm start'!")) diff --git a/core/ticketCloser.js b/core/ticketCloser.js index 9654066..8ac3292 100755 --- a/core/ticketCloser.js +++ b/core/ticketCloser.js @@ -38,13 +38,17 @@ exports.runThis = () => { * @param {discord.TextChannel} channel * @param {String} prefix * @param {"delete"|"close"|"deletenotranscript"} mode + * @param {Boolean} nomessage + * @param {String} reason only when closing, not when deleting! */ -exports.NEWcloseTicket = async (member,channel,prefix,mode) => { +exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => { const guild = channel.guild const user = member.user const chalk = await (await import("chalk")).default const channelmessages = await channel.messages.fetch() + const newReason = reason ? reason : "none" + //start code //remove ot bot from transcript @@ -80,7 +84,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { //start delete proccess deleteRequired = true - await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) + if (!nomessage){ + await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) + } log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) @@ -92,7 +98,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("./getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) @@ -159,7 +165,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("./getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) if (!ticketData) return @@ -188,38 +194,40 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { channel.permissionOverwrites.set(permissionArray) - //message - var closeButtonRow = new discord.ActionRowBuilder() - .addComponents( - new discord.ButtonBuilder() - .setCustomId("deleteTicket1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Danger) - .setLabel(l.buttons.delete) - .setEmoji("✖️") - ) - .addComponents( - new discord.ButtonBuilder() - .setCustomId("sendTranscript") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setLabel(l.buttons.sendTranscript) - .setEmoji("📄") - ) - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicket") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Success) - .setLabel(l.buttons.reopen) - .setEmoji("✔") - ) - - const embed = new discord.EmbedBuilder() - .setColor(config.main_color) - .setTitle(":lock: "+l.messages.closedTitle+" :lock:") - .setDescription(l.messages.closedDescription) - channel.send({embeds:[embed],components:[closeButtonRow]}) + if (!nomessage){ + //message + var closeButtonRow = new discord.ActionRowBuilder() + .addComponents( + new discord.ButtonBuilder() + .setCustomId("OTdeleteTicket1") + .setDisabled(false) + .setStyle(discord.ButtonStyle.Danger) + .setLabel(l.buttons.delete) + .setEmoji("✖️") + ) + .addComponents( + new discord.ButtonBuilder() + .setCustomId("OTsendTranscript") + .setDisabled(false) + .setStyle(discord.ButtonStyle.Secondary) + .setLabel(l.buttons.sendTranscript) + .setEmoji("📄") + ) + .addComponents( + new discord.ButtonBuilder() + .setCustomId("OTreopenTicket") + .setDisabled(false) + .setStyle(discord.ButtonStyle.Success) + .setLabel(l.buttons.reopen) + .setEmoji("✔") + ) + + const embed = new discord.EmbedBuilder() + .setColor(config.main_color) + .setTitle(":lock: "+l.messages.closedTitle+" :lock:") + .setDescription(l.messages.closedDescription) + channel.send({embeds:[embed],components:[closeButtonRow]}) + } log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) @@ -230,9 +238,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("./getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) - require("./api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData}) + require("./api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason) const id = firstmsg.embeds[0].author.name @@ -240,7 +248,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { try{ if (config.system.enable_DM_Messages){ - member.send({embeds:[bot.errorLog.custom(l.messages.closedTicketDmTitle,l.messages.closedTicketDmDescription,":ticket:",config.main_color)]}) + member.send({embeds:[bot.errorLog.custom(l.messages.closedTicketDmTitle,l.messages.closedTicketDmDescription+"\n\n**reason:** "+newReason,":ticket:",config.main_color)]}) } } catch{log("system","can't send DM to member, member doesn't allow dm's")} @@ -259,7 +267,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { //start delete proccess enableTranscript = false deleteRequired = true - channel.send({content:"**"+l.messages.gettingdeleted+"**"}) + if (!nomessage){ + await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) + } log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) @@ -271,7 +281,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] - const ticketData = require("./getoptions").getOptionsById("newT"+ticketId) + const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) @@ -291,6 +301,8 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (enableTranscript == true && mode != "deletenotranscript"){ + const transcriptReason = (mode == "close") ? "**reason:** "+newReason : "**reason:** none" + if (config.system.enable_transcript || config.system.enable_DM_transcript){ var fileattachment = await require("./transcript").createTranscript(channelmessages,channel) @@ -300,10 +312,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (config.system.enable_transcript){ const transcriptEmbed = new discord.EmbedBuilder() .setColor(config.main_color) - .setTitle(l.messages.newTranscriptTitle) - .setAuthor({name:user.username,iconURL:user.displayAvatarURL({format:"png"})}) - .setDescription(l.messages.newTranscriptDescription) - .setFooter({text:"ticket: "+channelname}) + .setTitle("📄 "+l.messages.newTranscriptTitle) + .setDescription(transcriptReason) + .setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({ embeds:[transcriptEmbed], @@ -314,9 +325,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode) => { if (config.system.enable_DM_transcript){ const transcriptEmbed = new discord.EmbedBuilder() .setColor(config.main_color) - .setTitle(l.messages.newTranscriptTitle) - .setDescription(l.messages.newTranscriptDescription) - .setFooter({text:"ticket: "+channelname}) + .setTitle("📄 "+l.messages.newTranscriptTitle) + .setDescription(transcriptReason) + .setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) if (!isDatabaseError) ticketOpener.send({ embeds:[transcriptEmbed], diff --git a/core/ticketOpener.js b/core/ticketOpener.js index dce1fbb..d17f973 100755 --- a/core/ticketOpener.js +++ b/core/ticketOpener.js @@ -9,35 +9,19 @@ const getconfigoptions = require("./getoptions") const storage = bot.storage module.exports = () => { - var closeButton = new discord.ActionRowBuilder() - .addComponents( - new discord.ButtonBuilder() - .setCustomId("closeTicket") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setLabel(l.buttons.close) - .setEmoji("🔒") - ) - .addComponents( - new discord.ButtonBuilder() - .setCustomId("deleteTicket") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Danger) - .setLabel(l.buttons.delete) - .setEmoji("✖️") - ) + var closeButton = bot.buttons.firstmsg.firstmsgRowNormal //ticket button click / create ticket client.on("interactionCreate",(interaction) => { if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){ - var customId = "newT"+interaction.options.getString("type") + var customId = "OTnewT"+interaction.options.getString("type") }else if (interaction.isButton()){ var customId = interaction.customId }else return if (interaction.isButton()){ - if (interaction.customId.startsWith("newT")){ - const optionid = interaction.customId.split("newT")[1] + if (interaction.customId.startsWith("OTnewT")){ + const optionid = interaction.customId.split("OTnewT")[1] if (!optionid){ interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]}) return @@ -173,13 +157,19 @@ module.exports = () => { }).then((ticketChannel) => { storage.set("userTicketStorage",ticketChannel.id,interaction.member.id) + + const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}]) var ticketEmbed = new discord.EmbedBuilder() .setAuthor({name:interaction.user.id}) .setColor(config.main_color) .setTitle(currentTicketOptions.name) .setFooter({text:"Ticket Type: "+currentTicketOptions.id}) - if (currentTicketOptions.ticketmessage.length > 0) ticketEmbed.setDescription(currentTicketOptions.ticketmessage) + if (currentTicketOptions.ticketmessage.length > 0){ + ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata) + }else{ + ticketEmbed.setDescription(hiddendata) + } ticketChannel.send({ content:"<@"+interaction.member.id+"> @here", diff --git a/core/ticketReopener.js b/core/ticketReopener.js index 3ebd39f..593edd2 100755 --- a/core/ticketReopener.js +++ b/core/ticketReopener.js @@ -5,8 +5,53 @@ const config = bot.config const log = bot.errorLog.log const l = bot.language const storage = bot.storage +const pfb = discord.PermissionFlagsBits -module.exports = () => { +/** + * + * @param {discord.Guild} guild + * @param {discord.TextBasedChannel} channel + * @param {discord.User} user + * @returns + */ +const reopenTicket = (guild,channel,user) => { + log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}]) + + var permissionsArray = [] + + //set everyone allowed + if (config.system['has@everyoneaccess']){ + var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel] + var everyoneDenyPerms = [] + }else{ + var everyoneAllowPerms = [] + var everyoneDenyPerms = [pfb.ViewChannel] + } + permissionsArray.push({ + id:guild.roles.everyone, + type:"role", + allow:everyoneAllowPerms, + deny:everyoneDenyPerms + }) + + channel.permissionOverwrites.cache.forEach((p) => { + if (p.type == "member"){ + permissionsArray.push({ + id:p.id, + type:"member", + allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel], + deny:[] + }) + } + }) + + channel.permissionOverwrites.set(permissionsArray) + + require("./api/modules/events").onTicketReopen(user,channel,guild,new Date(),{name:channel.name,status:"reopened",ticketOptions:false}) +} +exports.reopenTicket = reopenTicket + +exports.runThis = () => { var closeRowNormal = new discord.ActionRowBuilder() .addComponents( new discord.ButtonBuilder() @@ -92,48 +137,7 @@ module.exports = () => { .setEmoji("🔓") ) - /** - * - * @param {discord.Guild} guild - * @param {discord.TextBasedChannel} channel - * @param {discord.User} user - * @returns - */ - const reopenTicket = (guild,channel,user) => { - log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}]) - - var permissionsArray = [] - - //set everyone allowed - if (config.system['has@everyoneaccess']){ - var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel] - var everyoneDenyPerms = [] - }else{ - var everyoneAllowPerms = [] - var everyoneDenyPerms = [pfb.ViewChannel] - } - permissionsArray.push({ - id:guild.roles.everyone, - type:"role", - allow:everyoneAllowPerms, - deny:everyoneDenyPerms - }) - - channel.permissionOverwrites.cache.forEach((p) => { - if (p.type == "member"){ - permissionsArray.push({ - id:p.id, - type:"member", - allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel], - deny:[] - }) - } - }) - - channel.permissionOverwrites.set(permissionsArray) - - require("./api/modules/events").onTicketReopen(user,channel,guild,new Date(),{name:channel.name,status:"reopened",ticketOptions:false}) - } + @@ -156,8 +160,6 @@ module.exports = () => { }) - const pfb = discord.PermissionFlagsBits - client.on("interactionCreate",(interaction) => { if (!interaction.isButton()) return if (interaction.customId != "reopenTicketTrue") return diff --git a/core/utils/errorTypes.js b/core/utils/errorTypes.js deleted file mode 100644 index 89798fc..0000000 --- a/core/utils/errorTypes.js +++ /dev/null @@ -1,3 +0,0 @@ -/** - * @typedef {String|Boolean} OTErrorType - */ \ No newline at end of file diff --git a/core/utils/getButton.js b/core/utils/getButton.js index 31ec447..5aeff34 100644 --- a/core/utils/getButton.js +++ b/core/utils/getButton.js @@ -37,7 +37,7 @@ exports.getButton = (id) => { if (!option) return false if (option.type == "ticket"){ var button = new discord.ButtonBuilder() - .setCustomId("newT"+option.id) + .setCustomId("OTnewT"+option.id) .setDisabled(false) .setStyle(getColor(option.color)) diff --git a/core/utils/hiddendata.js b/core/utils/hiddendata.js new file mode 100644 index 0000000..9920dd0 --- /dev/null +++ b/core/utils/hiddendata.js @@ -0,0 +1,52 @@ + +/**@typedef {{type:String,data:[{key:String,value:String}]}} hiddenData */ + +/** + * + * @param {String} messageContent + * @returns {hiddenData} + */ + +exports.readHiddenData = (messageContent) => { + //ticketdata//type:123|userid:456) + const rawhidden = messageContent.split("[ ](OTDATA|")[1] + const rawhidden2 = rawhidden.split("//") + + const datatype = rawhidden2[0] + var rawhiddendata = rawhidden2[1] + var rawhiddendataArray = rawhiddendata.split("") + rawhiddendataArray.pop() + + rawhiddendata = rawhiddendataArray.join("") + + const splittedData = rawhiddendata.split("|") + + const resultData = [] + splittedData.forEach((data) => { + // type:123 + const dataresult = data.split(":") + + resultData.push({key:dataresult[0],value:dataresult[1]}) + }) + + return {type:datatype,data:resultData} +} + +/** + * + * @param {String} type + * @param {[{key:String,value:String}]} data + * @returns {String} + */ +exports.writeHiddenData = (type,data) => { + const dataValues = [] + data.forEach((d) => { + dataValues.push(d.key+":"+d.value) + }) + + const datastring = dataValues.join("|") + + const result = "[ ](OTDATA|"+type+"//"+datastring+")" + + return result +} \ No newline at end of file diff --git a/index.js b/index.js index c9ce310..9f5bde3 100644 --- a/index.js +++ b/index.js @@ -26,7 +26,7 @@ const client = new discord.Client({ }) exports.client = client -client.setMaxListeners(30) +client.setMaxListeners(50) if (process.argv[2]){ if (process.argv[2].endsWith("d")){ @@ -48,9 +48,22 @@ if (isDev){ } }else{var config = require('./config.json')} exports.config = config +exports.storage = require('./core/dynamicdatabase/storage') + exports.errorLog = require("./core/errorLogSystem") const log = this.errorLog.log +exports.hiddenData = require("./core/utils/hiddendata") + +exports.embeds = { + commands:require("./core/interactionHandlers/embeds/commands") +} +exports.buttons = { + close:require("./core/interactionHandlers/buttons/close"), + firstmsg:require("./core/interactionHandlers/buttons/firstmsg"), + verifybars:require("./core/interactionHandlers/buttons/verifyBars") +} + client.on('ready',async () => { var statusSet = false const setStatus = (type,text) => { @@ -129,25 +142,26 @@ if (!isDev){ if (process.argv[2] && process.argv[2].startsWith("slash")){ //do nothing }else{ - var storage = require('./core/dynamicdatabase/storage') - exports.storage = storage //commands - require('./commands/ticket')() - require("./commands/help")() - require("./commands/close")() - require("./commands/delete")() - require("./commands/rename")() - require("./commands/add")() - require("./commands/remove")() - require("./commands/reopen")() + require('./commands/ticket')(this) + require("./commands/help")(this) + require("./commands/close")(this) + require("./commands/delete")(this) + require("./commands/rename")(this) + require("./commands/add")(this) + require("./commands/remove")(this) + require("./commands/reopen")(this) //core - require('./core/ticketOpener')() - require("./core/ticketCloser").runThis() - require("./core/closebuttons")() - require("./core/reactionRoles")() - require("./core/ticketReopener")() + require('./core/ticketOpener')(this) + require("./core/ticketCloser").runThis(this) + require("./core/closebuttons")(this) + require("./core/reactionRoles")(this) + require("./core/ticketReopener").runThis(this) + + //InteractionHandlers + require("./core/interactionHandlers/handlers/handlers")() } diff --git a/language/english.json b/language/english.json index 530d5bf..47b495b 100644 --- a/language/english.json +++ b/language/english.json @@ -3,7 +3,8 @@ "missingArgsTitle":"Invalid Arguments!", "missingArgsDescription":"Missing Argument", "noPermsTitle":"No Permissions!", - "noPermsDescription":"You don't have the correct roles to run this command!\nYou need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"Invalid ID", "chooseFromListDescription":"Choose one of the id's below:", "boterror":"Bot Error!", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!" }, "commands":{ - "userAddedTitle":"User Added!", - "userAddedDescription":"{0} is added to this ticket!", - "userRemovedTitle":"User Removed!", - "userRemovedDescription":"{0} is removed from this ticket!", - - "renameTitle":"The name is changed!", - "renameWarning":"Warning: you can only change the channel name 2 times per minute!\n(this is due discord rate limits)", - - "closeTitle":"Close this ticket!", - "closeDescription":"You can close this ticket by clicking on the button below!", - "deleteTitle":"Delete this ticket!", - "deleteDescription":"You can delete this ticket by clicking on the button below!", - "reopenTitle":"Re-Open this ticket!", - "reopenDescription":"You can re-open this ticket by clicking on the button below!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", "ticketWarning":"The embed is in the message below!", "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"Help Menu:", + "title":"Available Commands:", "header1":"**Go to {0} to create a ticket!**\n\n", "header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n", @@ -53,7 +46,7 @@ "close":"Close Ticket", "delete":"Delete Ticket", "reopen":"Re-Open Ticket", - "sendTranscript":"Send Transcript File" + "sendTranscript":"Transcript" }, "messages":{ "reopenTitle":"Re-Opened this ticket!", @@ -71,7 +64,6 @@ "reopenTicketDmTitle":"Ticket Re-opened!", "reopenTicketDmDescription":"Your ticket is re-opened!", "newTranscriptTitle":"A new transcript is here!", - "newTranscriptDescription":"You can find the transcript in the text file above!", "hereIsTheTranscript":"Here is the transcript:", "chooseCategory":"choose a category:", diff --git a/package.json b/package.json index 407b2d3..817eebe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-ticket", - "version": "2.4.0", + "version": "2.5.0", "description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.", "main": "index.js", "scripts": { From 568b2c9beea1814faf70d770d54a9c8f188d7a67 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Fri, 12 Aug 2022 11:20:42 +0200 Subject: [PATCH 2/5] v2.5.0 push 2 --- commands/add.js | 4 +- commands/close.js | 4 +- commands/delete.js | 4 +- commands/remove.js | 4 +- commands/rename.js | 4 +- commands/reopen.js | 4 +- core/interactionHandlers/embeds/commands.js | 23 +++++ .../handlers/accepted/deleting.js | 95 +++++++++++++++++++ core/interactionHandlers/handlers/handlers.js | 1 + .../handlers/sendTranscript.js | 5 +- .../handlers/verifyBars.js | 34 +++++++ core/ticketCloser.js | 25 +++-- core/ticketOpener.js | 4 +- core/transcript.js | 5 +- core/utils/permisssionChecker.js | 28 ++++++ language/english.json | 5 +- 16 files changed, 216 insertions(+), 33 deletions(-) create mode 100644 core/interactionHandlers/handlers/accepted/deleting.js diff --git a/commands/add.js b/commands/add.js index e59c82e..337670a 100644 --- a/commands/add.js +++ b/commands/add.js @@ -24,7 +24,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user)]}) @@ -56,7 +56,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) interaction.reply({embeds:[bot.embeds.commands.addEmbed(user)]}) diff --git a/commands/close.js b/commands/close.js index c117980..2c05d85 100644 --- a/commands/close.js +++ b/commands/close.js @@ -17,7 +17,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author)],components:[bot.buttons.close.closeCommandRow]}) @@ -50,7 +50,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) diff --git a/commands/delete.js b/commands/delete.js index 92a0571..49adc26 100644 --- a/commands/delete.js +++ b/commands/delete.js @@ -22,7 +22,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]}) @@ -60,7 +60,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value interaction.reply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) diff --git a/commands/remove.js b/commands/remove.js index acba3c3..cc6e6c0 100644 --- a/commands/remove.js +++ b/commands/remove.js @@ -24,7 +24,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value msg.channel.permissionOverwrites.delete(user.id) msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user)]}) @@ -56,7 +56,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value interaction.channel.permissionOverwrites.delete(user.id) interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user)]}) diff --git a/commands/rename.js b/commands/rename.js index b9da6d1..1f8a032 100644 --- a/commands/rename.js +++ b/commands/rename.js @@ -22,7 +22,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value var newname = msg.content.split(config.prefix+"rename")[1].substring(1) @@ -66,7 +66,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value var newname = interaction.options.getString("name") var name = interaction.channel.name diff --git a/commands/reopen.js b/commands/reopen.js index 2e7ee04..c12b991 100644 --- a/commands/reopen.js +++ b/commands/reopen.js @@ -16,7 +16,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]}) @@ -38,7 +38,7 @@ module.exports = () => { var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") + const ticketId = hiddendata.data.find(d => d.key == "type").value await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) diff --git a/core/interactionHandlers/embeds/commands.js b/core/interactionHandlers/embeds/commands.js index 425b093..c7bab3e 100644 --- a/core/interactionHandlers/embeds/commands.js +++ b/core/interactionHandlers/embeds/commands.js @@ -81,4 +81,27 @@ exports.renameEmbed = (renamer,newname) => { .setTitle("🔓 "+l.commands.reopenTitle) .setColor(mc) .setFooter({text:reopener.tag,iconURL:reopener.displayAvatarURL()}) +} + +/** + * + * @param {Boolean} done + * @param {discord.TextChannel} channel + * @param {discord.User} author + * @returns {discord.EmbedBuilder} + */ + exports.sendTranscriptEmbed = (done,channel,author) => { + if (done){ + return new embed() + .setTitle("📄 "+l.messages.hereIsTheTranscript) + .setColor(mc) + .setDescription("Ticket: "+channel.name) + .setFooter({text:author.tag,iconURL:author.displayAvatarURL()}) + }else{ + return new embed() + .setTitle("📄 "+l.messages.hereIsTheTranscript) + .setColor(mc) + .setDescription("Loading...") + .setFooter({text:author.tag,iconURL:author.displayAvatarURL()}) + } } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/accepted/deleting.js b/core/interactionHandlers/handlers/accepted/deleting.js new file mode 100644 index 0000000..a2b39a4 --- /dev/null +++ b/core/interactionHandlers/handlers/accepted/deleting.js @@ -0,0 +1,95 @@ +const discord = require('discord.js') +const bot = require('../../../../index') +const client = bot.client +const config = bot.config +const l = bot.language +const log = bot.errorLog.log + +const getconfigoptions = require("../../../getoptions") +const permissionChecker = require("../../../utils/permisssionChecker") +const storage = bot.storage +const hiddendata = bot.hiddenData +const embed = discord.EmbedBuilder +const mc = config.main_color + +const button = discord.ButtonBuilder +const arb = discord.ActionRowBuilder +const bs = discord.ButtonStyle + +module.exports = () => { + //DELETE + var deleteTicketButtonChecker = false + client.on("interactionCreate",async interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTdeleteTicketTrue") return + + interaction.deferUpdate() + + if (deleteTicketButtonChecker == true) return + deleteTicketButtonChecker = true + + const firstcomponents = bot.buttons.close.openRowNormal + + if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ + if (!permissionChecker.sendUserNoDelete(interaction.user)){ + permissionChecker.sendChannelNoDelete(interaction.channel) + } + interaction.message.edit({components:firstcomponents}) + } + + /** + * @type {String} + */ + const name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) + await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) + console.log("hi") + await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) + deleteTicketButtonChecker = false + }) + + //DELETE NO TRANSCRIPT + var deleteTicketButtonChecker = false + client.on("interactionCreate",async interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTdeleteTicketTrue1") return + + interaction.deferUpdate() + + if (deleteTicketButtonChecker == true) return + deleteTicketButtonChecker = true + + const firstcomponents = bot.buttons.close.openRowNormal + + if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ + if (!permissionChecker.sendUserNoDelete(interaction.user)){ + permissionChecker.sendChannelNoDelete(interaction.channel) + } + interaction.message.edit({components:firstcomponents}) + } + + /** + * @type {String} + */ + const name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } + }) + + interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) + await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) + deleteTicketButtonChecker = false + }) +} \ No newline at end of file diff --git a/core/interactionHandlers/handlers/handlers.js b/core/interactionHandlers/handlers/handlers.js index b3d1ac7..6685c5d 100644 --- a/core/interactionHandlers/handlers/handlers.js +++ b/core/interactionHandlers/handlers/handlers.js @@ -6,4 +6,5 @@ module.exports = () => { //accepted require("./accepted/closing")() require("./accepted/reopening")() + require("./accepted/deleting")() } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/sendTranscript.js b/core/interactionHandlers/handlers/sendTranscript.js index 6321979..9d2c2ba 100644 --- a/core/interactionHandlers/handlers/sendTranscript.js +++ b/core/interactionHandlers/handlers/sendTranscript.js @@ -22,6 +22,7 @@ module.exports = () => { if (interaction.customId != "OTsendTranscript") return interaction.deferUpdate() + const tsmsg = await interaction.channel.send({embeds:[bot.embeds.commands.sendTranscriptEmbed(false,interaction.channel,interaction.user)]}) const channelmessages = await interaction.channel.messages.fetch() @@ -33,10 +34,10 @@ module.exports = () => { if (fileattachment == false){ log("system","internal error: transcript is not created!") - interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]}) + tsmsg.edit({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]}) return } - interaction.channel.send({content:"**"+l.messages.hereIsTheTranscript+"**",files:[fileattachment]}) + tsmsg.edit({embeds:[bot.embeds.commands.sendTranscriptEmbed(true,interaction.channel,interaction.user)],files:[fileattachment]}) }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/verifyBars.js b/core/interactionHandlers/handlers/verifyBars.js index 941a3cd..a85f388 100644 --- a/core/interactionHandlers/handlers/verifyBars.js +++ b/core/interactionHandlers/handlers/verifyBars.js @@ -32,4 +32,38 @@ module.exports = () => { interaction.deferUpdate() interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) }) + + //DELETE + client.on("interactionCreate",interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTdeleteTicket") return + + interaction.deferUpdate() + interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]}) + + }) + client.on("interactionCreate",interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTdeleteTicketFalse") return + + interaction.deferUpdate() + interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) + }) + + //DELETE NO TRANSCRIPT + client.on("interactionCreate",interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTdeleteTicket1") return + + interaction.deferUpdate() + interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]}) + + }) + client.on("interactionCreate",interaction => { + if (!interaction.isButton()) return + if (interaction.customId != "OTdeleteTicketFalse1") return + + interaction.deferUpdate() + interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) + }) } \ No newline at end of file diff --git a/core/ticketCloser.js b/core/ticketCloser.js index 8ac3292..4697bc2 100755 --- a/core/ticketCloser.js +++ b/core/ticketCloser.js @@ -94,16 +94,14 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => //getID & send DM & send api event await channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type").value.value const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) - if (!firstmsg.embeds[0].author) return false - const id = firstmsg.embeds[0].author.name + const id = hiddendata.data.find(d => d.key == "openerid").value if (!id) return false @@ -162,9 +160,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => //add ticket adminroles await channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) if (!ticketData) return @@ -235,14 +233,14 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => //getID & send DM & send api event await channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) require("./api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason) - const id = firstmsg.embeds[0].author.name + const id = hiddendata.data.find(d => d.key == "openerid").value if (!id) return false @@ -277,15 +275,14 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => //getID & send DM & send api event await channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - - const ticketId = firstmsg.embeds[0].footer.text.split("Ticket Type: ")[1] + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) - const id = firstmsg.embeds[0].author.name + const id = hiddendata.data.find(d => d.key == "openerid").value if (!id) return false diff --git a/core/ticketOpener.js b/core/ticketOpener.js index d17f973..17a1d19 100755 --- a/core/ticketOpener.js +++ b/core/ticketOpener.js @@ -161,10 +161,10 @@ module.exports = () => { const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}]) var ticketEmbed = new discord.EmbedBuilder() - .setAuthor({name:interaction.user.id}) + //.setAuthor({name:interaction.user.id}) .setColor(config.main_color) .setTitle(currentTicketOptions.name) - .setFooter({text:"Ticket Type: "+currentTicketOptions.id}) + //.setFooter({text:"Ticket Type: "+currentTicketOptions.id}) if (currentTicketOptions.ticketmessage.length > 0){ ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata) }else{ diff --git a/core/transcript.js b/core/transcript.js index 4140271..fcbd111 100755 --- a/core/transcript.js +++ b/core/transcript.js @@ -18,10 +18,11 @@ const getUserInfo = (channel) => { } channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false + const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) + const ticketId = hiddendata.data.find(d => d.key == "type") - const id = firstmsg.embeds[0].author.name ? firstmsg.embeds[0].author.name : false + const id = hiddendata.data.find(d => d.key == "openerid").value result.ticketopener.id = id diff --git a/core/utils/permisssionChecker.js b/core/utils/permisssionChecker.js index 7ae2d02..c1a0192 100644 --- a/core/utils/permisssionChecker.js +++ b/core/utils/permisssionChecker.js @@ -47,6 +47,20 @@ exports.sendUserNoPerms = (user) => { } } +/** + * + * @param {discord.User} user + * @returns {Boolean} + */ + exports.sendUserNoDelete = (user) => { + try { + user.send({embeds:[bot.errorLog.noPermsDelete]}) + return true + }catch{ + return false + } +} + /** * * @param {discord.TextChannel} channel @@ -74,3 +88,17 @@ exports.sendUserNoPerms = (user) => { return false } } + +/** + * + * @param {discord.TextChannel} channel + * @returns {Boolean} + */ + exports.sendChannelNoDelete = (channel) => { + try { + channel.send({embeds:[bot.errorLog.noPermsDelete]}) + return true + }catch{ + return false + } +} diff --git a/language/english.json b/language/english.json index 47b495b..9496227 100644 --- a/language/english.json +++ b/language/english.json @@ -67,6 +67,9 @@ "hereIsTheTranscript":"Here is the transcript:", "chooseCategory":"choose a category:", - "gettingdeleted":"Ticket is getting deleted..." + "gettingdeleted":"Ticket is getting deleted...", + + "none":"none", + "reason":"reason" } } \ No newline at end of file From 08453905696df7b70e07324a58351c020c98019c Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Sun, 14 Aug 2022 21:23:04 +0200 Subject: [PATCH 3/5] v2.5 (added translation for 2 new languages) --- core/utils/warningManager.js | 19 +++++++ index.js | 2 + language/arabic.json | 35 +++++------- language/custom.json | 33 +++++------ language/czech.json | 33 +++++------ language/dutch.json | 73 ++++++++++++------------ language/french.json | 35 +++++------- language/german.json | 35 +++++------- language/romanian.json | 105 +++++++++++++++++------------------ language/spanish.json | 35 +++++------- plugins/example.plugin.js | 3 - 11 files changed, 193 insertions(+), 215 deletions(-) create mode 100644 core/utils/warningManager.js diff --git a/core/utils/warningManager.js b/core/utils/warningManager.js new file mode 100644 index 0000000..702b118 --- /dev/null +++ b/core/utils/warningManager.js @@ -0,0 +1,19 @@ +const discord = require('discord.js') +const bot = require('../../index') +const client = bot.client +const config = bot.config +const log = bot.errorLog.log + +const loadChalk = async () => { + return await (await import("chalk")).default +} + +//ENABLE message for when there is too less translation +const enableNoTranslationMessage = true + +module.exports = async () => { + const chalk = await loadChalk() + if (enableNoTranslationMessage){ + console.log(chalk.red("[warning]"),"WARNING!!\n"+chalk.blue("We have a small problem with translation atm, so it can be that "+chalk.redBright("some translations are in English!")+"\n\nYou can help us if you want by joining our server!\n")) + } +} \ No newline at end of file diff --git a/index.js b/index.js index 9f5bde3..48b8a5f 100644 --- a/index.js +++ b/index.js @@ -84,6 +84,7 @@ client.on('ready',async () => { if (!process.argv[2]){ console.log(chalk.red("WELCOME TO OPEN TICKET!")) log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) + require("./core/utils/warningManager")() console.log(chalk.blue("\n\nlogs:")+"\n============") if (config.status.enabled){ @@ -105,6 +106,7 @@ client.on('ready',async () => { if (!process.argv[2].startsWith("slash")){ console.log(chalk.red("WELCOME TO OPEN TICKET!")) log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) + require("./core/utils/warningManager")() console.log(chalk.blue("\n\nlogs:")+"\n============") if (config.status.enabled){ diff --git a/language/arabic.json b/language/arabic.json index b48c61e..eb5fd1b 100644 --- a/language/arabic.json +++ b/language/arabic.json @@ -3,7 +3,8 @@ "missingArgsTitle":"حجج باطلة", "missingArgsDescription":"حجة مفقودة", "noPermsTitle":"ليس لديك إذن", - "noPermsDescription":"ليس لديك إذن لاستخدام هذا\nأنت بحاجة إلى إذن 'ADMINISTRATOR' أو أن تكون في قائمة الأدوار المسموح بها!", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"بطاقة التعريف غير صالحة", "chooseFromListDescription":"اختر أحد المعرفات أدناه:", "boterror":"مشكلة في الروبوت", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!" }, "commands":{ - "userAddedTitle":"تمت إضافة المستخدم!", - "userAddedDescription":"{0} يضاف إلى هذه التذكرة!", - "userRemovedTitle":"تمت إزالة المستخدم!", - "userRemovedDescription":"{0} تمت إزالته من هذه التذكرة!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", - "renameTitle":"تم تغيير الاسم!", - "renameWarning":"تحذير: يمكنك فقط تغيير اسم القناة مرتين في الدقيقة!\n(هذا يرجع إلى حدود معدل الخلاف)", - - "closeTitle":"أغلق هذه التذكرة!", - "closeDescription":"يمكنك إغلاق هذه التذكرة بالضغط على الزر أدناه!", - "deleteTitle":"احذف هذه التذكرة!", - "deleteDescription":"يمكنك حذف هذه التذكرة بالضغط على الزر أدناه!", - "reopenTitle":"أعد فتح هذه التذكرة!", - "reopenDescription":"يمكنك إعادة فتح هذه التذكرة بالضغط على الزر أدناه!", - - "ticketWarning":"التضمين في الرسالة أدناه!", - "maxTicketWarning":"**تحذير:** _يمكنك فقط إنشاء ملفات {0} تذكرة في كل مرة!_" + "ticketWarning":"The embed is in the message below!", + "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"قائمة التعليمات:", + "title":"Available Commands:", "header1":"**اذهب إلى {0} لإنشاء تذكرة!**\n\n", "header2":"**قم بتشغيل الأمر `/new` أو `/ticket` لإنشاء تذكرة!**\n\n", @@ -71,10 +64,12 @@ "reopenTicketDmTitle":"أعيد فتح التذكرة!", "reopenTicketDmDescription":"تم إعادة فتح تذكرتك!", "newTranscriptTitle":"نسخة جديدة هنا!", - "newTranscriptDescription":"يمكنك العثور على النص في الملف النصي أعلاه!", "hereIsTheTranscript":"هذا هو النص:", "chooseCategory":"اختر فئة:", - "gettingdeleted":"...يتم حذف التذكرة" + "gettingdeleted":"...يتم حذف التذكرة", + + "none":"none", + "reason":"reason" } } \ No newline at end of file diff --git a/language/custom.json b/language/custom.json index 530d5bf..9496227 100644 --- a/language/custom.json +++ b/language/custom.json @@ -3,7 +3,8 @@ "missingArgsTitle":"Invalid Arguments!", "missingArgsDescription":"Missing Argument", "noPermsTitle":"No Permissions!", - "noPermsDescription":"You don't have the correct roles to run this command!\nYou need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"Invalid ID", "chooseFromListDescription":"Choose one of the id's below:", "boterror":"Bot Error!", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!" }, "commands":{ - "userAddedTitle":"User Added!", - "userAddedDescription":"{0} is added to this ticket!", - "userRemovedTitle":"User Removed!", - "userRemovedDescription":"{0} is removed from this ticket!", - - "renameTitle":"The name is changed!", - "renameWarning":"Warning: you can only change the channel name 2 times per minute!\n(this is due discord rate limits)", - - "closeTitle":"Close this ticket!", - "closeDescription":"You can close this ticket by clicking on the button below!", - "deleteTitle":"Delete this ticket!", - "deleteDescription":"You can delete this ticket by clicking on the button below!", - "reopenTitle":"Re-Open this ticket!", - "reopenDescription":"You can re-open this ticket by clicking on the button below!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", "ticketWarning":"The embed is in the message below!", "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"Help Menu:", + "title":"Available Commands:", "header1":"**Go to {0} to create a ticket!**\n\n", "header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n", @@ -53,7 +46,7 @@ "close":"Close Ticket", "delete":"Delete Ticket", "reopen":"Re-Open Ticket", - "sendTranscript":"Send Transcript File" + "sendTranscript":"Transcript" }, "messages":{ "reopenTitle":"Re-Opened this ticket!", @@ -71,10 +64,12 @@ "reopenTicketDmTitle":"Ticket Re-opened!", "reopenTicketDmDescription":"Your ticket is re-opened!", "newTranscriptTitle":"A new transcript is here!", - "newTranscriptDescription":"You can find the transcript in the text file above!", "hereIsTheTranscript":"Here is the transcript:", "chooseCategory":"choose a category:", - "gettingdeleted":"Ticket is getting deleted..." + "gettingdeleted":"Ticket is getting deleted...", + + "none":"none", + "reason":"reason" } } \ No newline at end of file diff --git a/language/czech.json b/language/czech.json index 11ce8ef..65f95f4 100644 --- a/language/czech.json +++ b/language/czech.json @@ -3,7 +3,8 @@ "missingArgsTitle":"Neplatné argumenty", "missingArgsDescription":"Chybí argumenty", "noPermsTitle":"Nemáš práva!", - "noPermsDescription":"Nemáš dostatečné práva na tento příkaz!\n Potřebuješ ADMINISTRATOR aby jsi mohl provést příkaz!", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"Neplatné ID", "chooseFromListDescription":"Vyber si z těchto ID:", "boterror":"Error!", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"Něco je špatně s transcriptem!**\nProsím zkus to příště znovu!" }, "commands":{ - "userAddedTitle":"Uživatel přidán!", - "userAddedDescription":"{0} je přidán do ticketu!", - "userRemovedTitle":"Uživatel odebrán!", - "userRemovedDescription":"{0} je odstraněn z ticketu!", - - "renameTitle":"Jméno bylo změněno!", - "renameWarning":"Varování: jméno kanálu můžeš změnit pouze 2x za minutu!", - - "closeTitle":"Zavři tento ticket!", - "closeDescription":"Můžeš zavřít ticket kliknutím na tlačítko níže!", - "deleteTitle":"Smaž tento ticket!", - "deleteDescription":"Můžeš smazat ticket kliknutím na tlačítko níže!", - "reopenTitle":"Znovu otevři ticket!", - "reopenDescription":"Můžeš znovu otevřít tento ticket kliknutínm na tlačítko níže!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", "ticketWarning":"The embed is in the message below!", - "maxTicketWarning":"**Varovaní:** _Můžeš si vytvořit použe {0} ticket(s) v jednu chvíli!_" + "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"Příkazy:", + "title":"Available Commands:", "header1":"**Běž {0} vytvořit si ticket!**\n\n", "header2":"**Použij příkaz `/new` nebo `/ticket` k vytvoření ticketu!**\n\n", @@ -71,9 +64,11 @@ "reopenTicketDmTitle":"Ticket znovu otevřen!", "reopenTicketDmDescription":"Tvůj ticket byl znovu otevřen!", "newTranscriptTitle":"Nový log ticketu je zde!", - "newTranscriptDescription":"Zde najdeš log svého ticketu!", "hereIsTheTranscript":"Zde je log:", - "chooseCategory":"Vyber kategorii:" + "chooseCategory":"Vyber kategorii:", + + "none":"none", + "reason":"reason" } } \ No newline at end of file diff --git a/language/dutch.json b/language/dutch.json index 952ec39..145e72c 100644 --- a/language/dutch.json +++ b/language/dutch.json @@ -1,67 +1,60 @@ { "errors":{ - "missingArgsTitle":"Ongeldige Argumenten!", - "missingArgsDescription":"Geen Argument", + "missingArgsTitle":"Onjuiste parameters!", + "missingArgsDescription":"Er missen parameters", "noPermsTitle":"Geen permissies!", - "noPermsDescription":"Je hebt niet de juiste rollen om deze command uit te voeren!\nJe hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane rollen zitten!", - "chooseFromListTitle":"Ongeldig ID", - "chooseFromListDescription":"Kies een van deze id's:", + "noPermsDescription":"Je hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane users staan!", + "noPermsDelete":"Alleen admins kunnen een ticket sluiten!", + "chooseFromListTitle":"Onjuist ID", + "chooseFromListDescription":"Kies een van de id's hier onder:", "boterror":"Bot Error!", "notInTicketTitle":"Je bent niet in een ticket!", "notInTicketDescription":"Deze command werkt niet buiten tickets!", "ticketDoesntExist":"Dit ticket bestaat niet meer!", "roleDoesntExist":"Deze rol bestaat niet meer!", - "anotherOption":"Deze optie is geen ticket maar een ander type!", - "maxAmountTitle":"Max aantal bereikt!", - "maxAmountDescription":"Je hebt het maximum aantal openstaande ticket bereikt!\nDus je kan er geen nieuwe maken!", + "anotherOption":"Deze optie is niet een ticket, maar een ander type!", + "maxAmountTitle":"Maximum numer bereikt!", + "maxAmountDescription":"Je hebt het maximum aantal openstaande tickets bereikt!\nDus je kan geen nieuwe meer maken!", "somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!", - "somethingWentWrongTranscript":"Iets ging fout bij het maken van het transcript!**\nProbeer een andere keer opnieuw!" + "somethingWentWrongTranscript":"Iets ging fout terwijl het transcript gemaakt werd!**\nProbeer een andere keer opnieuw!" }, "commands":{ - "userAddedTitle":"User Toegevoegd!", - "userAddedDescription":"{0} is toegevoegd aan dit ticket!", - "userRemovedTitle":"User Verwijderd!", - "userRemovedDescription":"{0} is verwijderd van dit ticket!", - - "renameTitle":"De naam is veranderd!", - "renameWarning":"Waarschuwing: je kan de kanaalnaam maar 2 keer per minuut veranderen!\n(dit heeft te maken met discord rate limits)", - - "closeTitle":"Sluit dit ticket!", - "closeDescription":"Je kan dit ticket sluiten door op de knop hier onder te duwen!", - "deleteTitle":"Verwijder dit ticket!", - "deleteDescription":"Je kan dit ticket verwijderen door op de knop hier onder te duwen!", - "reopenTitle":"Heropen dit ticket!", - "reopenDescription":"Je kan dit ticket heropenen door op de knop hier onder te duwen!", + "userAddedTitle":"{0} is toegevoegd aan dit ticket!", + "userRemovedTitle":"{0} is verwijderd van dit ticket!", + "renameTitle":"De naam is veranderd naar {0}!", + "closeTitle":"Ticket gesloten!", + "deleteTitle":"Ticket aan het verwijderen...", + "reopenTitle":"Ticket heropend!", "ticketWarning":"De embed is in het bericht hier onder!", - "maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd aanmaken!_" + "maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd maken!_" }, "helpMenu":{ - "title":"Help Menu:", + "title":"Beschikbare Commands:", "header1":"**Ga naar {0} om een ticket te maken!**\n\n", "header2":"**Run de command `/new` of `/ticket` om een ticket te maken!**\n\n", - "msgCmd":"Spawn een embed met knoppen. (admins only)", + "msgCmd":"Spawn een embed met knoppen. (alleen admins)", "renameCmd":"Hernoem een ticket. (geen spaties)", "closeCmd":"Sluit een ticket.", - "deleteCmd":"Verwijder een ticket.", - "addCmd":"Voeg een user toe aan een ticket.", + "deleteCmd":"Verijder een ticket.", + "addCmd":"Voeg een user aan een ticket.", "removeCmd":"Verwijder een user van een ticket.", - "reopenCmd":"Heropen een ticket nadat het gesloten wordt." + "reopenCmd":"Heropen een ticket nadat het gesloten is." }, "buttons":{ "close":"Sluit Ticket", "delete":"Verwijder Ticket", "reopen":"Heropen Ticket", - "sendTranscript":"Stuur Transcript Bestand" + "sendTranscript":"Transcript" }, "messages":{ - "reopenTitle":"Dit ticket is terug geopend!", - "reopenDescription":"Voel vrij om terug te praten!", - "closedTitle":"Dit ticket is gesloten!", - "closedDescription":"Nu kunnen alleen nog admins praten in dit ticket!\n\n*Klik op de knop hier onder om het ticket terug te openen of te verwijderen!*", - "createdTitle":"Ticket Gemaakt!", - "createdDescription":"Je ticket is gemaakt, je kan het detecteren bij een ping!", + "reopenTitle":"Ticket heropend!", + "reopenDescription":"Voel vrij om weer te praten!", + "closedTitle":"Ticket gesloten!", + "closedDescription":"Alleen admins kunnen nog praten.\n\n*Klik op de knoppen hieronder voor meer acties!*", + "createdTitle":"Ticket Aangemaakt!", + "createdDescription":"U ticket is gemaakt, je kan het detecteren bij een ping!", "newTicketDmTitle":"Nieuw Ticket!", "closedTicketDmTitle":"Ticket Gesloten!", @@ -70,11 +63,13 @@ "deletedTicketDmDescription":"Je ticket is verwijderd!", "reopenTicketDmTitle":"Ticket Heropend!", "reopenTicketDmDescription":"Je ticket is heropend!", - "newTranscriptTitle":"Een nieuw transcript is hier!", - "newTranscriptDescription":"Je kan het transcript vinden in het bestand hierboven!", + "newTranscriptTitle":"Er is een nieuw transcript!", "hereIsTheTranscript":"Hier is het transcript:", "chooseCategory":"kies een categorie:", - "gettingdeleted":"Ticket wordt verwijderd..." + "gettingdeleted":"Ticket wordt verwijderd...", + + "none":"geen", + "reason":"reden" } } \ No newline at end of file diff --git a/language/french.json b/language/french.json index d8843e3..6bafbc8 100644 --- a/language/french.json +++ b/language/french.json @@ -3,7 +3,8 @@ "missingArgsTitle":"Arguments invalides !", "missingArgsDescription":"Argument manquant", "noPermsTitle":"Pas de permissions!", - "noPermsDescription":"Vous n'avez pas les bons rôles pour exécuter cette commande !\nVous avez besoin de la permission `ADMINISTRATOR` ou d'être dans la liste des rôles autorisés !", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"Invalid ID", "chooseFromListDescription":"Choisissez l'un des identifiants ci-dessous:", "boterror":"Bot Error!", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription !**\nVeuillez réessayer une autre fois !" }, "commands":{ - "userAddedTitle":"Utilisateur ajouté !", - "userAddedDescription":"{0} est ajouté à ce billet !", - "userRemovedTitle":"Utilisateur supprimé!", - "userRemovedDescription":"{0} est supprimé de ce ticket!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", - "renameTitle":"Le nom est changé !", - "renameWarning":"Attention : vous ne pouvez modifier le nom de la chaîne que 2 fois par minute !\n(ceci est dû aux limites du taux de discorde)", - - "closeTitle":"Fermez ce ticket !", - "closeDescription":"Vous pouvez fermer ce ticket en cliquant sur le bouton ci-dessous !", - "deleteTitle":"Supprimez ce billet !", - "deleteDescription":"Vous pouvez supprimer ce ticket en cliquant sur le bouton ci-dessous !", - "reopenTitle":"Ré-ouvrez ce ticket !", - "reopenDescription":"Vous pouvez rouvrir ce ticket en cliquant sur le bouton ci-dessous !", - - "ticketWarning":"L'intégration est dans le message ci-dessous !", - "maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} billet(s) à la fois !_" + "ticketWarning":"The embed is in the message below!", + "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"Menu d'aide:", + "title":"Available Commands:", "header1":"**Allez à {0} pour créer un ticket !**\n\n", "header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket!**\n\n", @@ -65,10 +58,12 @@ "newTicketDmTitle":"Nouveau ticket!", "newTranscriptTitle":"Une nouvelle transcription est ici!", - "newTranscriptDescription":"Vous pouvez trouver la transcription dans le fichier texte ci-dessus !", "hereIsTheTranscript":"Voici la transcription :", "chooseCategory":"choisissez une catégorie:", - "gettingdeleted":"Le ticket est en cours de suppression..." + "gettingdeleted":"Le ticket est en cours de suppression...", + + "none":"none", + "reason":"reason" } } \ No newline at end of file diff --git a/language/german.json b/language/german.json index f4b99b2..01d29a7 100644 --- a/language/german.json +++ b/language/german.json @@ -3,7 +3,8 @@ "missingArgsTitle":"Ungültiges Argument!", "missingArgsDescription":"Fehlendes Argument!", "noPermsTitle":"Du hast keine Rechte!", - "noPermsDescription":"Sie haben nicht die richtigen Rollen, um diesen Befehl auszuführen!\nSie benötigen die `ADMINISTRATOR` Erlaubnis oder in der Liste der erlaubten Rollen sein!", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"Ungültige ID", "chooseFromListDescription":"Wählen Sie eine der folgenden ID:", "boterror":"Bot Fehler!", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"Bei der Erstellung der Transcript ist etwas schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!" }, "commands":{ - "userAddedTitle":"User geaddet!", - "userAddedDescription":"{0} wird zu diesem Ticket hinzugefügt!", - "userRemovedTitle":"User entfernt!", - "userRemovedDescription":"{0} wird aus diesem Ticket entfernt!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", - "renameTitle":"Der Name wurde geändert!", - "renameWarning":"Achtung: Sie können den Kanalnamen nur 2 Mal pro Minute ändern!\n(dies ist auf die Begrenzung der Diskordrate zurückzuführen)", - - "closeTitle":"Dieses Ticket schließen!", - "closeDescription":"Sie können dieses Ticket schließen, indem Sie auf die Schaltfläche unten klicken!", - "deleteTitle":"Löschen Sie dieses Ticket!", - "deleteDescription":"Sie können dieses Ticket löschen, indem Sie auf die Schaltfläche unten klicken!", - "reopenTitle":"Öffne dieses Ticket erneut!", - "reopenDescription":"Sie können dieses Ticket erneut öffnen, indem Sie auf die Schaltfläche unten klicken!", - - "ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!", - "maxTicketWarning":"**Warnung:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_" + "ticketWarning":"The embed is in the message below!", + "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"Hilfe Menu:", + "title":"Available Commands:", "header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n", "header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n", @@ -71,10 +64,12 @@ "reopenTicketDmTitle":"Ticket neu Eröffnen!", "reopenTicketDmDescription":"Dein Ticket ist Neu eröffnet!", "newTranscriptTitle":"Eine neue Transscript finden Sie hier!", - "newTranscriptDescription":"Die Abschrift finden Sie in der obigen Textdatei!", "hereIsTheTranscript":"Hier ist das Transscript:", "chooseCategory":"Wähle eine Kategorie:", - "gettingdeleted":"Ticket wird gelöscht..." + "gettingdeleted":"Ticket wird gelöscht...", + + "none":"none", + "reason":"reason" } } \ No newline at end of file diff --git a/language/romanian.json b/language/romanian.json index 9755af1..42f906d 100644 --- a/language/romanian.json +++ b/language/romanian.json @@ -1,80 +1,75 @@ { "errors":{ - "missingArgsTitle":"Argumente invalide!", - "missingArgsDescription":"Argument lipsa", - "noPermsTitle":"Nu ai permisiunile necesare!", - "noPermsDescription":"Nu ai rolurile necesare!\nAi nevoie de permisiunea `ADMINISTRATOR` sau sa fii in lista rolurilor permise!", - "chooseFromListTitle":"ID invalid", + "missingArgsTitle":"Argumente Invalide", + "missingArgsDescription":"Argument Lipsa", + "noPermsTitle":"Nu ai permisiunea necesara!", + "noPermsDescription":"Ai nevoie de permisiunea de `ADMINISTRATOR`!", + "noPermsDelete":"Doar adminii pot inchide un ticket!", + "chooseFromListTitle":"Invalid ID", "chooseFromListDescription":"Alege unul dintre id-urile urmatoare:", "boterror":"Eroare bot!", "notInTicketTitle":"Nu esti intr-un ticket!", - "notInTicketDescription":"Aceasta comanda nu functioneaza in afara ticket-urilor!", + "notInTicketDescription":"Aceasta comanda nu merge inafara unui ticket!", "ticketDoesntExist":"Acest ticket nu mai exista!", - "roleDoesntExist":"Acest rol nu mai exista", - "anotherOption":"Aceasta optiune nu este un ticket ci doar alt tip!", - "maxAmountTitle":"Limita a fost atinsa", - "maxAmountDescription":"Ai atins limita maxima de tickete\nNu mai poti creea altele!", - "somethingWentWrong":"**Ceva nu a mers bine :(**\nTe rugam sa incerci din nou mai tarziu", - "somethingWentWrongTranscript":"**Ceva nu a mers bine in timpul creerii copiei a ticket-ului!**\nTe rugam sa incerci din nou mai tarziu!" - }, + "roleDoesntExist":"Acest rol nu mai exista!", + "anotherOption":"Aceasta optiune este altceva decat un tip de ticket!", + "maxAmountTitle":"Limita atinsa!", + "maxAmountDescription":"Ai atins limita de tickets!\nAsa ca nu mai poti creea altele noi!", + "somethingWentWrong":"**Ceva nu a mers bine!**\nTe rugam sa incerci mai tarziu!", + "somethingWentWrongTranscript":"Ceva nu aa mers bine in timpul creeari transcript-ului!**\nTe rugam sa incerci mai tarziu!" + }, "commands":{ - "userAddedTitle":"Utilizator adaugat!", - "userAddedDescription":"{0} este adaugat la acest ticket!", - "userRemovedTitle":"Utilizator eliminat!", - "userRemovedDescription":"{0} este eliminat din acest ticket!", + "userAddedTitle":"{0} a fost adaugat in acest ticket!", + "userRemovedTitle":"{0} a fost scos din acest ticket!", + "renameTitle":"Nume schimbat in {0}!", + "closeTitle":"Ticket inchis!", + "deleteTitle":"Se sterge ticket-ul...", + "reopenTitle":"Ticket Re-deschis!", - "renameTitle":"Numele este schimbat!", - "renameWarning":"ATENTIE: poti schimba numele acestui ticket doar de 2 ori pe minut!\n(se datoreaza limitarii discord-ului)", - - "closeTitle":"Inchide acest ticket", - "closeDescription":"Poti inchide acest ticket doar apasand butonul de mai jos!", - "deleteTitle":"Sterge acest ticket!", - "deleteDescription":"Poti sterge acest ticket doar apasand butonul de mai jos", - "reopenTitle":"Re-deschide acest ticket!", - "reopenDescription":"Poti redeschide acest ticket doar apasand butonul de mai jos!", - - "ticketWarning":"Embed-ul se afla in mesajul de mai jos:", - "maxTicketWarning":"**ATENTIE:** _Poti creea doar {0} ticket-e odata!_" + "ticketWarning":"Embed-ul se afla in mesajul de mai jos!", + "maxTicketWarning":"**Avertizare:** _Poti creea doar {0} tickete active!_" }, "helpMenu":{ - "title":"Meniu de ajutor:", - "header1":"**Deschide {0} pentru a creea un ticket!**\n\n", + "title":"Comenzi disponibile:", + "header1":"**Mergi la {0} pentru a creea un ticket!**\n\n", "header2":"**Ruleaza comanda `/new` ori `/ticket` pentru a creea un ticket!**\n\n", - "msgCmd":"Afiseaza embed-ul cu tickete. (doar administratorii)", + "msgCmd":"Trimite embed-ul cu tickete. (doar admini)", "renameCmd":"Redenumeste un ticket. (fara spatii)", - "closeCmd":"Redenumeste un ticket ticket.", - "deleteCmd":"Sterge un ticket a ticket.", - "addCmd":"adauga un utilizator la ticket.", - "removeCmd":"Elimina un utilizator de la ticket.", - "reopenCmd":"Re-deschide un ticket dupa ce a fost inchis." + "closeCmd":"Inchide un ticket.", + "deleteCmd":"Sterge un ticket.", + "addCmd":"Adauga un utilizator in ticket.", + "removeCmd":"Sterge un utilizator din ticket.", + "reopenCmd":"Re-deschide un ticket dupa ce a fost deschis." }, "buttons":{ - "close":"Inchide Ticket-ul", - "delete":"Sterge Ticket-ul", - "reopen":"Re-deschide Ticket-ul", - "sendTranscript":"Trimite copia chat-ului ticket-ului" + "close":"Inchide ticket-ul", + "delete":"Sterge ticket-ul", + "reopen":"Re-deschide un ticket", + "sendTranscript":"Transcript" }, "messages":{ - "reopenTitle":"Ticket re-deschis", - "reopenDescription":"Simte-te comfortabil sa vorbesti din nou!", - "closedTitle":"Inchide acest ticket ticket!", - "closedDescription":"Doar administratorii pot vorbi in acest ticket de acum!\n\n*Apasa pe butonele de mai jos pentru a inchide/deschide ticket-ul!*", + "reopenTitle":"Ticket Re-deschis!", + "reopenDescription":"Poti vorbi din nou!", + "closedTitle":"Ticket inchis!", + "closedDescription":"Doar adminii pot vorbi in acest ticket acum!\n\n*Apasa pe butonul de mai jos pentru a re-deschide ori sterge ticket-ul!*", "createdTitle":"Ticket Creat!", - "createdDescription":"Ticket-ul tau a fost creat, il poti vedea dupa mentionarea ta!", + "createdDescription":"Ticket-ul tau a fost creat, poti sa il vezi in canalul pe care ai fost mentionat!", - "newTicketDmTitle":"Ticket Nou!", - "closedTicketDmTitle":"Ticket închis!", - "deletedTicketDmTitle":"Ticket șters!", - "closedTicketDmDescription":"Ticket-ul tau este închis!", - "deletedTicketDmDescription":"Ticket-ul tau este șters!", + "newTicketDmTitle":"Ticket nou!", + "closedTicketDmTitle":"Ticket Inchis!", + "deletedTicketDmTitle":"Ticket Sters!", + "closedTicketDmDescription":"Ticket-ul tau este inchis!", + "deletedTicketDmDescription":"Ticket-ul tau este sters!", "reopenTicketDmTitle":"Ticket Re-deschis!", "reopenTicketDmDescription":"Ticket-ul tau este re-deschis!", - "newTranscriptTitle":"O noua copie a ticket-ului este aici!", - "newTranscriptDescription":"Poti vedea copia ticket-ului in fisierul .txt de mai sus!", - "hereIsTheTranscript":"Aceasta este copia ticket-ului:", + "newTranscriptTitle":"Un nou transcript este aici!", + "hereIsTheTranscript":"Aici este transcriptul:", "chooseCategory":"Alege o categorie:", - "gettingdeleted":"Ticket-ul se sterge..." + "gettingdeleted":"Ticket-ul se sterge...", + + "none":"niciunul", + "reason":"Motiv" } } \ No newline at end of file diff --git a/language/spanish.json b/language/spanish.json index 59dadd9..cc2586b 100644 --- a/language/spanish.json +++ b/language/spanish.json @@ -3,7 +3,8 @@ "missingArgsTitle":"¡Argumentos inválidos!", "missingArgsDescription":"Argumento faltante.", "noPermsTitle":"¡Sin permisos!", - "noPermsDescription":"¡No tienes permiso para usar este comando.!\n¡Necesitas el permiso `ADMINISTRATOR` permiso o tener uno de los roles permitidos!", + "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", + "noPermsDelete":"Only admins can delete a ticket!", "chooseFromListTitle":"ID Invalida", "chooseFromListDescription":"Elije una de las ID de abajo:", "boterror":"¡Error del bot!", @@ -18,26 +19,18 @@ "somethingWentWrongTranscript":"**¡Algo salió mal al hacer el transcript!**\n¡Prueba en otro momento!" }, "commands":{ - "userAddedTitle":"¡Usuario agregado!", - "userAddedDescription":"¡{0} fué agregado al ticket!", - "userRemovedTitle":"¡Usuario eliminado!", - "userRemovedDescription":"¡{0} fué eliminado del ticket!", + "userAddedTitle":"Added {0} to this ticket!", + "userRemovedTitle":"Removed {0} from this ticket!", + "renameTitle":"Changed the name to {0}!", + "closeTitle":"Closed this ticket!", + "deleteTitle":"Deleting this ticket...", + "reopenTitle":"Re-Opened this ticket!", - "renameTitle":"¡El nombre fué cambiado!", - "renameWarning":"Aviso: Solo puedes cambiar el nombre 2 veces por minuto.\n(Esto es por limitaciones de Discord)", - - "closeTitle":"¡Cierra el ticket!", - "closeDescription":"¡Puedes cerrar el ticket con el botón de abajo!", - "deleteTitle":"¡Elimina el ticket!", - "deleteDescription":"¡Puedes eliminar el ticket con el botón de abajo!", - "reopenTitle":"¡Re-Abre el ticket!", - "reopenDescription":"¡Puedes re-abrir el ticket con el botón de abajo!", - - "ticketWarning":"¡El emblema está en el mensaje de abajo!", - "maxTicketWarning":"**Aviso:** _Solo puedes poseer {0} ticket(s) al mismo tiempo!_" + "ticketWarning":"The embed is in the message below!", + "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" }, "helpMenu":{ - "title":"Menú de ayuda:", + "title":"Available Commands:", "header1":"**¡Dirígete a {0} para crear un nuevo ticket!**\n\n", "header2":"**¡Ejecuta el comando `/new` o `/ticket` para crear un ticket!**\n\n", @@ -71,10 +64,12 @@ "reopenTicketDmTitle":"¡Ticket re-abierto!", "reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!", "newTranscriptTitle":"¡Un nuevo transcript está aquí!", - "newTranscriptDescription":"¡Puedes encontrar el transcript en el archivo de texto que se muestra arriba!", "hereIsTheTranscript":"Aquí está el transcript:", "chooseCategory":"elije una categoría:", - "gettingdeleted":"El ticket se está viendo eliminado..." + "gettingdeleted":"El ticket se está viendo eliminado...", + + "none":"none", + "reason":"reason" } } \ No newline at end of file diff --git a/plugins/example.plugin.js b/plugins/example.plugin.js index f892486..a877c6c 100644 --- a/plugins/example.plugin.js +++ b/plugins/example.plugin.js @@ -16,7 +16,4 @@ module.exports = () => { */ - - - } \ No newline at end of file From 6823b961145ed8d9d789ea476d420d6522c23797 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Sun, 14 Aug 2022 22:13:51 +0200 Subject: [PATCH 4/5] fixed the last bugs & added czech translation --- commands/delete.js | 2 +- core/api/modules/events.js | 9 ++++--- .../handlers/accepted/closing.js | 4 ++- .../handlers/accepted/deleting.js | 20 ++++++++------ .../handlers/sendTranscript.js | 2 ++ .../handlers/verifyBars.js | 4 +-- core/ticketCloser.js | 13 ++++++---- core/ticketReopener.js | 2 +- index.js | 26 +++++++++---------- language/dutch.json | 2 +- 10 files changed, 48 insertions(+), 36 deletions(-) diff --git a/commands/delete.js b/commands/delete.js index 49adc26..5e2a6f1 100644 --- a/commands/delete.js +++ b/commands/delete.js @@ -53,7 +53,7 @@ module.exports = () => { if (!interaction.guild) return if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ permsChecker.sendUserNoPerms(interaction.user) - return + return interaction.reply({embeds:[bot.errorLog.noPermsDelete]}) } interaction.channel.messages.fetchPinned().then(msglist => { diff --git a/core/api/modules/events.js b/core/api/modules/events.js index 150f2a5..f1a1c6d 100644 --- a/core/api/modules/events.js +++ b/core/api/modules/events.js @@ -176,15 +176,16 @@ exports.onTranscriptCreation = (messages,channel,guild,date) => { * @param {Date} date */ exports.onCommand = (type,hasPerms,user,channel,guild,date) => { + + const newguild = guild ? guild : false //system - bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}]) + bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:newguild.id}]) commandListeners.forEach((func) => { try { - func(type,hasPerms,user,channel,guild,date) + func(type,hasPerms,user,channel,newguild,date) }catch{} }) - } /**@typedef {"add"|"remove"|"add&remove"} OTReactionRoleType */ @@ -273,7 +274,7 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => { * @param {Boolean} hasPerms * @param {discord.User} user * @param {discord.TextChannel} channel - * @param {discord.Guild} guild + * @param {discord.Guild|false} guild * @param {Date} date */ diff --git a/core/interactionHandlers/handlers/accepted/closing.js b/core/interactionHandlers/handlers/accepted/closing.js index 0fa09ad..cc21393 100644 --- a/core/interactionHandlers/handlers/accepted/closing.js +++ b/core/interactionHandlers/handlers/accepted/closing.js @@ -35,7 +35,9 @@ module.exports = () => { if (!permissionChecker.sendUserNoPerms(interaction.user)){ permissionChecker.sendChannelNoPerms(interaction.channel) } - interaction.message.edit({components:firstcomponents}) + interaction.message.edit({components:[firstcomponents]}) + closeTicketButtonChecker = false + return } } diff --git a/core/interactionHandlers/handlers/accepted/deleting.js b/core/interactionHandlers/handlers/accepted/deleting.js index a2b39a4..9a64891 100644 --- a/core/interactionHandlers/handlers/accepted/deleting.js +++ b/core/interactionHandlers/handlers/accepted/deleting.js @@ -34,7 +34,9 @@ module.exports = () => { if (!permissionChecker.sendUserNoDelete(interaction.user)){ permissionChecker.sendChannelNoDelete(interaction.channel) } - interaction.message.edit({components:firstcomponents}) + await interaction.message.edit({components:[firstcomponents]}) + deleteTicketButtonChecker = false + return } /** @@ -51,29 +53,31 @@ module.exports = () => { interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) - console.log("hi") await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) deleteTicketButtonChecker = false }) //DELETE NO TRANSCRIPT - var deleteTicketButtonChecker = false + var deleteTicketButtonChecker1 = false client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicketTrue1") return interaction.deferUpdate() - if (deleteTicketButtonChecker == true) return - deleteTicketButtonChecker = true + if (deleteTicketButtonChecker1 == true) return + deleteTicketButtonChecker1 = true - const firstcomponents = bot.buttons.close.openRowNormal + const firstcomponents = bot.buttons.close.closeCommandRow + console.log("closed with NO TRANSCRIPT") if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){ if (!permissionChecker.sendUserNoDelete(interaction.user)){ permissionChecker.sendChannelNoDelete(interaction.channel) } - interaction.message.edit({components:firstcomponents}) + await interaction.message.edit({components:[firstcomponents]}) + deleteTicketButtonChecker1 = false + return } /** @@ -90,6 +94,6 @@ module.exports = () => { interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) - deleteTicketButtonChecker = false + deleteTicketButtonChecker1 = false }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/sendTranscript.js b/core/interactionHandlers/handlers/sendTranscript.js index 9d2c2ba..0f857e3 100644 --- a/core/interactionHandlers/handlers/sendTranscript.js +++ b/core/interactionHandlers/handlers/sendTranscript.js @@ -38,6 +38,8 @@ module.exports = () => { return } + try { tsmsg.edit({embeds:[bot.embeds.commands.sendTranscriptEmbed(true,interaction.channel,interaction.user)],files:[fileattachment]}) + }catch{} }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/verifyBars.js b/core/interactionHandlers/handlers/verifyBars.js index a85f388..64d7c99 100644 --- a/core/interactionHandlers/handlers/verifyBars.js +++ b/core/interactionHandlers/handlers/verifyBars.js @@ -56,7 +56,7 @@ module.exports = () => { if (interaction.customId != "OTdeleteTicket1") return interaction.deferUpdate() - interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]}) + interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]}) }) client.on("interactionCreate",interaction => { @@ -64,6 +64,6 @@ module.exports = () => { if (interaction.customId != "OTdeleteTicketFalse1") return interaction.deferUpdate() - interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) + interaction.message.edit({components:[bot.buttons.close.closeCommandRow]}) }) } \ No newline at end of file diff --git a/core/ticketCloser.js b/core/ticketCloser.js index 4697bc2..203a04c 100755 --- a/core/ticketCloser.js +++ b/core/ticketCloser.js @@ -334,10 +334,13 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => } if (deleteRequired){ - const timer = () => {return new Promise((resolve,reject) => { - setTimeout(() => {resolve(true)},7000) - })} - await timer() - await channel.delete() + //const timer = () => {return new Promise((resolve,reject) => { + // setTimeout(() => {resolve(true)},7000) + //})} + //await timer() + + setTimeout(async () => { + await channel.delete() + },6000) } } \ No newline at end of file diff --git a/core/ticketReopener.js b/core/ticketReopener.js index 593edd2..e3cbd97 100755 --- a/core/ticketReopener.js +++ b/core/ticketReopener.js @@ -35,7 +35,7 @@ const reopenTicket = (guild,channel,user) => { }) channel.permissionOverwrites.cache.forEach((p) => { - if (p.type == "member"){ + if (p.type == 1){ permissionsArray.push({ id:p.id, type:"member", diff --git a/index.js b/index.js index 48b8a5f..7fa703a 100644 --- a/index.js +++ b/index.js @@ -146,21 +146,21 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){ }else{ //commands - require('./commands/ticket')(this) - require("./commands/help")(this) - require("./commands/close")(this) - require("./commands/delete")(this) - require("./commands/rename")(this) - require("./commands/add")(this) - require("./commands/remove")(this) - require("./commands/reopen")(this) + require('./commands/ticket')() + require("./commands/help")() + require("./commands/close")() + require("./commands/delete")() + require("./commands/rename")() + require("./commands/add")() + require("./commands/remove")() + require("./commands/reopen")() //core - require('./core/ticketOpener')(this) - require("./core/ticketCloser").runThis(this) - require("./core/closebuttons")(this) - require("./core/reactionRoles")(this) - require("./core/ticketReopener").runThis(this) + require('./core/ticketOpener')() + require("./core/ticketCloser").runThis() + //require("./core/closebuttons")() // => everything is now in ./core/interactionHandlers/ + require("./core/reactionRoles")() + require("./core/ticketReopener").runThis() //InteractionHandlers require("./core/interactionHandlers/handlers/handlers")() diff --git a/language/dutch.json b/language/dutch.json index 145e72c..4bd61eb 100644 --- a/language/dutch.json +++ b/language/dutch.json @@ -4,7 +4,7 @@ "missingArgsDescription":"Er missen parameters", "noPermsTitle":"Geen permissies!", "noPermsDescription":"Je hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane users staan!", - "noPermsDelete":"Alleen admins kunnen een ticket sluiten!", + "noPermsDelete":"Alleen admins kunnen een ticket verwijderen!", "chooseFromListTitle":"Onjuist ID", "chooseFromListDescription":"Kies een van de id's hier onder:", "boterror":"Bot Error!", From 697594b3111586598358d06229c37a107d9c5b43 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Mon, 15 Aug 2022 14:55:34 +0200 Subject: [PATCH 5/5] added french & czech translation --- language/czech.json | 147 ++++++++++++++++++++++--------------------- language/french.json | 66 ++++++++++--------- 2 files changed, 110 insertions(+), 103 deletions(-) diff --git a/language/czech.json b/language/czech.json index 65f95f4..93bdeb4 100644 --- a/language/czech.json +++ b/language/czech.json @@ -1,74 +1,75 @@ -{ - "errors":{ - "missingArgsTitle":"Neplatné argumenty", - "missingArgsDescription":"Chybí argumenty", - "noPermsTitle":"Nemáš práva!", - "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", - "noPermsDelete":"Only admins can delete a ticket!", - "chooseFromListTitle":"Neplatné ID", - "chooseFromListDescription":"Vyber si z těchto ID:", - "boterror":"Error!", - "notInTicketTitle":"Nejsi v ticketu!", - "notInTicketDescription":"Tento příkaz nefunguje mimo tickety!", - "ticketDoesntExist":"Tento ticket už bohužel neexistuje!", - "roleDoesntExist":"Tato role bohužel neexistuje!", - "anotherOption":"Tato možnost není ticket ale něco jiného!", - "maxAmountTitle":"Maximální počet ticketů dosažen!", - "maxAmountDescription":"Dosáhl jsi maximálního povoleného počtu ticketů!\n Nemůžeš si vytvořit nový!", - "somethingWentWrong":"**Něco je špatně**\nProsím zkus to příště znovu!", - "somethingWentWrongTranscript":"Něco je špatně s transcriptem!**\nProsím zkus to příště znovu!" - }, - "commands":{ - "userAddedTitle":"Added {0} to this ticket!", - "userRemovedTitle":"Removed {0} from this ticket!", - "renameTitle":"Changed the name to {0}!", - "closeTitle":"Closed this ticket!", - "deleteTitle":"Deleting this ticket...", - "reopenTitle":"Re-Opened this ticket!", - - "ticketWarning":"The embed is in the message below!", - "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" - }, - "helpMenu":{ - "title":"Available Commands:", - "header1":"**Běž {0} vytvořit si ticket!**\n\n", - "header2":"**Použij příkaz `/new` nebo `/ticket` k vytvoření ticketu!**\n\n", - - "msgCmd":"Vytvoř možnost otevírat tickety přes tlačítko. (ADMIN)", - "renameCmd":"Přejmenovat ticket. (Žádné mezery)", - "closeCmd":"Zavři ticket.", - "deleteCmd":"Smaž ticket.", - "addCmd":"Přidej člena do ticketu.", - "removeCmd":"Odebere člena z ticketu.", - "reopenCmd":"Znovu otevři ticket po uzavření." - }, - "buttons":{ - "close":"Zavři ticket", - "delete":"Smaž ticket", - "reopen":"Znovu otevři ticket", - "sendTranscript":"Odešli log ticketu" - }, - "messages":{ - "reopenTitle":"Ticket znovu otevřen!", - "reopenDescription":"Cítím se skvěle že si můžeme zase povídat!", - "closedTitle":"Zavřený ticket!", - "closedDescription":"Pouze admin team zde může nyní komunikovat!\n\n*Klikni na tlačítko níže pro smazání nebo znovu otevření ticketu!*", - "createdTitle":"Ticket vytvořen!", - "createdDescription":"Váš tiket je vytvořen, můžete ho zjistit pomocí pingu!", - - "newTicketDmTitle":"Nový ticket!", - "closedTicketDmTitle":"Ticket uzavřen!", - "deletedTicketDmTitle":"Ticket smazán!", - "closedTicketDmDescription":"Tvůj ticket byl uzavřen!", - "deletedTicketDmDescription":"Tvůj ticket byl smazán!", - "reopenTicketDmTitle":"Ticket znovu otevřen!", - "reopenTicketDmDescription":"Tvůj ticket byl znovu otevřen!", - "newTranscriptTitle":"Nový log ticketu je zde!", - "hereIsTheTranscript":"Zde je log:", - - "chooseCategory":"Vyber kategorii:", - - "none":"none", - "reason":"reason" - } +{ + "errors":{ + "missingArgsTitle":"Neplatné argumenty", + "missingArgsDescription":"Chybí argumenty", + "noPermsTitle":"Nemáš práva!", + "noPermsDescription":"Nemáš dostatečné práva na tento příkaz!\n Potřebuješ ADMINISTRATOR aby jsi mohl provést příkaz!", + "noPermsDelete":"Pouze admin může smazat ticket!", + "chooseFromListTitle":"Neplatné ID", + "chooseFromListDescription":"Vyber si z těchto ID:", + "boterror":"Error!", + "notInTicketTitle":"Nejsi v ticketu!", + "notInTicketDescription":"Tento příkaz nefunguje mimo tickety!", + "ticketDoesntExist":"Tento ticket už bohužel neexistuje!", + "roleDoesntExist":"Tato role bohužel neexistuje!", + "anotherOption":"Tato možnost není ticket ale něco jiného!", + "maxAmountTitle":"Maximální počet ticketů dosažen!", + "maxAmountDescription":"Dosáhl jsi maximálního povoleného počtu ticketů!\n Nemůžeš si vytvořit nový!", + "somethingWentWrong":"**Něco je špatně**\nProsím zkus to příště znovu!", + "somethingWentWrongTranscript":"Něco je špatně s transcriptem!**\nProsím zkus to příště znovu!" + }, + "commands":{ + "userAddedTitle":"{0} byl přidán do ticketu!", + "userRemovedTitle":"{0} byl odebrám z ticketu!", + "renameTitle":"Jméno bylo změněno!", + "closeTitle":"Zavři tento ticket!", + "deleteTitle":"Smaž tento ticket!", + "reopenTitle":"Znovu otevři ticket!", + + "ticketWarning":"The embed is in the message below!", + "maxTicketWarning":"**Varovaní:** _Můžeš si vytvořit použe {0} ticket(s) v jednu chvíli!_" + }, + "helpMenu":{ + "title":"Příkazy:", + "header1":"**Běž {0} vytvořit si ticket!**\n\n", + "header2":"**Použij příkaz `/new` nebo `/ticket` k vytvoření ticketu!**\n\n", + + "msgCmd":"Vytvoř možnost otevírat tickety přes tlačítko. (ADMIN)", + "renameCmd":"Přejmenovat ticket. (Žádné mezery)", + "closeCmd":"Zavři ticket.", + "deleteCmd":"Smaž ticket.", + "addCmd":"Přidej člena do ticketu.", + "removeCmd":"Odebere člena z ticketu.", + "reopenCmd":"Znovu otevři ticket po uzavření." + }, + "buttons":{ + "close":"Zavři ticket", + "delete":"Smaž ticket", + "reopen":"Znovu otevři ticket", + "sendTranscript":"Odešli log ticketu" + }, + "messages":{ + "reopenTitle":"Ticket znovu otevřen!", + "reopenDescription":"Cítím se skvěle že si můžeme zase povídat!", + "closedTitle":"Zavřený ticket!", + "closedDescription":"Pouze admin team zde může nyní komunikovat!\n\n*Klikni na tlačítko níže pro smazání nebo znovu otevření ticketu!*", + "createdTitle":"Ticket vytvořen!", + "createdDescription":"Váš tiket je vytvořen, můžete ho zjistit pomocí pingu!", + + "newTicketDmTitle":"Nový ticket!", + "closedTicketDmTitle":"Ticket uzavřen!", + "deletedTicketDmTitle":"Ticket smazán!", + "closedTicketDmDescription":"Tvůj ticket byl uzavřen!", + "deletedTicketDmDescription":"Tvůj ticket byl smazán!", + "reopenTicketDmTitle":"Ticket znovu otevřen!", + "reopenTicketDmDescription":"Tvůj ticket byl znovu otevřen!", + "newTranscriptTitle":"Nový log ticketu je zde!", + "hereIsTheTranscript":"Zde je log:", + + "chooseCategory":"Vyber kategorii:", + "gettingdeleted":"Ticket bude smazán", + + "none":"nic", + "reason":"důvod" + } } \ No newline at end of file diff --git a/language/french.json b/language/french.json index 6bafbc8..fcac829 100644 --- a/language/french.json +++ b/language/french.json @@ -1,69 +1,75 @@ { "errors":{ - "missingArgsTitle":"Arguments invalides !", + "missingArgsTitle":"Arguments invalides!", "missingArgsDescription":"Argument manquant", "noPermsTitle":"Pas de permissions!", - "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", - "noPermsDelete":"Only admins can delete a ticket!", + "noPermsDescription":"Vous avez besoin de la permission `ADMINISTRATOR` ou être dans la liste des rôles autorisés!", + "noPermsDelete":"Seuls les administrateurs peuvent supprimer un ticket!", "chooseFromListTitle":"Invalid ID", "chooseFromListDescription":"Choisissez l'un des identifiants ci-dessous:", "boterror":"Bot Error!", - "notInTicketTitle":"Vous n'êtes pas dans un ticket !", - "notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets !", - "ticketDoesntExist":"Ce billet n'existe plus !", - "roleDoesntExist":"Ce rôle n'existe plus !", - "anotherOption":"Cette option n'est pas un ticket mais un autre type !", - "maxAmountTitle":"Montant max atteint !", - "maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés !\nVous ne pouvez donc pas en créer un nouveau !", - "somethingWentWrong":"**Une erreur s'est produite !**\nVeuillez réessayer une autre fois !", - "somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription !**\nVeuillez réessayer une autre fois !" + "notInTicketTitle":"Vous n'êtes pas dans un ticket!", + "notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets!", + "ticketDoesntExist":"Ce ticket n'existe plus!", + "roleDoesntExist":"Ce rôle n'existe plus!", + "anotherOption":"Cette option n'est pas un ticket mais un autre type!", + "maxAmountTitle":"Montant maximum atteint!", + "maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés!\nVous ne pouvez donc pas en créer un nouveau!", + "somethingWentWrong":"**Quelque chose s'est mal passé!**\nVeuillez réessayer une autre fois!", + "somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription!**\nVeuillez réessayer une autre fois!" }, "commands":{ - "userAddedTitle":"Added {0} to this ticket!", - "userRemovedTitle":"Removed {0} from this ticket!", - "renameTitle":"Changed the name to {0}!", - "closeTitle":"Closed this ticket!", - "deleteTitle":"Deleting this ticket...", - "reopenTitle":"Re-Opened this ticket!", + "userAddedTitle":"{0} a été ajouté à ce ticket!", + "userRemovedTitle":"Supprimé {0} de ce ticket!", + "renameTitle":"Changement du nom en {0}!", + "closeTitle":"Fermé ce ticket!", + "deleteTitle":"Suppression de ce ticket...", + "reopenTitle":"A rouvert ce ticket!", - "ticketWarning":"The embed is in the message below!", - "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" + "ticketWarning":"L'intégration est dans le message ci-dessous!", + "maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_" }, "helpMenu":{ - "title":"Available Commands:", + "title":"Commandes disponibles :", "header1":"**Allez à {0} pour créer un ticket !**\n\n", - "header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket!**\n\n", + "header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket !**\n\n", - "msgCmd":"Créez une intégration avec des boutons. (administrateurs uniquement)", + "msgCmd":"Faire apparaître une intégration avec des boutons. (administrateurs uniquement)", "renameCmd":"Renommer un ticket. (sans espaces)", "closeCmd":"Fermer un ticket.", "deleteCmd":"Supprimer un billet.", "addCmd":"Ajouter un utilisateur au ticket.", "removeCmd":"Supprimer un utilisateur du ticket.", - "reopenCmd":"Re-Open a ticket after it was closed." + "reopenCmd":"Rouvrir un ticket après sa clôture." }, "buttons":{ "close":"Fermer le ticket", "delete":"Supprimer le billet", "reopen":"Billet de réouverture", - "sendTranscript":"Envoyer le fichier de transcription" + "sendTranscript":"Transcript" }, "messages":{ "reopenTitle":"A rouvert ce ticket!", "reopenDescription":"N'hésitez pas à reparler!", - "closedTitle":"Fermé ce ticket", + "closedTitle":"Fermé ce ticket!", "closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*", "createdTitle":"Ticket créé !", "createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !", - "newTicketDmTitle":"Nouveau ticket!", + "newTicketDmTitle":"Nouveau billet!", + "closedTicketDmTitle":"Billet fermé!", + "deletedTicketDmTitle":"Billet supprimé !", + "closedTicketDmDescription":"Votre billet est fermé !", + "deletedTicketDmDescription":"Votre billet est supprimé !", + "reopenTicketDmTitle":"Billet rouvert!", + "reopenTicketDmDescription":"Votre billet est rouvert !", "newTranscriptTitle":"Une nouvelle transcription est ici!", - "hereIsTheTranscript":"Voici la transcription :", + "hereIsTheTranscript":"Voici la transcription :", "chooseCategory":"choisissez une catégorie:", "gettingdeleted":"Le ticket est en cours de suppression...", - "none":"none", - "reason":"reason" + "none":"rien", + "reason":"raison" } } \ No newline at end of file