diff --git a/.gitignore b/.gitignore index e485366..a45912f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ openticketdebug.txt developerChangelog.md storage/dynamicDB/ storage/.DS_Store -.vscode/ \ No newline at end of file +.vscode/ +livestatus.json +test.js \ No newline at end of file diff --git a/README.md b/README.md index 3f303fd..4d53e60 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ This is an open-source discord ticket bot, you can configure it and it comes wit - R0JO - t0miiis - josuens14 +- M4 ## features - discord interaction buttons @@ -42,13 +43,11 @@ This is an open-source discord ticket bot, you can configure it and it comes wit - configure everything per ticket - remove credits if you want :( - unlimited tickets spread over multiple messages - -*comming soon:* -- dashboard -- view transcripts in dashboard -- share transcripts - close with reason -- more translation + +*comming soon* +- share transcripts +- view transcripts in html ## installation **You need `node.js 16` to run this project!** diff --git a/commands/add.js b/commands/add.js index 337670a..fb02c24 100644 --- a/commands/add.js +++ b/commands/add.js @@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded add.js") + client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"add")) return var user = msg.mentions.users.first() @@ -27,13 +29,13 @@ module.exports = () => { 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)]}) + msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]}) 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 ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) 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()) @@ -59,13 +61,13 @@ module.exports = () => { 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)]}) + interaction.reply({embeds:[bot.embeds.commands.addEmbed(user,interaction.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 ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) 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 2c05d85..8db6a07 100644 --- a/commands/close.js +++ b/commands/close.js @@ -9,9 +9,19 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded close.js") + client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"close")) return + const args = msg.content.substring((config.prefix+"close").length).split(" ") + args.shift() + /**@type {String|false} */ + var tempreason = args.join(" ") + if (!tempreason || tempreason == " " || tempreason == " "){ + tempreason = false + } + const reason = tempreason msg.channel.messages.fetchPinned().then(msglist => { var firstmsg = msglist.last() @@ -19,7 +29,10 @@ module.exports = () => { const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) 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]}) + if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]}) + + const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false + msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) var name = msg.channel.name var prefix = "" @@ -30,7 +43,7 @@ module.exports = () => { } }) - require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",false,true) + require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",reason,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()) @@ -46,13 +59,18 @@ module.exports = () => { //interaction.deferReply() + const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false + 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").value - interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) + if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]}) + + const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false + interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) var name = interaction.channel.name var prefix = "" @@ -63,7 +81,7 @@ module.exports = () => { } }) - require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true) + require("../core/ticketActions/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 a8fbdef..441485a 100644 --- a/commands/delete.js +++ b/commands/delete.js @@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded delete.js") + client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"delete")) return @@ -35,7 +37,7 @@ module.exports = () => { } }) - require("../core/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true) + require("../core/ticketActions/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()) @@ -73,7 +75,7 @@ module.exports = () => { } }) - require("../core/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) + require("../core/ticketActions/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 cfdeaee..ef5a6ab 100644 --- a/commands/help.js +++ b/commands/help.js @@ -8,6 +8,8 @@ const l = bot.language const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded help.js") + const helpEmbed = new discord.EmbedBuilder() .setColor(config.main_color) .setTitle("❔ "+l.helpMenu.title) diff --git a/commands/remove.js b/commands/remove.js index cc6e6c0..7d08b6f 100644 --- a/commands/remove.js +++ b/commands/remove.js @@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded remove.js") + client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"remove")) return var user = msg.mentions.users.first() @@ -27,14 +29,14 @@ module.exports = () => { 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)]}) + msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]}) 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 ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) 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()) }) @@ -59,14 +61,14 @@ module.exports = () => { const ticketId = hiddendata.data.find(d => d.key == "type").value interaction.channel.permissionOverwrites.delete(user.id) - interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user)]}) + interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.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 ticketData = require("../core/getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) 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()) }) diff --git a/commands/rename.js b/commands/rename.js index 1f8a032..8e1e852 100644 --- a/commands/rename.js +++ b/commands/rename.js @@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded rename.js") + client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"rename")) return diff --git a/commands/reopen.js b/commands/reopen.js index c12b991..03a009b 100644 --- a/commands/reopen.js +++ b/commands/reopen.js @@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded reopen.js") + client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"reopen")) return @@ -18,9 +20,11 @@ module.exports = () => { const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const ticketId = hiddendata.data.find(d => d.key == "type").value + if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]}) + 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) + require("../core/ticketActions/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()) @@ -40,9 +44,11 @@ module.exports = () => { const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const ticketId = hiddendata.data.find(d => d.key == "type").value + if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]}) + 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) + require("../core/ticketActions/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/commands/ticket.js b/commands/ticket.js index d64d7c4..8f14bcd 100644 --- a/commands/ticket.js +++ b/commands/ticket.js @@ -9,6 +9,8 @@ const permsChecker = require("../core/utils/permisssionChecker") const APIEvents = require("../core/api/modules/events") module.exports = () => { + bot.errorLog.log("debug","COMMANDS: loaded ticket.js") + /**@type {String[]} */ var msgIds = [] config.messages.forEach((msg) => { @@ -31,7 +33,7 @@ module.exports = () => { if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]}) - const {embed,componentRows} = require("../core/ticketMessageEmbed").createEmbed(id) + const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id) msg.channel.send({embeds:[embed],components:componentRows}) @@ -54,7 +56,7 @@ module.exports = () => { if (!msgIds.includes(id)) return interaction.reply({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]}) - const {embed,componentRows} = require("../core/ticketMessageEmbed").createEmbed(id) + const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id) interaction.reply({content:l.commands.ticketWarning}) interaction.channel.send({embeds:[embed],components:componentRows}) diff --git a/config.json b/config.json index 4f6a05b..2128639 100644 --- a/config.json +++ b/config.json @@ -41,7 +41,7 @@ "channelprefix":"question-", "category":"category id", "message":"You created a ticket!", - "enableDMMessage":true, + "enableDmOnOpen":true, "ticketmessage":"The staff will help you soon!\n\n*Click on the button below to close the ticket!*" }, @@ -67,7 +67,7 @@ "color":"red", "roles":["discord role id"], "mode":"add&remove|remove|add", - "enableDMMessage":true + "enableDmOnOpen":true } ], @@ -77,6 +77,7 @@ "id":"1", "name":"Choose Your Ticket", "description":"You can click one of the buttons below!", + "dropdown":false, "enableFooter":false, "footer":"Open Ticket v3.0.0 - I'm a footer!", diff --git a/core/api/api.json b/core/api/api.json index 03dd942..29f74d3 100644 --- a/core/api/api.json +++ b/core/api/api.json @@ -3,6 +3,7 @@ "disclaimer":"DISABLE doesn't work yet! Below this message!", + "enableAPIdebug":false, "disable":{ "messages":{ "ticketCreated":false, diff --git a/core/api/pluginlauncher.js b/core/api/pluginlauncher.js index 3c5a34d..3c6877e 100644 --- a/core/api/pluginlauncher.js +++ b/core/api/pluginlauncher.js @@ -4,7 +4,7 @@ const log = bot.errorLog.log module.exports = () => { const files = fs.readdirSync("./plugins") - + const api = require("./api.json") var totalcount = 0 var successcount = 0 var failcount = 0 @@ -15,7 +15,14 @@ module.exports = () => { successcount++ totalcount++ - }catch{ + }catch(err){ + /**@type {Error} */ + const theError = err + if (api.enableAPIdebug){ + const data = fs.readFileSync("./apiDebug.txt") + const newData = data ? data.toString() : "" + fs.writeFileSync("./apiDebug.txt",newData+"ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n") + } failcount++ totalcount++ } diff --git a/core/checker.js b/core/checker.js index 4f2e803..96c17bb 100644 --- a/core/checker.js +++ b/core/checker.js @@ -1,6 +1,17 @@ exports.checker = async () => { const chalk = await (await import("chalk")).default - const config = require("../config.json") + + if (process.argv.some((v) => v == "--nochecker")) return + if (process.argv.some((v) => v == "--devconfig")){ + //console.log(chalk.blue("=> used dev config instead of normal config")) + try{ + var tempconfig = require("../devConfig.json") + }catch(err){console.log(err);var tempconfig = require("../config.json")} + }else{ + var tempconfig = require("../config.json") + } + + const config = tempconfig var errorList = [] var isError = false var warnList = [] @@ -195,8 +206,8 @@ exports.checker = async () => { //message checkType(option.message,"string",path+"/message") - //enableDMmessage - checkType(option.enableDMMessage,"boolean",path+"/enableDMMessage") + //enableDmOnOpen + checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen") //ticketmessage checkType(option.ticketmessage,"string",path+"/ticketmessage") @@ -230,8 +241,8 @@ exports.checker = async () => { createError("'"+path+"/mode' | mode must be one of these: add, remove, add&remove") } - //enableDMmessage - checkType(option.enableDMMessage,"boolean",path+"/enableDMMessage") + //enableDmOnOpen + checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen") } } @@ -260,7 +271,7 @@ exports.checker = async () => { //languagefile checkType(config.languagefile,"string","languagefile") const lf = config.languagefile - if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese")){ + if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french")){ createError("'languagefile' | invalid language, more info in the wiki") } diff --git a/core/errorLogSystem.js b/core/errorLogSystem.js index 97b0a20..6f57323 100644 --- a/core/errorLogSystem.js +++ b/core/errorLogSystem.js @@ -101,7 +101,7 @@ const normalLog = (debugString) => { /** * - * @param {"system"|"command"|"info"|"api"} type + * @param {"system"|"command"|"info"|"api"|"debug"} type * @param {String} message * @param {[{key:String,value:String}]} params */ @@ -129,6 +129,9 @@ exports.log = async (type,message,params) => { console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters)) } ptype = "api v"+require("./api/api.json").version + }else if (ptype == "debug"){ + if (!process.argv.some((v) => v == "--debug")) return + console.log(chalk.redBright("[DEBUG] ")+message+" "+chalk.yellow(parameters)) } const cd = new Date() diff --git a/core/getoptions.js b/core/getoptions.js deleted file mode 100644 index b691a67..0000000 --- a/core/getoptions.js +++ /dev/null @@ -1,116 +0,0 @@ -const bot = require("../index") -const config = bot.config - -/** - * @param {Number} index - * @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDMMessage"|"ticketmessage"} value - */ -exports.getTicketValue = (index,value) => { - if (value == "id"){ - return "OTnewT"+config.options[index][value] - } - return config.options[index][value] -} - -/** - * @param {Number} index - * @param {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} value - */ - exports.getWebsiteValue = (index,value) => { - return config.options[index][value] -} - -/** - * @param {Number} index - * @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDMMessage"} value - */ -exports.getRoleValue = (index,value) => { - return config.options[index][value] -} - -/** - * @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDMMessage"|"ticketmessage"} value - */ - exports.getTicketValues = (value) => { - var result = [] - config.options.forEach((o) => { - if (value == "id"){ - result.push("OTnewT"+o[value]) - }else{ - result.push(o[value]) - } - }) - return result -} - -/** - * @param {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} value - */ - exports.getWebsiteValues = (value) => { - var result = [] - config.options.forEach((o) => { - result.push(o[value]) - }) - return result -} - -/** - * @param {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDMMessage""} value - */ -exports.getRoleValues = (value) => { - var result = [] - config.options.forEach((o) => { - result.push(o[value]) - }) - return result -} - -class TicketOptions { - constructor() { - this.id = "" - this.name = "" - this.description = "" - this.icon = "" - this.label = "" - this.type = "" - this.color = "" - this.adminroles = ["",""] - this.channelprefix = "" - this.category = "" - this.message = "" - this.enableDMMessage = true - this.ticketmessage = "" - } -} -/** - * - * @param {String} id - * @returns {TicketOptions|false} - */ -exports.getOptionsById = (id) => { - var result = false - config.options.forEach((option) => { - if ("OTnewT"+option.id == id){ - result = option - } - }) - return result -} - -exports.exportedOptionClass = class { - constructor() { - this.id = "" - this.name = "" - this.description = "" - this.icon = "" - this.label = "" - this.type = "" - this.color = "" - this.adminroles = ["",""] - this.channelprefix = "" - this.category = "" - this.message = "" - this.enableDMMessage = true - this.ticketmessage = "" - } -} \ No newline at end of file diff --git a/core/interactionHandlers/buttons/close.js b/core/interactionHandlers/buttons/close.js index 1a8a445..46b7224 100644 --- a/core/interactionHandlers/buttons/close.js +++ b/core/interactionHandlers/buttons/close.js @@ -5,7 +5,6 @@ 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 diff --git a/core/interactionHandlers/buttons/firstmsg.js b/core/interactionHandlers/buttons/firstmsg.js index 53edd15..fbbc910 100644 --- a/core/interactionHandlers/buttons/firstmsg.js +++ b/core/interactionHandlers/buttons/firstmsg.js @@ -5,7 +5,6 @@ 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 diff --git a/core/interactionHandlers/buttons/verifyBars.js b/core/interactionHandlers/buttons/verifyBars.js index 75c56ce..cd3693e 100644 --- a/core/interactionHandlers/buttons/verifyBars.js +++ b/core/interactionHandlers/buttons/verifyBars.js @@ -5,7 +5,7 @@ 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 diff --git a/core/interactionHandlers/embeds/commands.js b/core/interactionHandlers/embeds/commands.js index c7bab3e..ad9a747 100644 --- a/core/interactionHandlers/embeds/commands.js +++ b/core/interactionHandlers/embeds/commands.js @@ -5,7 +5,6 @@ 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 @@ -13,37 +12,45 @@ const mc = config.main_color /** * * @param {discord.User} addedUser + * @param {discord.User} adder * @returns {discord.EmbedBuilder} */ -exports.addEmbed = (addedUser) => { +exports.addEmbed = (addedUser,adder) => { return new embed() .setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username)) .setColor(mc) - .setFooter({text:addedUser.tag,iconURL:addedUser.displayAvatarURL()}) + .setFooter({text:adder.tag,iconURL:adder.displayAvatarURL()}) + .setThumbnail(addedUser.displayAvatarURL({extension:"png"})) } /** * * @param {discord.User} removedUser + * @param {discord.User} remover * @returns {discord.EmbedBuilder} */ -exports.removeEmbed = (removedUser) => { +exports.removeEmbed = (removedUser,remover) => { return new embed() .setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username)) .setColor(mc) - .setFooter({text:removedUser.tag,iconURL:removedUser.displayAvatarURL()}) + .setFooter({text:remover.tag,iconURL:remover.displayAvatarURL()}) + .setThumbnail(removedUser.displayAvatarURL({extension:"png"})) } /** * * @param {discord.User} closer + * @param {String} description * @returns {discord.EmbedBuilder} */ -exports.closeEmbed = (closer) => { - return new embed() +exports.closeEmbed = (closer,description) => { + const embd = new embed() .setTitle("🔒 "+l.commands.closeTitle) .setColor(mc) .setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()}) + + if (description) embd.setDescription(description) + return embd } /** diff --git a/core/interactionHandlers/handlers/accepted/closing.js b/core/interactionHandlers/handlers/accepted/closing.js index beb5cd6..27dc578 100644 --- a/core/interactionHandlers/handlers/accepted/closing.js +++ b/core/interactionHandlers/handlers/accepted/closing.js @@ -5,7 +5,6 @@ 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 @@ -56,7 +55,7 @@ module.exports = () => { }) 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) + await require("../../../ticketActions/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/closingReason.js b/core/interactionHandlers/handlers/accepted/closingReason.js index 721672a..e5710b7 100644 --- a/core/interactionHandlers/handlers/accepted/closingReason.js +++ b/core/interactionHandlers/handlers/accepted/closingReason.js @@ -5,7 +5,6 @@ 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 @@ -94,7 +93,7 @@ module.exports = () => { }) //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",reason,true) + await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",reason,true) closeTicketButtonChecker = false }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/accepted/deleting.js b/core/interactionHandlers/handlers/accepted/deleting.js index 543226d..900db9b 100644 --- a/core/interactionHandlers/handlers/accepted/deleting.js +++ b/core/interactionHandlers/handlers/accepted/deleting.js @@ -5,7 +5,6 @@ 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 @@ -53,7 +52,7 @@ module.exports = () => { interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) - await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) + await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) deleteTicketButtonChecker = false }) @@ -92,7 +91,7 @@ module.exports = () => { }) interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) - await require("../../../ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) + await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) deleteTicketButtonChecker1 = false }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/accepted/reopening.js b/core/interactionHandlers/handlers/accepted/reopening.js index 4b404b5..2cbc080 100644 --- a/core/interactionHandlers/handlers/accepted/reopening.js +++ b/core/interactionHandlers/handlers/accepted/reopening.js @@ -5,7 +5,6 @@ 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 @@ -24,6 +23,6 @@ module.exports = () => { 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) + require("../../../ticketActions/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 index bf340db..cd8c748 100644 --- a/core/interactionHandlers/handlers/firstmsg.js +++ b/core/interactionHandlers/handlers/firstmsg.js @@ -5,7 +5,6 @@ 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 diff --git a/core/interactionHandlers/handlers/sendTranscript.js b/core/interactionHandlers/handlers/sendTranscript.js index 0f857e3..c1f1c65 100644 --- a/core/interactionHandlers/handlers/sendTranscript.js +++ b/core/interactionHandlers/handlers/sendTranscript.js @@ -5,7 +5,6 @@ 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 diff --git a/core/interactionHandlers/handlers/verifyBars.js b/core/interactionHandlers/handlers/verifyBars.js index 64d7c99..a365bcd 100644 --- a/core/interactionHandlers/handlers/verifyBars.js +++ b/core/interactionHandlers/handlers/verifyBars.js @@ -5,7 +5,6 @@ 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 diff --git a/core/languageManager.js b/core/languageManager.js index 467f1d5..e8d4854 100644 --- a/core/languageManager.js +++ b/core/languageManager.js @@ -1,6 +1,6 @@ const index = require("../index") -if (index.developerMode){ +if (index.developerConfig){ var config = require("../devConfig.json") }else{var config = require("../config.json")} diff --git a/core/slashSystem/slashDisable.js b/core/slashSystem/slashDisable.js index 6ed3fda..82018a0 100644 --- a/core/slashSystem/slashDisable.js +++ b/core/slashSystem/slashDisable.js @@ -2,7 +2,6 @@ const discord = require("discord.js") const bot = require("../../index") const client = require("../../index").client const config = bot.config -const getoptions = require("../getoptions") module.exports = async () => { const chalk = (await import("chalk")).default diff --git a/core/slashSystem/slashEnable.js b/core/slashSystem/slashEnable.js index ee86197..e7ace19 100644 --- a/core/slashSystem/slashEnable.js +++ b/core/slashSystem/slashEnable.js @@ -2,7 +2,7 @@ const discord = require("discord.js") const bot = require("../../index") const client = require("../../index").client const config = bot.config -const getoptions = require("../getoptions") +const configParser = require("../utils/configParser") const act = discord.ApplicationCommandType const acot = discord.ApplicationCommandOptionType @@ -11,12 +11,12 @@ module.exports = async () => { const chalk = (await import("chalk")).default const sid = config.server_id - const ids = getoptions.getTicketValues("id") + const ids = configParser.getTicketValuesArray("id") /**@type {[{name:String,value:String}]} */ var choices = [] ids.forEach((id) => { - const option = getoptions.getOptionsById(id) - if (option.type == "ticket"){ + const option = configParser.getTicketById(id) + if (option){ choices.push({name:option.name,value:option.id}) } }) @@ -82,7 +82,7 @@ module.exports = async () => { //help client.application.commands.create({ name:"help", - description:"The help menu", + description:"View the available commands.", defaultPermission:true, type:act.ChatInput },sid).then(() => { @@ -95,7 +95,14 @@ module.exports = async () => { name:"close", description:"Close the current ticket.", defaultPermission:true, - type:act.ChatInput + type:act.ChatInput, + options:[{ + name:"reason", + type:discord.ApplicationCommandOptionType.String, + required:false, + description:"The reason to close this ticket.", + maxLength:100 + }] },sid).then(() => { readystats++ }) diff --git a/core/ticketCloser.js b/core/ticketActions/ticketCloser.js similarity index 83% rename from core/ticketCloser.js rename to core/ticketActions/ticketCloser.js index 57a9b09..903d3dc 100755 --- a/core/ticketCloser.js +++ b/core/ticketActions/ticketCloser.js @@ -1,36 +1,13 @@ const discord = require('discord.js') -const bot = require('../index') +const bot = require('../../index') const client = bot.client const config = bot.config const log = bot.errorLog.log const l = bot.language const storage = bot.storage -const permsChecker = require("./utils/permisssionChecker") +const permsChecker = require("../utils/permisssionChecker") -exports.runThis = () => { - client.on("interactionCreate",async (interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "sendTranscript") 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]}) - }) -} +const pendingDelete = [] /** * @@ -51,6 +28,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => //start code + //FIX CHANNEL COULD BE CLOSED AFTER DELETE: + if (pendingDelete.includes(channel.id)) return false + //remove ot bot from transcript channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id}) @@ -88,21 +68,28 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) } log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) + pendingDelete.push(channel.id) if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) //getID & send DM & send api event - await channel.messages.fetchPinned().then(msglist => { + await channel.messages.fetchPinned().then(async 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").value.value - const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) + require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) const id = hiddendata.data.find(d => d.key == "openerid").value + const sphd = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description) + sphd.hiddenData.data.push({key:"pendingdelete",value:"true"}) + const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data) + newEmbed.setDescription(sphd.description + bot.hiddenData.writeHiddenData(sphd.hiddenData.type,sphd.hiddenData.data)) + await firstmsg.edit({embeds:[newEmbed]}) + if (!id) return false try{ @@ -163,7 +150,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => 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").value - const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) if (!ticketData) return @@ -236,9 +223,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => 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").value - const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - require("./api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason) + require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason) const id = hiddendata.data.find(d => d.key == "openerid").value @@ -278,9 +265,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => 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").value - const ticketData = require("./getoptions").getOptionsById("OTnewT"+ticketId) + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - require("./api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) + require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) const id = hiddendata.data.find(d => d.key == "openerid").value @@ -298,10 +285,11 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => if (enableTranscript == true && mode != "deletenotranscript"){ - const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** none" + const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** "+l.messages.none + const closedByPrefix = (mode.startsWith("delete")) ? "deleted by" : "closed by" if (config.system.enable_transcript || config.system.enable_DM_transcript){ - var fileattachment = await require("./transcript").createTranscript(channelmessages,channel) + var fileattachment = await require("../transcript").createTranscript(channelmessages,channel) if (fileattachment == false){log("system","internal error: transcript is not created!");return} } @@ -311,7 +299,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => .setColor(config.main_color) .setTitle("📄 "+l.messages.newTranscriptTitle) .setDescription(transcriptReason) - .setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) + .setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({ embeds:[transcriptEmbed], @@ -324,7 +312,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => .setColor(config.main_color) .setTitle("📄 "+l.messages.newTranscriptTitle) .setDescription(transcriptReason) - .setFooter({text:"closed by: "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) + .setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()}) if (!isDatabaseError) ticketOpener.send({ embeds:[transcriptEmbed], @@ -340,6 +328,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => //await timer() setTimeout(async () => { + pendingDelete.shift() await channel.delete() },6000) } diff --git a/core/ticketOpener.js b/core/ticketActions/ticketOpener.js similarity index 88% rename from core/ticketOpener.js rename to core/ticketActions/ticketOpener.js index 17a1d19..47eed3d 100755 --- a/core/ticketOpener.js +++ b/core/ticketActions/ticketOpener.js @@ -1,22 +1,34 @@ const discord = require('discord.js') -const bot = require('../index') +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 configParser = require("../utils/configParser") const storage = bot.storage module.exports = () => { + //dropdown placeholder + client.on("interactionCreate",(interaction) => { + if (!interaction.isSelectMenu()) return + if (interaction.customId != "OTdropdownMenu") return + if (interaction.values.includes("OTChooseTicket")) interaction.deferUpdate() + + }) + + var closeButton = bot.buttons.firstmsg.firstmsgRowNormal //ticket button click / create ticket - client.on("interactionCreate",(interaction) => { + client.on("interactionCreate",async (interaction) => { if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){ var customId = "OTnewT"+interaction.options.getString("type") }else if (interaction.isButton()){ var customId = interaction.customId + }else if (interaction.isSelectMenu() && (interaction.customId == "OTdropdownMenu")){ + var customId = interaction.values[0] + }else return if (interaction.isButton()){ @@ -30,17 +42,19 @@ module.exports = () => { } - if (getconfigoptions.getTicketValues("id").includes(customId)){ + if (configParser.getTicketValuesArray("id").includes(customId)){ //ticketoptions from config - const currentTicketOptions = getconfigoptions.getOptionsById(customId) + const currentTicketOptions = configParser.getTicketById(customId) - if (currentTicketOptions == false || currentTicketOptions.type != "ticket") return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]}) + if (currentTicketOptions == false) return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]}) if (interaction.isButton()){ interaction.deferUpdate() }else if (interaction.isChatInputCommand()){ interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]}) + }else if (interaction.isSelectMenu()){ + await interaction.deferUpdate() } if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){ @@ -181,7 +195,7 @@ module.exports = () => { }) log("system","created new ticket",[{key:"ticket",value:ticketName},{key:"user",value:interaction.user.tag}]) - require("./api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions}) + require("../api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions}) }) }else{ try { diff --git a/core/ticketActions/ticketReopener.js b/core/ticketActions/ticketReopener.js new file mode 100755 index 0000000..10ecdf7 --- /dev/null +++ b/core/ticketActions/ticketReopener.js @@ -0,0 +1,52 @@ +const discord = require('discord.js') +const bot = require('../../index') +const client = bot.client +const config = bot.config +const log = bot.errorLog.log +const l = bot.language +const storage = bot.storage +const pfb = discord.PermissionFlagsBits + +/** + * + * @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 == 1){ + 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 \ No newline at end of file diff --git a/core/ticketReopener.js b/core/ticketReopener.js deleted file mode 100755 index e3cbd97..0000000 --- a/core/ticketReopener.js +++ /dev/null @@ -1,214 +0,0 @@ -const discord = require('discord.js') -const bot = require('../index') -const client = bot.client -const config = bot.config -const log = bot.errorLog.log -const l = bot.language -const storage = bot.storage -const pfb = discord.PermissionFlagsBits - -/** - * - * @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 == 1){ - 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() - .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 closeRowClosed = 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("✔") - ) - - var reopenBar = new discord.ActionRowBuilder() - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicketTrue") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("✅") - ) - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicketFalse") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("❌") - ) - - var reopenBar1 = new discord.ActionRowBuilder() - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicketTrue1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("✅") - ) - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicketFalse1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("❌") - ) - - var reopenCommandBar = new discord.ActionRowBuilder() - .addComponents( - new discord.ButtonBuilder() - .setCustomId("reopenTicket1") - .setDisabled(false) - .setStyle(discord.ButtonStyle.Secondary) - .setEmoji("🔓") - ) - - - - - - //NORMAL WAY - client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "reopenTicket") return - - interaction.deferUpdate() - interaction.message.edit({components:[reopenBar]}) - - }) - - client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "reopenTicketFalse") return - - interaction.deferUpdate() - interaction.message.edit({components:[closeRowClosed]}) - - }) - - client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "reopenTicketTrue") return - - interaction.deferUpdate() - - const embed = new discord.EmbedBuilder() - .setColor(config.main_color) - .setTitle(":unlock: "+l.messages.reopenTitle+" :unlock:") - .setDescription(l.messages.reopenDescription) - - interaction.message.edit({embeds:[embed],components:[closeRowNormal]}) - - reopenTicket(interaction.guild,interaction.channel,interaction.user) - }) - - - //COMMAND WAY - client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "reopenTicket1") return - - interaction.deferUpdate() - interaction.message.edit({components:[reopenBar1]}) - - }) - - client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "reopenTicketFalse1") return - - interaction.deferUpdate() - interaction.message.edit({components:[reopenCommandBar]}) - - }) - - client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (interaction.customId != "reopenTicketTrue1") return - - interaction.deferUpdate() - - const embed = new discord.EmbedBuilder() - .setColor(config.main_color) - .setTitle(":unlock: "+l.messages.reopenTitle+" :unlock:") - .setDescription(l.messages.reopenDescription) - - interaction.message.edit({content:null,embeds:[embed],components:[closeRowNormal]}) - - reopenTicket(interaction.guild,interaction.channel,interaction.user) - }) -} \ No newline at end of file diff --git a/core/utils/configParser.js b/core/utils/configParser.js new file mode 100644 index 0000000..9dec95f --- /dev/null +++ b/core/utils/configParser.js @@ -0,0 +1,156 @@ +const bot = require("../../index") +const config = bot.config +const l = bot.language + +//TYPEDEFS: +//================== + +//OTTicketOptions +/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: String,adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String}} OTTicketOptions */ + +//OTRoleOptions +/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",enableDmOnOpen:Boolean}} OTRoleOptions */ + +//OTWebsiteOptions +/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",url:String}} OTWebsiteOptions */ + + +//OTConfigMessage +/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean}} OTConfigMessage*/ + +//StringOptions +/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"} OTTicketStringOptions */ +/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDmOnOpen"} OTRoleStringOptions */ +/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */ + +//FUNCTIONS: +//================== + +/** @param {String} id the id of the embed @returns {OTConfigMessage}*/ +exports.getConfigMessage = (id) => { + var returned = config.messages.find(a => a.id == id) + if (returned){ + return returned + } + var result = config.messages[0] + if (!result){ + throw new Error("'messages' object in config.json is empty") + return + } + return result +} + +/** + * + * @param {String} id + * @param {Boolean} withoutOTnewT + * @returns {OTTicketOptions|false} + */ + exports.getTicketById = (id,withoutOTnewT) => { + var result = false + if (withoutOTnewT){ + config.options.forEach((option) => { + if (option.id == id && option.type == "ticket"){ + result = option + } + }) + }else{ + config.options.forEach((option) => { + if ("OTnewT"+option.id == id && option.type == "ticket"){ + result = option + } + }) + } + return result +} + +/** + * + * @param {String} id + * @param {Boolean} withoutOTnewR + * @returns {OTRoleOptions|false} + */ + exports.getRoleById = (id,withoutOTnewR) => { + var result = false + if (withoutOTnewR){ + config.options.forEach((option) => { + if (option.id == id && option.type == "role"){ + result = option + } + }) + }else{ + config.options.forEach((option) => { + if ("OTnewR"+option.id == id && option.type == "role"){ + result = option + } + }) + } + return result +} + +/** + * + * @param {String} id + * @returns {OTWebsiteOptions|false} + */ + exports.getWebsiteById = (id) => { + var result = false + config.options.forEach((option) => { + if (option.id == id && option.type == "website"){ + result = option + } + }) + return result +} + +/** + * @param {OTTicketStringOptions} value + * @returns {String[]} + */ +exports.getTicketValuesArray = (value,idWithoutOTnewT) => { + var result = [] + const prefix = idWithoutOTnewT ? "" : "OTnewT" + config.options.forEach((opt) => { + if (opt.type == "ticket"){ + if (value == "id"){ + result.push(prefix+opt[value]) + }else{ + result.push(opt[value]) + } + } + }) + return result +} + +/** + * @param {OTRoleStringOptions} value + * @returns {String[]} + */ + exports.getRoleValuesArray = (value,idWithoutOTnewR) => { + var result = [] + const prefix = idWithoutOTnewR ? "" : "OTnewR" + config.options.forEach((opt) => { + if (o.type == "role"){ + if (value == "id"){ + result.push(prefix+opt[value]) + }else{ + result.push(opt[value]) + } + } + }) + return result +} + +/** + * @param {OTWebsiteStringOptions} value + * @returns {String[]} + */ + exports.getWebsiteValuesArray = (value) => { + var result = [] + config.options.forEach((opt) => { + if (o.type == "website"){ + result.push(opt[value]) + } + }) + return result +} \ No newline at end of file diff --git a/core/utils/getButton.js b/core/utils/getButton.js index 5aeff34..86db8dc 100644 --- a/core/utils/getButton.js +++ b/core/utils/getButton.js @@ -1,7 +1,6 @@ const discord = require("discord.js") const bot = require("../../index") const config = bot.config -const getoptions = require("../getoptions") const l = bot.language /**@returns {"DANGER"|"SUCCESS"|"PRIMARY"|"SECONDARY"} */ @@ -81,7 +80,7 @@ exports.rawButtonData = class { this.type = "" this.color = "" - this.enableDMMessage = true + this.enableDmOnOpen = true this.url = "" this.roles = ["",""] this.mode = "" diff --git a/core/utils/getDropdown.js b/core/utils/getDropdown.js new file mode 100644 index 0000000..e457a1c --- /dev/null +++ b/core/utils/getDropdown.js @@ -0,0 +1,46 @@ +const discord = require("discord.js") +const bot = require("../../index") +const config = bot.config +const l = bot.language + +const configParser = require("./configParser") +/** + * + * @param {String[]} ids + * @returns {discord.SelectMenuBuilder|false} + */ +exports.getDropdown = (ids) => { + const dropdown = new discord.SelectMenuBuilder() + .setCustomId("OTdropdownMenu") + .setDisabled(false) + .setMaxValues(1) + .setMinValues(1) + .setPlaceholder("Choose a ticket") + .addOptions( + new discord.SelectMenuOptionBuilder() + .setDefault(true) + .setLabel("Choose a ticket") + .setValue("OTChooseTicket") + ) + + ids.forEach((id) => { + const option = configParser.getTicketById(id,true) + if (option){ + const selectComponent = new discord.SelectMenuOptionBuilder() + .setDefault(false) + .setValue("OTnewT"+option.id) + + if (!option.label && !option.icon){ + selectComponent.setLabel("OT ERROR: no description/emoji") + }else{ + if (option.label) selectComponent.setLabel(option.label) + if (option.icon) selectComponent.setEmoji(option.icon) + } + + dropdown.addOptions(selectComponent) + } + }) + + + return dropdown +} \ No newline at end of file diff --git a/core/ticketMessageEmbed.js b/core/utils/getEmbed.js similarity index 66% rename from core/ticketMessageEmbed.js rename to core/utils/getEmbed.js index bcc9d39..c7c8ecb 100644 --- a/core/ticketMessageEmbed.js +++ b/core/utils/getEmbed.js @@ -1,8 +1,8 @@ const discord = require('discord.js') -const bot = require('../index') +const bot = require('../../index') const client = bot.client const config = bot.config -const getButton = require("./utils/getButton") +const getButton = require("./getButton") const l = bot.language /** @@ -16,7 +16,7 @@ const l = bot.language exports.createEmbed = (id) => { //----------------------------------- //general importing - const data = require("./utils/getTicketMessages").getTicketMessage(id) + const data = require("./configParser").getConfigMessage(id) /**@type {discord.ButtonBuilder[]}*/ var buttons = [] /**@type {getButton.rawButtonData[]} */ @@ -63,28 +63,40 @@ exports.createEmbed = (id) => { embed.setDescription(description) //----------------------------------- + //----------------------------------- - //create the components - var AmountOfRows = Math.ceil(buttons.length / 4) - var currentRow = 0 + //create the components IF DROPDOWN IS FALSE + if (!data.dropdown){ + var AmountOfRows = Math.ceil(buttons.length / 4) + var currentRow = 0 - /** - * @type {discord.MessageActionRow[]} - */ - var componentRows = [] + /** + * @type {discord.MessageActionRow[]} + */ + var componentRows = [] - for (let i = AmountOfRows; i > 0; i--){ + for (let i = AmountOfRows; i > 0; i--){ - componentRows.push(new discord.ActionRowBuilder()) - } - - buttons.forEach((button,index) => { - componentRows[currentRow].addComponents([button]) - - if (index == 3 || index == 7 || index == 11 || index == 15 || index == 19 || index == 23 || index == 27 || index == 31 || index == 35 || index == 39){ - currentRow = currentRow + 1 + componentRows.push(new discord.ActionRowBuilder()) } - }) + + buttons.forEach((button,index) => { + componentRows[currentRow].addComponents([button]) + + if (index == 3 || index == 7 || index == 11 || index == 15 || index == 19 || index == 23 || index == 27 || index == 31 || index == 35 || index == 39){ + currentRow = currentRow + 1 + } + }) + + //create the component IF DROPDOWN is true + }else{ + const ids = data.options + const dropdown = require("./getDropdown").getDropdown(ids) + var componentRows = [ + new discord.ActionRowBuilder() + .setComponents(dropdown) + ] + } //----------------------------------- diff --git a/core/utils/getTicketMessages.js b/core/utils/getTicketMessages.js deleted file mode 100644 index bd97d14..0000000 --- a/core/utils/getTicketMessages.js +++ /dev/null @@ -1,16 +0,0 @@ -const bot = require("../../index") -const config = bot.config -const l = bot.language - -exports.getTicketMessage = (input) => { - var returned = config.messages.find(a => a.id == input) - if (returned){ - return returned - } - var result = config.messages[0] - if (!result){ - throw new Error("'messages' object in config.json is empty") - return - } - return result -} \ No newline at end of file diff --git a/core/utils/hiddendata.js b/core/utils/hiddendata.js index 9920dd0..53dc898 100644 --- a/core/utils/hiddendata.js +++ b/core/utils/hiddendata.js @@ -49,4 +49,18 @@ exports.writeHiddenData = (type,data) => { const result = "[ ](OTDATA|"+type+"//"+datastring+")" return result +} + +/** + * + * @param {String} description + * @returns {{description:String,hiddenData:hiddenData}} + */ +exports.removeHiddenData = (description) => { + const hiddenData = this.readHiddenData(description) + + const splitted = description.split("[ ](OTDATA") + const original = splitted[0] + + return {description:original,hiddenData:hiddenData} } \ No newline at end of file diff --git a/core/utils/liveStatus.js b/core/utils/liveStatus.js new file mode 100644 index 0000000..e5e57db --- /dev/null +++ b/core/utils/liveStatus.js @@ -0,0 +1,15 @@ +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 +} + +module.exports = async () => { + const chalk = await loadChalk() + + //LIVESTATUS SOON +} \ No newline at end of file diff --git a/core/utils/warningManager.js b/core/utils/warningManager.js deleted file mode 100644 index 702b118..0000000 --- a/core/utils/warningManager.js +++ /dev/null @@ -1,19 +0,0 @@ -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 7fa703a..b5d3d9a 100644 --- a/index.js +++ b/index.js @@ -9,8 +9,7 @@ // | \____/ | | | | | | | \ | // \__________/ |__| \__________| |__| \___| - -const discord = require('discord.js') +const discord = require("discord.js") const fs = require('fs') const {GatewayIntentBits,Partials} = discord const client = new discord.Client({ @@ -25,35 +24,58 @@ const client = new discord.Client({ partials:[Partials.Channel,Partials.Message] }) exports.client = client - client.setMaxListeners(50) +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client") -if (process.argv[2]){ - if (process.argv[2].endsWith("d")){ - var isDev = true - console.log("starting in dev mode...") - }else{var isDev = false} -}else{var isDev = false} +var tempconfig = require("./config.json") +/**@type {Boolean} */ +var isDevConfig = false -exports.developerMode = isDev +if (process.argv.some((v) => v == "--devconfig")){ + async function logFLAGS(){ + const chalk = await (await import("chalk")).default + console.log(chalk.blue("[FLAGS] => used dev config instead of normal config")) + }; logFLAGS() + isDevConfig = true + try{ + tempconfig = require("./devConfig.json") + }catch{tempconfig = require("./config.json")} +}else{ + tempconfig = require("./config.json") +} +if (process.argv.some((v) => v == "--nochecker")){ + async function logFLAGS(){ + const chalk = await (await import("chalk")).default + console.log(chalk.blue("[FLAGS] => disabled checker.js")) + }; logFLAGS() +} +if (process.argv.some((v) => v == "--debug")){ + async function logFLAGS(){ + const chalk = await (await import("chalk")).default + console.log(chalk.blue("[FLAGS] => enabled DEBUG mode")) + }; logFLAGS() +} +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded flags") + +exports.developerConfig = isDevConfig const language = require("./core/languageManager").language exports.language = language +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language") -if (isDev){ - try { - var config = require('./devConfig.json') - }catch{ - console.log("devConfig.json not found! Trying the normal config...") - var config = require("./config.json") - } -}else{var config = require('./config.json')} +const config = tempconfig exports.config = config +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config") exports.storage = require('./core/dynamicdatabase/storage') +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage") exports.errorLog = require("./core/errorLogSystem") const log = this.errorLog.log +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM") +if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs") +this.errorLog.log("debug","loaded new logs") exports.hiddenData = require("./core/utils/hiddendata") +this.errorLog.log("debug","loaded hiddendataTM") exports.embeds = { commands:require("./core/interactionHandlers/embeds/commands") @@ -63,8 +85,10 @@ exports.buttons = { firstmsg:require("./core/interactionHandlers/buttons/firstmsg"), verifybars:require("./core/interactionHandlers/buttons/verifyBars") } +this.errorLog.log("debug","loaded buttons & embeds") client.on('ready',async () => { + this.errorLog.log("debug","client logged in") var statusSet = false const setStatus = (type,text) => { if (statusSet == true) return @@ -78,13 +102,15 @@ client.on('ready',async () => { statusSet = true log("system","loaded status",[{key:"type",value:type},{key:"text",value:text}]) } + this.errorLog.log("debug","bot status loaded") const chalk = await (await import("chalk")).default if (!process.argv[2]){ console.log(chalk.red("WELCOME TO OPEN TICKET!")) + this.errorLog.log("debug","loaded console interface") log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) - require("./core/utils/warningManager")() + require("./core/utils/liveStatus")() console.log(chalk.blue("\n\nlogs:")+"\n============") if (config.status.enabled){ @@ -105,8 +131,9 @@ client.on('ready',async () => { if (!process.argv[2].startsWith("slash")){ console.log(chalk.red("WELCOME TO OPEN TICKET!")) + this.errorLog.log("debug","loaded console interface") log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) - require("./core/utils/warningManager")() + require("./core/utils/liveStatus")() console.log(chalk.blue("\n\nlogs:")+"\n============") if (config.status.enabled){ @@ -118,6 +145,7 @@ client.on('ready',async () => { await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() }else{ console.log(chalk.red("STARTING IN ")+chalk.blue("SLASH MODE")+chalk.red("...")) + this.errorLog.log("debug","slashmode activated") console.log("logs:\n================") console.log("client logged in...") console.log("loading files...") @@ -135,16 +163,17 @@ client.on('ready',async () => { //load plugins require("./core/api/pluginlauncher")() + this.errorLog.log("debug","loading plugins") }) - -if (!isDev){ require("./core/checker").checker() -} + this.errorLog.log("debug","loading checker.js") + this.errorLog.log("debug","checking config...") if (process.argv[2] && process.argv[2].startsWith("slash")){ //do nothing }else{ + this.errorLog.log("debug","LOADING COMMANDS") //commands require('./commands/ticket')() require("./commands/help")() @@ -155,18 +184,19 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){ require("./commands/remove")() require("./commands/reopen")() + this.errorLog.log("debug","LOADING CORE") //core - require('./core/ticketOpener')() - require("./core/ticketCloser").runThis() - //require("./core/closebuttons")() // => everything is now in ./core/interactionHandlers/ + require('./core/ticketActions/ticketOpener')() require("./core/reactionRoles")() - require("./core/ticketReopener").runThis() + this.errorLog.log("debug","LOADING INTERACTION HANDLERS") //InteractionHandlers require("./core/interactionHandlers/handlers/handlers")() + //require("./test")() } +this.errorLog.log("debug","loading api") const APIEvents = require("./core/api/modules/events") const debugLog = (debugString) => { @@ -177,6 +207,7 @@ const errorLog = (errorString,stack) => { const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n\n==========================" fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack) } +this.errorLog.log("debug","OT error system loaded successfully") client.on("debug", async (message) => { if (message.startsWith("Provided token:")){ @@ -194,4 +225,5 @@ process.on("uncaughtException",async (error,origin) => { APIEvents.onError(error.name+": "+error.message,new Date()) }) -client.login(config.auth_token) \ No newline at end of file +client.login(config.auth_token) +this.errorLog.log("debug","login with token") \ No newline at end of file diff --git a/language/arabic.json b/language/arabic.json index eb5fd1b..4f98097 100644 --- a/language/arabic.json +++ b/language/arabic.json @@ -1,75 +1,75 @@ { - "errors":{ - "missingArgsTitle":"حجج باطلة", - "missingArgsDescription":"حجة مفقودة", - "noPermsTitle":"ليس لديك إذن", - "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", - "noPermsDelete":"Only admins can delete a ticket!", - "chooseFromListTitle":"بطاقة التعريف غير صالحة", - "chooseFromListDescription":"اختر أحد المعرفات أدناه:", - "boterror":"مشكلة في الروبوت", - "notInTicketTitle":"أنت لست في تذكرة!", - "notInTicketDescription":"هذا الأمر لا يعمل خارج التذاكر!", - "ticketDoesntExist":"هذه التذكرة لم تعد موجودة!", - "roleDoesntExist":"هذا الدور لم يعد موجودًا!", - "anotherOption":"هذا الخيار ليس تذكرة بل نوع آخر!", - "maxAmountTitle":"بلغ الحد الأقصى!", - "maxAmountDescription":"لقد وصلت إلى الحد الأقصى لعدد التذاكر المسموح بها!\nلذلك لا يمكنك إنشاء واحدة جديدة!", - "somethingWentWrong":"**هناك خطأ ما!**\nالرجاء المحاولة مرة أخرى!", - "somethingWentWrongTranscript":"**حدث خطأ ما أثناء كتابة النص!**\nالرجاء المحاولة مرة أخرى!" - }, - "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!", + "errors": { + "missingArgsTitle": "قيمة غير صالحة!", + "missingArgsDescription": "قيمة مفقودة", + "noPermsTitle": "ليس لديك برمشنات !", + "noPermsDescription": "أنت بحاجة الى برمشن `ADMINISTRATOR` او أن تكون في قائمة المسموح بهم!", + "noPermsDelete": "فقط الإداريين يمكنهم حذف التكت!", + "chooseFromListTitle": "Invalid ID", + "chooseFromListDescription": "قم بأختيار أحد من الأيديات من الأسفل:", + "boterror": "خلل في البوت !", + "notInTicketTitle": "انت لست في تكت!", + "notInTicketDescription": "هذا الأمر لا يعمل خارج التكت!", + "ticketDoesntExist": "هذا التكت لم يعد فعال!", + "roleDoesntExist": "خطاً ,لم تعد الرتبة موجوده!", + "anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!", + "maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!", + "maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!", + "somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!", + "somethingWentWrongTranscript": "هناك خطاً في محاولة طبع التكت!**\nأعد المحاولة لاحقاً!" + }, + "commands": { + "userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!", + "userRemovedTitle": "تم أزالة {0} من المستخدمين من التكت!", + "renameTitle": "تم تغيير أسم التكت الى {0}!", + "closeTitle": "تم أغلاق التكت!", + "deleteTitle": " جاري حذف التكت...", + "reopenTitle": "إعادة فتح التكت!", - "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":"**اذهب إلى {0} لإنشاء تذكرة!**\n\n", - "header2":"**قم بتشغيل الأمر `/new` أو `/ticket` لإنشاء تذكرة!**\n\n", + "ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!", + "maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_" + }, + "helpMenu": { + "title": "الأوامر المتاحة:", + "header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n", + "header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n", - "msgCmd":"تفرخ تضمين مع الأزرار. (المسؤولون فقط)", - "renameCmd":"إعادة تسمية تذكرة. (بدون مسافات)", - "closeCmd":"أغلق التذكرة.", - "deleteCmd":"حذف التذكرة.", - "addCmd":"أضف مستخدمًا إلى التذكرة.", - "removeCmd":"إزالة مستخدم من التذكرة.", - "reopenCmd":"أعد فتح التذكرة بعد إغلاقه." - }, - "buttons":{ - "close":"إغلاق التذكرة", - "delete":"حذف التذكرة", - "reopen":"إعادة فتح التذكرة", - "sendTranscript":"إرسال ملف النص" - }, - "messages":{ - "reopenTitle":"أعيد فتح هذه التذكرة!", - "reopenDescription":"لا تتردد في التحدث مرة أخرى!", - "closedTitle":"أغلقت هذه التذكرة!", - "closedDescription":"يمكن للمسؤولين فقط التحدث في هذه التذكرة الآن!\n\n*انقر فوق الزر أدناه لحذف هذه التذكرة أو إعادة فتحها!*", - "createdTitle":"تم إنشاء التذكرة!", - "createdDescription":"تم إنشاء تذكرتك ، يمكنك اكتشافها عن طريق ping", + "msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)", + "renameCmd": "إعادة تسمية التكت. (بدون مسافات)", + "closeCmd": "أغلاق التكت.", + "deleteCmd": "حذف التكت.", + "addCmd": "إضافة مستخدم الى التكت.", + "removeCmd": "إزالة مستخدم من التكت.", + "reopenCmd": "إعادة فتح تكت بعد إغلاقة." + }, + "buttons": { + "close": "إغلاق التكت", + "delete": "حذف التكت", + "reopen": "إعادة فتح التكت", + "sendTranscript": "طبع التكت" + }, + "messages": { + "reopenTitle": "تم إعادة فتح التكت بنجاح!", + "reopenDescription": "لا تتردد في فتح التكت مرة أخرى , حظاً موفقاً!", + "closedTitle": "تم إغلاق التكت!", + "closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التكت او إعادة فتحة مجدداً!*", + "createdTitle": "تم إنشاء تكت!", + "createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!", - "newTicketDmTitle":"تذكرة جديدة!", - "closedTicketDmTitle":"تم إغلاق التذكرة!", - "deletedTicketDmTitle":"تم حذف التذكرة!", - "closedTicketDmDescription":"تم إغلاق تذكرتك!", - "deletedTicketDmDescription":"تم حذف تذكرتك!", - "reopenTicketDmTitle":"أعيد فتح التذكرة!", - "reopenTicketDmDescription":"تم إعادة فتح تذكرتك!", - "newTranscriptTitle":"نسخة جديدة هنا!", - "hereIsTheTranscript":"هذا هو النص:", + "newTicketDmTitle": "تكت جديد!", + "closedTicketDmTitle": "تم إغلاق التكت!", + "deletedTicketDmTitle": "تم حذف التكت!", + "closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري", + "deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!", + "reopenTicketDmTitle": "تم إعادة فتح تذكرتك!", + "reopenTicketDmDescription": "تم إعادة فتح التكت!", + "newTranscriptTitle": "توجد نسخة تكت جديدة هنا!", + "hereIsTheTranscript": "هذا هي النسخة:", - "chooseCategory":"اختر فئة:", - "gettingdeleted":"...يتم حذف التذكرة", + "chooseCategory": "أختر الكتقاجوري:", + "gettingdeleted": "يتم حذف التكت...", - "none":"none", - "reason":"reason" - } + "none": "لا يوجد", + "reason": "سبب" + } } \ No newline at end of file diff --git a/language/portuguese.json b/language/portuguese.json index 3a24109..3106d2c 100644 --- a/language/portuguese.json +++ b/language/portuguese.json @@ -27,7 +27,7 @@ "reopenTitle":"Reabriu este ticket!", "ticketWarning":"A incorporação está na mensagem abaixo!", - "maxTicketWarning":"**Cuidado:** _Você só pode criar {0} tickets) de cada vez!!_" + "maxTicketWarning":"**Cuidado:** _Você só pode criar {0} ticket(s) de cada vez!!_" }, "helpMenu":{ "title":"Comandos Disponíveis:",