diff --git a/README.md b/README.md index cbff836..0c19f00 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ 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.3.1-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.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) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&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.3.1-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.2) [![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) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be) ### Open Ticket Open Ticket is of the most customisable discord ticket bots of all time! @@ -62,7 +62,7 @@ Translators |Slovenian |n1kkec#5341 | ## links -current version: _v3.3.1_ +current version: _v3.3.2_
changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
documentation: [click here](https://docs.openticket.dj-dj.be/quick-start) diff --git a/commands/claim.js b/commands/claim.js index dfe79e6..03fc1a3 100644 --- a/commands/claim.js +++ b/commands/claim.js @@ -34,11 +34,11 @@ module.exports = () => { const hiddendata = hdraw.hiddenData const ticketId = hiddendata.data.find(d => d.key == "type").value - hiddendata.data.push({key:"claimedby",value:interaction.user.id}) - storage.set("claimData",interaction.channel.id,interaction.user.id) + hiddendata.data.push({key:"claimedby",value:claimingUser.id}) + storage.set("claimData",msg.channel.id,claimingUser.id) const newEmbed = new embed(firstmsg.embeds[0].data) - .setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()}) + .setFooter({text:"claimed by: "+msg.author.tag,iconURL:msg.author.displayAvatarURL()}) .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data)) if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){ @@ -66,8 +66,7 @@ module.exports = () => { if (!interaction.guild) return if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ permsChecker.sendUserNoPerms(interaction.user) - interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true}) - return + return interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true}) } await interaction.deferReply() @@ -80,8 +79,8 @@ module.exports = () => { const hiddendata = hdraw.hiddenData const ticketId = hiddendata.data.find(d => d.key == "type").value - hiddendata.data.push({key:"claimedby",value:interaction.user.id}) - storage.set("claimData",interaction.channel.id,interaction.user.id) + hiddendata.data.push({key:"claimedby",value:user.id}) + storage.set("claimData",interaction.channel.id,user.id) const newEmbed = new embed(firstmsg.embeds[0].data) .setFooter({text:"claimed by: "+user.tag,iconURL:user.displayAvatarURL()}) diff --git a/commands/unclaim.js b/commands/unclaim.js index 74176fa..9c99c2f 100644 --- a/commands/unclaim.js +++ b/commands/unclaim.js @@ -35,7 +35,7 @@ module.exports = () => { const ticketId = hiddendata.data.find(d => d.key == "type").value hiddendata.data.push({key:"claimedby",value:"false"}) - storage.set("claimData",interaction.channel.id,"false") + storage.set("claimData",msg.channel.id,"false") const newEmbed = new embed(firstmsg.embeds[0].data) .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data)) diff --git a/config.json b/config.json index 429077e..1e7a03c 100644 --- a/config.json +++ b/config.json @@ -40,6 +40,7 @@ "color":"gray", "adminroles":["role id"], + "readonlyAdminroles":["role id"], "channelprefix":"question-", "category":"category id", "message":"You created a ticket!", @@ -101,11 +102,17 @@ "dropdown":false, "enableFooter":false, - "footer":"Open Ticket v3.3.1 - I'm a footer!", + "footer":"Open Ticket v3.3.2 - I'm a footer!", + + "enableFooterImage":false, + "footerImage":"https://www.example.com/catmemes/cat.png", "enableThumbnail":false, "thumbnail":"https://www.example.com/catmemes/cat.png", + "enableImage":false, + "image":"https://www.example.com/catmemes/cat.png", + "enableCustomColor":false, "color":"#ffffff", diff --git a/core/interactionHandlers/handlers/accepted/claiming.js b/core/interactionHandlers/handlers/accepted/claiming.js index dfb5c96..ecd27f8 100644 --- a/core/interactionHandlers/handlers/accepted/claiming.js +++ b/core/interactionHandlers/handlers/accepted/claiming.js @@ -52,6 +52,8 @@ module.exports = () => { }else{ firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]}) } + + interaction.channel.send({embeds:[bot.embeds.commands.claimEmbed(interaction.user,interaction.user)]}) }) }) } \ No newline at end of file diff --git a/core/interactionHandlers/handlers/accepted/closing.js b/core/interactionHandlers/handlers/accepted/closing.js index ba5bddc..1ce19b8 100644 --- a/core/interactionHandlers/handlers/accepted/closing.js +++ b/core/interactionHandlers/handlers/accepted/closing.js @@ -23,7 +23,7 @@ module.exports = () => { if (interaction.customId != "OTcloseTicketTrue") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} if (closeTicketButtonChecker == true) return diff --git a/core/interactionHandlers/handlers/accepted/deleting.js b/core/interactionHandlers/handlers/accepted/deleting.js index 2cfdbc0..ca51707 100644 --- a/core/interactionHandlers/handlers/accepted/deleting.js +++ b/core/interactionHandlers/handlers/accepted/deleting.js @@ -22,7 +22,7 @@ module.exports = () => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicketTrue") return - interaction.deferUpdate() + await interaction.deferUpdate() if (deleteTicketButtonChecker == true) return deleteTicketButtonChecker = true @@ -62,7 +62,7 @@ module.exports = () => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicketTrue1") return - interaction.deferUpdate() + await interaction.deferUpdate() if (deleteTicketButtonChecker1 == true) return deleteTicketButtonChecker1 = true diff --git a/core/interactionHandlers/handlers/accepted/reopening.js b/core/interactionHandlers/handlers/accepted/reopening.js index d810770..0a2ded5 100644 --- a/core/interactionHandlers/handlers/accepted/reopening.js +++ b/core/interactionHandlers/handlers/accepted/reopening.js @@ -17,11 +17,11 @@ const bs = discord.ButtonStyle module.exports = () => { //REOPEN - client.on("interactionCreate",(interaction) => { + client.on("interactionCreate",async (interaction) => { if (!interaction.isButton()) return if (interaction.customId != "OTreopenTicket") return - interaction.deferUpdate() + await interaction.deferUpdate() interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) require("../../../ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user) }) diff --git a/core/interactionHandlers/handlers/verifyBars.js b/core/interactionHandlers/handlers/verifyBars.js index d02dc9d..902c8d5 100644 --- a/core/interactionHandlers/handlers/verifyBars.js +++ b/core/interactionHandlers/handlers/verifyBars.js @@ -16,22 +16,22 @@ const bs = discord.ButtonStyle module.exports = () => { //CLOSE - client.on("interactionCreate",interaction => { + client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTcloseTicket") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]}) }) - client.on("interactionCreate",interaction => { + client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTcloseTicketFalse") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} if (interaction.message.pinned && interaction.message.author.id == client.user.id){ @@ -47,22 +47,22 @@ module.exports = () => { }) //DELETE - client.on("interactionCreate",interaction => { + client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicket") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]}) }) - client.on("interactionCreate",interaction => { + client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicketFalse") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} if (interaction.message.pinned && interaction.message.author.id == client.user.id){ @@ -78,22 +78,22 @@ module.exports = () => { }) //DELETE NO TRANSCRIPT - client.on("interactionCreate",interaction => { + client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicket1") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]}) }) - client.on("interactionCreate",interaction => { + client.on("interactionCreate",async interaction => { if (!interaction.isButton()) return if (interaction.customId != "OTdeleteTicketFalse1") return try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} interaction.message.edit({components:[bot.buttons.close.closeCommandRow]}) }) diff --git a/core/reactionRoles.js b/core/reactionRoles.js index 6ce63b5..c901154 100644 --- a/core/reactionRoles.js +++ b/core/reactionRoles.js @@ -11,7 +11,7 @@ const APIEvents = require("./api/modules/events") module.exports = async () => { const chalk = await (await import("chalk")).default - client.on("interactionCreate",(interaction) => { + client.on("interactionCreate",async (interaction) => { if (!interaction.isButton() && !interaction.isStringSelectMenu()) return if (interaction.isButton() && !interaction.customId.startsWith("newR")) return if (interaction.isStringSelectMenu() && !(interaction.customId == "OTdropdownMenu")) return @@ -32,7 +32,7 @@ module.exports = async () => { return }else{ try { - interaction.deferUpdate() + await interaction.deferUpdate() } catch{} } diff --git a/core/ticketActions/ticketOpener.js b/core/ticketActions/ticketOpener.js index 80910af..8640e02 100755 --- a/core/ticketActions/ticketOpener.js +++ b/core/ticketActions/ticketOpener.js @@ -10,13 +10,12 @@ const storage = bot.storage module.exports = () => { //dropdown placeholder - client.on("interactionCreate",(interaction) => { + client.on("interactionCreate",async (interaction) => { if (!interaction.isStringSelectMenu()) return if (interaction.customId != "OTdropdownMenu") return if (interaction.values.includes("OTChooseTicket")){ - interaction.deferUpdate() + await interaction.deferUpdate() } - }) @@ -37,7 +36,7 @@ module.exports = () => { if (interaction.customId.startsWith("OTnewT")){ const optionid = interaction.customId.split("OTnewT")[1] if (!optionid){ - interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]}) + await interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]}) return } } @@ -53,7 +52,7 @@ module.exports = () => { if (interaction.isButton()){ try { - if (config.system.answerInEphemeralOnOpen) await interaction.deferReply({ephemeral:true}) + await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpe}) } catch{} }else if (interaction.isChatInputCommand()){ await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen}) @@ -110,9 +109,7 @@ module.exports = () => { type:"role", allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel] }) - }catch{ - log("system","invalid role! At 'config.json => main_adminroles:"+index) - } + }catch{} }) //add ticket adminroles @@ -131,9 +128,28 @@ module.exports = () => { type:"role", allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel] }) - }catch{ - log("system","invalid role! At 'config.json => options/ticket/...:"+index) - } + }catch{} + } + }) + + //add ticket adminroles + /** + * @type {String[]} + */ + const readonlyTicketadmin = currentTicketOptions.readonlyAdminroles + readonlyTicketadmin.forEach((role,index) => { + if (!config.adminRoles.includes(role) && !currentTicketOptions.adminroles.includes(role)){ + try { + const adminrole = guild.roles.cache.find(r => r.id == role) + if (!adminrole) return + + permissionsArray.push({ + id:adminrole, + type:"role", + allow:[pfb.AddReactions,pfb.ViewChannel], + deny:[pfb.SendMessages,pfb.AttachFiles,pfb.EmbedLinks] + }) + }catch{} } }) @@ -148,9 +164,7 @@ module.exports = () => { deny:[pfb.ViewChannel] }) } - }catch{ - log("system","invalid role! At 'config.json => system/memberRole") - } + }catch{} } //create the channel @@ -166,7 +180,7 @@ module.exports = () => { if (currentTicketOptions.autoclose.enable) storage.set("autocloseTickets",ticketChannel.id,currentTicketOptions.autoclose.inactiveHours) const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}]) - + var ticketEmbed = new discord.EmbedBuilder() //.setAuthor({name:interaction.user.id}) .setColor(config.color) diff --git a/core/utils/configParser.js b/core/utils/configParser.js index 9e68d31..1352f9d 100644 --- a/core/utils/configParser.js +++ b/core/utils/configParser.js @@ -6,7 +6,7 @@ const l = bot.language //================== //OTTicketOptions -/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: "red"|"green"|"blue"|"gray",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number} }} OTTicketOptions */ +/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: "red"|"green"|"blue"|"gray",adminroles: String[], readonlyAdminroles: String[], channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number} }} 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 */ @@ -16,13 +16,13 @@ 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[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/ +/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableFooterImage: boolean, footerImage: string, enableThumbnail: boolean, thumbnail: string, enableImage: boolean, image: 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*/ //OTAllOptions -/**@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",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, url:String, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number}}} OTAllOptions */ +/**@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",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, url:String, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number}, readonlyAdminroles: String[]}} OTAllOptions */ //StringOptions -/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"image"|"closedCategory"} OTTicketStringOptions */ +/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"image"|"closedCategory"|"adminroles"|"autoclose"} OTTicketStringOptions */ /**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDmOnOpen"} OTRoleStringOptions */ /**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */ diff --git a/core/utils/getEmbed.js b/core/utils/getEmbed.js index f6a0f02..2dc0f5c 100644 --- a/core/utils/getEmbed.js +++ b/core/utils/getEmbed.js @@ -40,11 +40,25 @@ exports.createEmbed = (id) => { //create the embed const embed = new discord.EmbedBuilder() .setTitle(data.name) - if (data.enableFooter) embed.setFooter({text:data.footer}) + + try { + const footerimg = (data.enableFooter && data.enableFooterImage) ? data.footerImage : undefined + if (data.enableFooter) embed.setFooter({text:data.footer,iconURL:footerimg}) + }catch{ + bot.errorLog.log("info","FOOTER FAILED TO LOAD, probably invalid url!") + } try { if (data.enableThumbnail) embed.setThumbnail(data.thumbnail) - }catch{bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!")} + }catch{ + bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!") + } + + try { + if (data.enableImage) embed.setImage(data.image) + }catch{ + bot.errorLog.log("info","IMAGE FAILED TO LOAD, probably invalid url!") + } if (data.enableCustomColor){ embed.setColor(data.color) diff --git a/index.js b/index.js index b17511e..88fd156 100644 --- a/index.js +++ b/index.js @@ -28,7 +28,7 @@ INFORMATION: ============ - Open Ticket v3.3.1 - © DJdj Development + Open Ticket v3.3.2 - © DJdj Development discord: https://discord.dj-dj.be website: https://www.dj-dj.be