From 86a5a1a2ca0d171cd2e96e1f29ed55d836a2d93c Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Tue, 27 Dec 2022 11:38:32 +0100 Subject: [PATCH] v3.1.0 push 1 --- README.md | 4 +- config.json | 21 +++++++-- core/checker.js | 4 +- core/reactionRoles.js | 93 +++++++++++++++++++------------------- core/utils/configParser.js | 2 +- core/utils/getDropdown.js | 23 ++++++++-- core/utils/getEmbed.js | 12 +++-- package.json | 2 +- 8 files changed, 99 insertions(+), 62 deletions(-) diff --git a/README.md b/README.md index 01c1a56..a1a838b 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.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) +[![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.1.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.1.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) 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! @@ -52,7 +52,7 @@ Start using it now, you can do anything! ## information -_v3.0.1_ +_v3.1.0_ changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog) diff --git a/config.json b/config.json index e449367..c9e1e82 100644 --- a/config.json +++ b/config.json @@ -92,7 +92,7 @@ "dropdown":false, "enableFooter":false, - "footer":"Open Ticket v3.0.1 - I'm a footer!", + "footer":"Open Ticket v3.1.0 - I'm a footer!", "enableThumbnail":false, "thumbnail":"https://www.example.com/catmemes/cat.png", @@ -101,8 +101,23 @@ "color":"#ffffff", "options":["general","apply"], - "enableTicketExplaination":true, - "enableMaxTicketsWarning":true + + "other":{ + "enableTicketExplaination":true, + "enableMaxTicketsWarning":true, + "customDropdownPlaceholder":{ + "enable":false, + "text":"Choose a ticket" + }, + "customCategoryText":{ + "enable":false, + "text":"choose a category:" + }, + "embedTitleURL":{ + "enable":false, + "url":"https://www.dj-dj.be/projects/open-ticket" + } + } } ] } \ No newline at end of file diff --git a/core/checker.js b/core/checker.js index 6269018..9da940e 100644 --- a/core/checker.js +++ b/core/checker.js @@ -312,8 +312,8 @@ exports.checker = async () => { } //ticket explaination & max tickets warning - checkType(input.enableTicketExplaination,"boolean",path+"/enableTicketExplaination") - checkType(input.enableMaxTicketsWarning,"boolean",path+"/enableMaxTicketsWarning") + checkType(input.other.enableTicketExplaination,"boolean",path+"/other/enableTicketExplaination") + checkType(input.other.enableMaxTicketsWarning,"boolean",path+"/other/enableMaxTicketsWarning") //OPTIONS!!! var counter = 0 diff --git a/core/reactionRoles.js b/core/reactionRoles.js index 31b619e..de34b8f 100644 --- a/core/reactionRoles.js +++ b/core/reactionRoles.js @@ -12,64 +12,65 @@ module.exports = async () => { const chalk = await (await import("chalk")).default client.on("interactionCreate",(interaction) => { - if (!interaction.isButton()) return - if (!interaction.customId.startsWith("newR")) return + if (!interaction.isButton() && !interaction.isStringSelectMenu()) return + if (interaction.isButton() && !interaction.customId.startsWith("newR")) return + if (interaction.isStringSelectMenu() && !(interaction.customId == "OTdropdownMenu")) return interaction.deferUpdate() - if (interaction.customId.startsWith("newR")){ - const optionid = interaction.customId.split("newR")[1] - if (!optionid){ - interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]}) - return - } - try { + const optionidRaw = interaction.isStringSelectMenu() ? interaction.values[0] : interaction.customId + const optionid = optionidRaw.split("newR")[1] + if (!optionid){ + interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]}) + return + } - const option = require("./utils/getButton").getOption(optionid) - /**@type {"add"|"remove"|"add&remove"} */ - const mode = option.mode - const user = interaction.member + try { + + const option = require("./utils/getButton").getOption(optionid) + /**@type {"add"|"remove"|"add&remove"} */ + const mode = option.mode + const user = interaction.member + + if (mode == "add"){ + option.roles.forEach((role) => { + interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) + + log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) + const apirole = interaction.guild.roles.cache.find(r => r.id == role) + APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) + }) + + }else if (mode == "remove"){ + option.roles.forEach((role) => { + interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) + + log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) + const apirole = interaction.guild.roles.cache.find(r => r.id == role) + APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) + }) - if (mode == "add"){ - option.roles.forEach((role) => { - interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) - + }else if (mode == "add&remove"){ + option.roles.forEach((role) => { + if (interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){ + interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) + log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) const apirole = interaction.guild.roles.cache.find(r => r.id == role) - APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) - }) - - }else if (mode == "remove"){ - option.roles.forEach((role) => { - interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) + APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) + }else { + interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) const apirole = interaction.guild.roles.cache.find(r => r.id == role) - APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) - }) - - }else if (mode == "add&remove"){ - option.roles.forEach((role) => { - if (interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){ - interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) - - log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) - const apirole = interaction.guild.roles.cache.find(r => r.id == role) - APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) - }else { - interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) - - log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) - const apirole = interaction.guild.roles.cache.find(r => r.id == role) - APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) - } - }) - } - - }catch{ - interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]}) + APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) + } + }) } + + }catch{ + interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]}) } }) } \ No newline at end of file diff --git a/core/utils/configParser.js b/core/utils/configParser.js index 20797cd..e5c82d1 100644 --- a/core/utils/configParser.js +++ b/core/utils/configParser.js @@ -16,7 +16,7 @@ const l = bot.language //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*/ +/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/ //StringOptions /**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"closedCategory"} OTTicketStringOptions */ diff --git a/core/utils/getDropdown.js b/core/utils/getDropdown.js index 2801c68..5b21d00 100644 --- a/core/utils/getDropdown.js +++ b/core/utils/getDropdown.js @@ -7,24 +7,26 @@ const configParser = require("./configParser") /** * * @param {String[]} ids + * @param {String|undefined|false} placeholder * @returns {discord.StringSelectMenuBuilder|false} */ -exports.getDropdown = (ids) => { +exports.getDropdown = (ids,placeholder) => { const dropdown = new discord.StringSelectMenuBuilder() .setCustomId("OTdropdownMenu") .setDisabled(false) .setMaxValues(1) .setMinValues(1) - .setPlaceholder(l.messages.chooseATicket) + .setPlaceholder(placeholder || l.messages.chooseATicket) .addOptions( new discord.SelectMenuOptionBuilder() .setDefault(true) - .setLabel(l.messages.chooseATicket) + .setLabel(placeholder || l.messages.chooseATicket) .setValue("OTChooseTicket") ) ids.forEach((id) => { const option = configParser.getTicketById(id,true) + const roleoption = configParser.getRoleById(id,true) if (option){ const selectComponent = new discord.SelectMenuOptionBuilder() .setDefault(false) @@ -37,8 +39,23 @@ exports.getDropdown = (ids) => { if (option.icon) selectComponent.setEmoji(option.icon) } + dropdown.addOptions(selectComponent) + + }else if (roleoption){ + const selectComponent = new discord.SelectMenuOptionBuilder() + .setDefault(false) + .setValue("OTnewR"+roleoption.id) + + if (!roleoption.label && !roleoption.icon){ + selectComponent.setLabel("OT ERROR: no description/emoji") + }else{ + if (roleoption.label) selectComponent.setLabel(roleoption.label) + if (roleoption.icon) selectComponent.setEmoji(roleoption.icon) + } + dropdown.addOptions(selectComponent) } + }) diff --git a/core/utils/getEmbed.js b/core/utils/getEmbed.js index aa44034..1abb837 100644 --- a/core/utils/getEmbed.js +++ b/core/utils/getEmbed.js @@ -43,9 +43,12 @@ exports.createEmbed = (id) => { embed.setColor(config.main_color) } + if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL) + var description = data.description - if (data.enableTicketExplaination){ - description = description+"\n\n__"+l.messages.chooseCategory+"__\n" + if (data.other.enableTicketExplaination){ + const chooseCategoryMSG = data.other.customCategoryText.enable ? data.other.customCategoryText.text : l.messages.chooseCategory + description = description+"\n\n__"+chooseCategoryMSG+"__\n" var ticketExplainations = [] buttonData.forEach((button) => { @@ -56,7 +59,7 @@ exports.createEmbed = (id) => { description = description+ticketExplainations.join("\n\n") } - if (data.enableMaxTicketsWarning){ + if (data.other.enableMaxTicketsWarning){ description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.max_allowed_tickets) } @@ -92,7 +95,8 @@ exports.createEmbed = (id) => { //create the component IF DROPDOWN is true }else{ const ids = data.options - const dropdown = require("./getDropdown").getDropdown(ids) + const customPlaceholder = data.other.customDropdownPlaceholder.enable ? data.other.customDropdownPlaceholder.text : false + const dropdown = require("./getDropdown").getDropdown(ids,customPlaceholder) var componentRows = [ new discord.ActionRowBuilder() .setComponents(dropdown) diff --git a/package.json b/package.json index fd25aa9..9a74f35 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-ticket", - "version": "3.0.1", + "version": "3.1.0", "description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.", "main": "index.js", "scripts": {