diff --git a/README.md b/README.md index 930c163..01c1a56 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # 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-3.0.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.0.0) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![documentation](https://img.shields.io/badge/documentation-Click%20Here-yellow.svg?style=flat-square)](https://docs.openticket.dj-dj.be) +[![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-3.0.1-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.0.1) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![documentation](https://img.shields.io/badge/documentation-Click%20Here-yellow.svg?style=flat-square)](https://docs.openticket.dj-dj.be) Open ticket is the most configurable open-source ticket bot for discord! Made with the newest technologies. Like: Slash commands, transcripts, multiple ticket types, buttons & dropdowns! Start using it now, you can do anything! @@ -48,11 +48,11 @@ Start using it now, you can do anything! [Click here to start your adventure!](https://docs.openticket.dj-dj.be/quick-start) ## documentation -[Official Documentation](https://docs.openticket.dj-dj.be) +[](https://docs.openticket.dj-dj.be) ## information -_v3.0.0_ +_v3.0.1_ changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog) diff --git a/config.json b/config.json index 729f66c..e449367 100644 --- a/config.json +++ b/config.json @@ -92,7 +92,7 @@ "dropdown":false, "enableFooter":false, - "footer":"Open Ticket v3.0.0 - I'm a footer!", + "footer":"Open Ticket v3.0.1 - 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 f1a1c6d..5536ffb 100644 --- a/core/api/modules/events.js +++ b/core/api/modules/events.js @@ -4,7 +4,8 @@ const client = bot.client const config = bot.config const log = bot.errorLog.log const l = bot.language -const storage = bot.storage + +const configParser = require("../../utils/configParser") //EVENT API: @@ -48,7 +49,7 @@ exports.onTicketOpen = (user,channel,guild,date,ticketdata) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata * @param {String} reason */ exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => { @@ -69,7 +70,7 @@ exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata */ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => { //system @@ -89,7 +90,7 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata */ exports.onTicketReopen = (user,channel,guild,date,ticketdata) => { //system @@ -110,7 +111,7 @@ exports.onTicketReopen = (user,channel,guild,date,ticketdata) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata */ exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => { //system @@ -131,7 +132,7 @@ exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata */ exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => { //system @@ -237,7 +238,7 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata */ /** @@ -246,7 +247,7 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata * @param {String} reason */ @@ -265,7 +266,7 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => { * @param {discord.TextChannel} channel * @param {discord.Guild} guild * @param {Date} date - * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata + * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata */ /** diff --git a/core/api/pluginlauncher.js b/core/api/pluginlauncher.js index 3c6877e..0f70e93 100644 --- a/core/api/pluginlauncher.js +++ b/core/api/pluginlauncher.js @@ -19,9 +19,13 @@ module.exports = () => { /**@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") + try { + 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") + }catch{ + fs.writeFileSync("./apiDebug.txt","ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n") + } } failcount++ totalcount++ diff --git a/core/checker.js b/core/checker.js index db98bca..6269018 100644 --- a/core/checker.js +++ b/core/checker.js @@ -85,6 +85,9 @@ exports.checker = async () => { /**@param {"userid"|"roleid"|"channelid"|"serverid"} mode @param {String[]} arrayValue @param {String} path */ const checkDiscordArray = (mode,arrayValue,path) => { + if (!Array.isArray(arrayValue)){ + return createError("'"+path+"' | this needs to be an Array!") + } if (mode == "userid"){ arrayValue.forEach((value,index) => { if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){ @@ -438,6 +441,9 @@ exports.checker = async () => { const splitw = w.split("'") if (splitw.length > 1){ var splitstring = chalk.yellow(splitw[0])+chalk.blue("'"+splitw[1]+"'")+chalk.yellow(splitw[2]) + if (splitw[3]){splitstring = splitstring+chalk.yellow(splitw[3])} + if (splitw[4]){splitstring = splitstring+chalk.yellow(splitw[4])} + if (splitw[5]){splitstring = splitstring+chalk.yellow(splitw[5])} }else {var splitstring = chalk.yellow(splitw[0])} console.log(splitstring) }) diff --git a/core/errorLogSystem.js b/core/errorLogSystem.js index 8c03515..71755ae 100644 --- a/core/errorLogSystem.js +++ b/core/errorLogSystem.js @@ -93,10 +93,24 @@ exports.custom = (title,message,emoji,color) => { return x } +exports.clearDebugFile = () => { + const fs = require("fs") + if (!fs.existsSync("./openticketdebug.txt")) return + const content = fs.readFileSync("./openticketdebug.txt").toString().split("\n") + if (content.length < 5000) return + for (let i = 0; i < 4000; i++) { + content.shift() + } + + const newContent = "==========================\n\n=========================="+content.join("\n") + fs.writeFileSync("./openticketdebug.txt",newContent) +} + const normalLog = (debugString) => { const fs = require("fs") const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n\n==========================" fs.writeFileSync("./openticketdebug.txt",content+"\nSYSTEM: "+debugString) + this.clearDebugFile() } /** diff --git a/core/ticketActions/ticketOpener.js b/core/ticketActions/ticketOpener.js index f6264c4..1221ad2 100755 --- a/core/ticketActions/ticketOpener.js +++ b/core/ticketActions/ticketOpener.js @@ -11,7 +11,7 @@ const storage = bot.storage module.exports = () => { //dropdown placeholder client.on("interactionCreate",(interaction) => { - if (!interaction.isSelectMenu()) return + if (!interaction.isStringSelectMenu()) return if (interaction.customId != "OTdropdownMenu") return if (interaction.values.includes("OTChooseTicket")) interaction.deferUpdate() @@ -26,7 +26,7 @@ module.exports = () => { var customId = "OTnewT"+interaction.options.getString("type") }else if (interaction.isButton()){ var customId = interaction.customId - }else if (interaction.isSelectMenu() && (interaction.customId == "OTdropdownMenu")){ + }else if (interaction.isStringSelectMenu() && (interaction.customId == "OTdropdownMenu")){ var customId = interaction.values[0] }else return @@ -53,7 +53,7 @@ module.exports = () => { interaction.deferUpdate() }else if (interaction.isChatInputCommand()){ interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]}) - }else if (interaction.isSelectMenu()){ + }else if (interaction.isStringSelectMenu()){ await interaction.deferUpdate() } diff --git a/core/utils/getDropdown.js b/core/utils/getDropdown.js index 52174d4..2801c68 100644 --- a/core/utils/getDropdown.js +++ b/core/utils/getDropdown.js @@ -7,10 +7,10 @@ const configParser = require("./configParser") /** * * @param {String[]} ids - * @returns {discord.SelectMenuBuilder|false} + * @returns {discord.StringSelectMenuBuilder|false} */ exports.getDropdown = (ids) => { - const dropdown = new discord.SelectMenuBuilder() + const dropdown = new discord.StringSelectMenuBuilder() .setCustomId("OTdropdownMenu") .setDisabled(false) .setMaxValues(1) diff --git a/index.js b/index.js index 8a09539..e529ec6 100644 --- a/index.js +++ b/index.js @@ -126,7 +126,11 @@ client.on('ready',async () => { log("system","bot logged in!") - await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() + try { + await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() + }catch{ + this.errorLog.log("info","tried to cache user information, failed!") + } return } @@ -163,7 +167,7 @@ client.on('ready',async () => { console.log(chalk.green("switching to slashDisable.js")) require("./core/slashSystem/slashDisable")() }else{ - console.log(chalk.red("Internal Error: unknown slash mode!")) + console.log(chalk.red("[SLASH CMD MANAGER]: unknown slash mode!")) process.exit(1) } } @@ -214,12 +218,14 @@ const debugLog = (debugString) => { const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n\n==========================" fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString) } + this.errorLog.clearDebugFile() } const errorLog = (errorString,stack) => { if (!APIConfig.disable.debug.all){ const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n\n==========================" fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack) } + this.errorLog.clearDebugFile() } this.errorLog.log("debug","OT error system loaded successfully") diff --git a/language/german.json b/language/german.json index 2284a57..3a31cda 100644 --- a/language/german.json +++ b/language/german.json @@ -3,8 +3,7 @@ "missingArgsTitle":"Ungültiges Argument!", "missingArgsDescription":"Fehlendes Argument!", "noPermsTitle":"Du hast keine Rechte!", - "noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", - "noPermsDelete":"Only admins can delete a ticket!", + "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!", "chooseFromListTitle":"Ungültige ID", "chooseFromListDescription":"Wählen Sie eine der folgenden ID:", "boterror":"Bot Fehler!", @@ -15,24 +14,30 @@ "anotherOption":"Diese Option ist kein Ticket, sondern eine andere Art!", "maxAmountTitle":"Das Limit wurde erreicht!", "maxAmountDescription":"Sie haben die maximal zulässige Anzahl von Tickets erreicht!\nSie können also keine neue erstellen.!", - "somethingWentWrong":"**Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!", + "somethingWentWrong":"Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!", "somethingWentWrongTranscript":"Bei der Erstellung der Transcript ist etwas schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!" }, "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!", - "claimTitle":"This ticket is now claimed to {0}", - "unclaimTitle":"This ticket isn't claimed anymore!", + "userAddedTitle":"User geaddet!", + "userAddedDescription":"{0} wird zu diesem Ticket hinzugefügt!", + "userRemovedTitle":"User entfernt!", + "userRemovedDescription":"{0} wird aus diesem Ticket entfernt!", - "ticketWarning":"The embed is in the message below!", - "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" + "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!_" }, "helpMenu":{ - "title":"Available Commands:", + "title":"Hilfe Menu:", "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", @@ -64,20 +69,15 @@ "deletedTicketDmTitle":"Ticket löschen!", "closedTicketDmDescription":"Ihr Ticket ist geschlossen!", "deletedTicketDmDescription":"Ihr Ticket ist gelöscht!", - "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...", - - "none":"none", - "reason":"reason", "deletedby":"Gelöscht von", "closedby":"Geschlossen von", - "modalreason":"Was ist der Grund für das schließen des Tickets?", + "modalreason":"Was ist der Grund?", "chooseATicket": "Wähle ein Ticket" } } \ No newline at end of file diff --git a/otWIKI.png b/otWIKI.png new file mode 100644 index 0000000..eb0815a Binary files /dev/null and b/otWIKI.png differ diff --git a/package.json b/package.json index 68219c0..fd25aa9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-ticket", - "version": "3.0.0", + "version": "3.0.1", "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": { @@ -15,7 +15,7 @@ "dependencies": { "axios": "^0.27.2", "chalk": "^5.0.1", - "discord.js": "^14.0.2", + "discord.js": "^14.7.1", "express": "^4.17.1", "node": "^16.10.0", "node-localstorage": "^2.2.1"