diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 25c253c..03ec5d0 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -10,7 +10,7 @@ Support for Open Ticket is only available for the versions specified below! | Version | Supported | | ------- | ------------------ | -| 3.3.3 | :white_check_mark: | +| 3.4.0 | :white_check_mark: | | 3.3.0 | 🟧 | | 3.2.2 | 🟧 | | < 3.2.2 | :x: | diff --git a/README.md b/README.md index 2402319..1d8934f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ In open ticket **v3.3.3 & below**, there is a bug causing weird looking embeds, 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.3-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.3) [![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.4.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.4.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) [![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! @@ -15,9 +15,9 @@ Take a look at all the features and discover the possibilities! ### [Documentation](https://docs.openticket.dj-dj.be/quick-start) ## Features -- **🎉 NEW! html transcripts!** +- **🎉 NEW! html transcripts V2!** - 🔒 close, ❌ delete & ✅ re-open tickets -- 🇬🇧 translation in 14 different languages +- 🇬🇧 translation in 18 different languages - 📄 very advanced customisation - 🆗 buttons or 🔽 dropdowns! - 🆒 plugins @@ -64,9 +64,12 @@ Translators |Turkish |Hydrâelčhâvø#1575 | |Polish |MKevas#8311 | |Slovenian |n1kkec#5341 | +|Thai |Mods HD#0661 | +|Norwegian |NoOneNook#0266 | +|Greek |ꙅoᴎɒᎸɘƚꙅ#3744 | ## links -current version: _v3.3.3_ +current version: _v3.4.0_
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/add.js b/commands/add.js index 0092579..f69e223 100644 --- a/commands/add.js +++ b/commands/add.js @@ -23,25 +23,21 @@ module.exports = () => { return } - msg.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.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.author)]}) + 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.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}]) + 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/utils/configParser").getTicketById(ticketId,true) - APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) + 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()) - }) - + APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) }) if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => { @@ -57,25 +53,20 @@ module.exports = () => { await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) - interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]}) + interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) + interaction.editReply({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/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()) - - }) + 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/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()) }) } \ No newline at end of file diff --git a/commands/change.js b/commands/change.js index 2ce1f36..a4619e8 100644 --- a/commands/change.js +++ b/commands/change.js @@ -12,7 +12,7 @@ const DISABLE = require("../core/api/api.json").disable module.exports = () => { bot.errorLog.log("debug","COMMANDS: loaded change.js") - if (!DISABLE.commands.text.change) client.on("messageCreate",msg => { + if (!DISABLE.commands.text.change) client.on("messageCreate", async msg => { if (!msg.content.startsWith(config.prefix+"change")) return if (!msg.guild) return @@ -21,39 +21,36 @@ module.exports = () => { return } - msg.channel.messages.fetchPinned().then(async msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - const list = [] - config.options.forEach((o) => list.push(o.id)) + const list = [] + config.options.forEach((o) => list.push(o.id)) - var newtype = msg.content.split(config.prefix+"change")[1].substring(1) - if (!newtype) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"change `")]}) + var newtype = msg.content.split(config.prefix+"change")[1].substring(1) + if (!newtype) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"change `")]}) - const newTicket = require("../core/utils/configParser").getTicketById(newtype) - if (!newTicket) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"change `")]}) + const newTicket = require("../core/utils/configParser").getTicketById(newtype) + if (!newTicket) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"change `")]}) - /**@type {String} */ - var chName = msg.channel.name - const splitted = chName.split("-") - const prefix = splitted.shift() - const name = (splitted.length > 0) ? splitted.join("-") : prefix - - if (newTicket.category){ - const parent = await msg.guild.channels.fetch(newTicket.category,{cache:true}) - if (parent && parent.type == discord.ChannelType.GuildCategory) msg.channel.setParent(parent) - } - - msg.channel.setName(newTicket.channelprefix+name) - msg.channel.send({embeds:[bot.embeds.commands.changeEmbed(msg.author,newtype)]}) + /**@type {String} */ + var chName = msg.channel.name + const splitted = chName.split("-") + const prefix = splitted.shift() + const name = (splitted.length > 0) ? splitted.join("-") : prefix + + if (newTicket.category){ + const parent = await msg.guild.channels.fetch(newTicket.category,{cache:true}) + if (parent && parent.type == discord.ChannelType.GuildCategory) msg.channel.setParent(parent) + } + + msg.channel.setName(newTicket.channelprefix+name) + msg.channel.send({embeds:[bot.embeds.commands.changeEmbed(msg.author,newtype)]}) - log("command","someone used the 'change' command",[{key:"user",value:msg.author.tag}]) - log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}]) - APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) - }) + log("command","someone used the 'change' command",[{key:"user",value:msg.author.tag}]) + log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}]) + APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) }) if (!DISABLE.commands.slash.change) client.on("interactionCreate",async (interaction) => { @@ -67,59 +64,55 @@ module.exports = () => { } await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(async (msglist) => { - /**@type {discord.Message} */ - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - const list = [] - config.options.forEach((o) => list.push(o.id)) + const list = [] + config.options.forEach((o) => list.push(o.id)) - var newtype = interaction.options.getString("type",true) - const newTicket = require("../core/utils/configParser").getTicketById(newtype,true) - - if (!newTicket) return interaction.editReply({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"change `")]}) + var newtype = interaction.options.getString("type",true) + const newTicket = require("../core/utils/configParser").getTicketById(newtype,true) + + if (!newTicket) return interaction.editReply({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"change `")]}) - /**@type {discord.PermissionOverwriteManager} */ - const prePermsManager = interaction.channel.permissionOverwrites - const prePerms = prePermsManager.cache - - /**@type {String} */ - var chName = interaction.channel.name - const splitted = chName.split("-") - const prefix = splitted.shift() - const name = (splitted.length > 0) ? splitted.join("-") : prefix + /**@type {discord.PermissionOverwriteManager} */ + const prePermsManager = interaction.channel.permissionOverwrites + const prePerms = prePermsManager.cache + + /**@type {String} */ + var chName = interaction.channel.name + const splitted = chName.split("-") + const prefix = splitted.shift() + const name = (splitted.length > 0) ? splitted.join("-") : prefix - if (newTicket.category){ - const parent = await interaction.guild.channels.fetch(newTicket.category,{cache:true}) - if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent) + if (newTicket.category){ + const parent = await interaction.guild.channels.fetch(newTicket.category,{cache:true}) + if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent) + } + + await prePermsManager.set(prePerms) + interaction.channel.setName(newTicket.channelprefix+name) + + var newHiddendata = hiddendata.data + newHiddendata.find((value,index) => { + if (value.key == "type"){ + newHiddendata[index] = {key:"type",value:newtype} } - - await prePermsManager.set(prePerms) - interaction.channel.setName(newTicket.channelprefix+name) - - var newHiddendata = hiddendata.data - newHiddendata.find((value,index) => { - if (value.key == "type"){ - newHiddendata[index] = {key:"type",value:newtype} - } - }) - - const prevDescription = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description).description - const newData = bot.hiddenData.writeHiddenData("ticketdata",newHiddendata) - const newDescription = prevDescription+newData - const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data) - .setDescription(newDescription) - - firstmsg.edit({embeds:[newEmbed]}) - - interaction.editReply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]}) - - log("command","someone used the 'change' command",[{key:"user",value:interaction.user.tag}]) - log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}]) - APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) + + const prevDescription = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description).description + const newData = bot.hiddenData.writeHiddenData("ticketdata",newHiddendata) + const newDescription = prevDescription+newData + const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data) + .setDescription(newDescription) + + firstmsg.edit({embeds:[newEmbed]}) + + interaction.editReply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]}) + + log("command","someone used the 'change' command",[{key:"user",value:interaction.user.tag}]) + log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}]) + APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) } \ No newline at end of file diff --git a/commands/claim.js b/commands/claim.js index 03fc1a3..f7984f8 100644 --- a/commands/claim.js +++ b/commands/claim.js @@ -26,36 +26,31 @@ module.exports = () => { return } - msg.channel.messages.fetchPinned().then(msglist => { - /**@type {discord.Message} */ - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description) - const hiddendata = hdraw.hiddenData - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - 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: "+msg.author.tag,iconURL:msg.author.displayAvatarURL()}) - .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data)) + hiddendata.push({key:"claimedby",value:claimingUser.id}) + bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata) + storage.set("claimData",msg.channel.id,claimingUser.id) + + const newEmbed = new embed(firstmsg.embeds[0].data) + .setFooter({text:"claimed by: "+msg.author.tag,iconURL:msg.author.displayAvatarURL()}) - if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){ - firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) - }else{ - firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]}) - } + if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){ + firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) + }else{ + firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]}) + } - msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]}) + msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]}) - log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}]) - log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}]) + log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}]) + log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}]) - const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) - APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) - APIEvents.onCommand("claim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) - }) + const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) + APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) + APIEvents.onCommand("claim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) }) if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => { @@ -71,35 +66,35 @@ module.exports = () => { await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(msglist => { - /**@type {discord.Message} */ - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description) - const hiddendata = hdraw.hiddenData - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - hiddendata.data.push({key:"claimedby",value:user.id}) - storage.set("claimData",interaction.channel.id,user.id) + hiddendata.push({key:"claimedby",value:user.id}) + bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata) + storage.set("claimData",interaction.channel.id,user.id) + + interaction.channel.messages.fetchPinned().then(msglist => { + var firstmsg = msglist.last() + if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const newEmbed = new embed(firstmsg.embeds[0].data) .setFooter({text:"claimed by: "+user.tag,iconURL:user.displayAvatarURL()}) - .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data)) if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){ firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) }else{ firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]}) } - - interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]}) - - log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.tag}]) - log("system","user claimed to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:user.tag}]) - - const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) - APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) - APIEvents.onCommand("claim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) + + interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]}) + + log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.tag}]) + log("system","user claimed to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:user.tag}]) + + const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) + APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) + APIEvents.onCommand("claim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) } \ No newline at end of file diff --git a/commands/close.js b/commands/close.js index 5c8d43a..5c13fe3 100644 --- a/commands/close.js +++ b/commands/close.js @@ -24,33 +24,28 @@ module.exports = () => { } const reason = tempreason - msg.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.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 close a ticket while it's being deleted!")]}) + if (hiddendata.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]}) + 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 = "" - const tickets = config.options - tickets.forEach((ticket) => { - if (name.startsWith(ticket.channelprefix)){ - prefix = ticket.channelprefix - } - }) - - require("../core/ticketActions/ticketCloser").closeManager(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()) - + var name = msg.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } }) - + + require("../core/ticketActions/ticketCloser").closeManager(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()) }) @@ -64,31 +59,27 @@ module.exports = () => { await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]}) + if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.editReply({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.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) + const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false + interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) - var name = interaction.channel.name - var prefix = "" - const tickets = config.options - tickets.forEach((ticket) => { - if (name.startsWith(ticket.channelprefix)){ - prefix = ticket.channelprefix - } - }) - - require("../core/ticketActions/ticketCloser").closeManager(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()) - + var name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } }) + + require("../core/ticketActions/ticketCloser").closeManager(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()) }) } \ No newline at end of file diff --git a/commands/delete.js b/commands/delete.js index 018b69a..00dbe8b 100644 --- a/commands/delete.js +++ b/commands/delete.js @@ -21,29 +21,25 @@ module.exports = () => { return } - msg.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]}) + msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]}) - var name = msg.channel.name - var prefix = "" - const tickets = config.options - tickets.forEach((ticket) => { - if (name.startsWith(ticket.channelprefix)){ - prefix = ticket.channelprefix - } - }) - - require("../core/ticketActions/ticketCloser").closeManager(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()) + var name = msg.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } }) - + + require("../core/ticketActions/ticketCloser").closeManager(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()) }) @@ -59,28 +55,24 @@ module.exports = () => { await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) + interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) - var name = interaction.channel.name - var prefix = "" - const tickets = config.options - tickets.forEach((ticket) => { - if (name.startsWith(ticket.channelprefix)){ - prefix = ticket.channelprefix - } - }) - - require("../core/ticketActions/ticketCloser").closeManager(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()) - + var name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } }) + + require("../core/ticketActions/ticketCloser").closeManager(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()) }) } \ No newline at end of file diff --git a/commands/remove.js b/commands/remove.js index 8ef5667..7fc6ef2 100644 --- a/commands/remove.js +++ b/commands/remove.js @@ -23,25 +23,21 @@ module.exports = () => { return } - msg.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - msg.channel.permissionOverwrites.delete(user.id) - msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]}) + msg.channel.permissionOverwrites.delete(user.id) + 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/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()) - }) + 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/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()) }) if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => { @@ -57,23 +53,20 @@ module.exports = () => { await interaction.deferReply() - await interaction.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - interaction.channel.permissionOverwrites.delete(user.id) - interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]}) + interaction.channel.permissionOverwrites.delete(user.id) + interaction.editReply({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}]) + 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/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()) - }) + 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()) }) } \ No newline at end of file diff --git a/commands/rename.js b/commands/rename.js index 4d35f36..db14eb8 100644 --- a/commands/rename.js +++ b/commands/rename.js @@ -21,36 +21,31 @@ module.exports = () => { return } - msg.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - var newname = msg.content.split(config.prefix+"rename")[1].substring(1) + var newname = msg.content.split(config.prefix+"rename")[1].substring(1) - if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"rename `")]}) + if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" ``:\n`"+config.prefix+"rename `")]}) - var name = msg.channel.name - var prefix = "" - const tickets = config.options - tickets.forEach((ticket) => { - if (name.startsWith(ticket.channelprefix)){ - prefix = ticket.channelprefix - } - }) - - if (!prefix) prefix = "noprefix-" - - msg.channel.setName(prefix+newname) - msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]}) - - log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}]) - log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) - APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) + var name = msg.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } }) - - + + if (!prefix) prefix = "noprefix-" + + msg.channel.setName(prefix+newname) + msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]}) + + log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}]) + log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) + APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) }) if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => { @@ -65,31 +60,28 @@ module.exports = () => { await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - var newname = interaction.options.getString("name") - var name = interaction.channel.name - var prefix = "" - const tickets = config.options - tickets.forEach((ticket) => { - if (name.startsWith(ticket.channelprefix)){ - prefix = ticket.channelprefix - } - }) - - if (!prefix) prefix = "noprefix-" - - interaction.channel.setName(prefix+newname) - interaction.editReply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]}) - - log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}]) - log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) - - APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) + var newname = interaction.options.getString("name") + var name = interaction.channel.name + var prefix = "" + const tickets = config.options + tickets.forEach((ticket) => { + if (name.startsWith(ticket.channelprefix)){ + prefix = ticket.channelprefix + } }) + + if (!prefix) prefix = "noprefix-" + + interaction.channel.setName(prefix+newname) + interaction.editReply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]}) + + log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}]) + log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) + + APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) }) } \ No newline at end of file diff --git a/commands/reopen.js b/commands/reopen.js index 52793fd..09d4678 100644 --- a/commands/reopen.js +++ b/commands/reopen.js @@ -15,22 +15,18 @@ module.exports = () => { if (!DISABLE.commands.text.reopen) client.on("messageCreate",msg => { if (!msg.content.startsWith(config.prefix+"reopen")) return - msg.channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.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!")]}) + if (hiddendata.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]}) + msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]}) - 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()) - }) + 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()) }) if (!DISABLE.commands.slash.reopen) client.on("interactionCreate",async (interaction) => { @@ -39,22 +35,17 @@ module.exports = () => { await interaction.deferReply() - interaction.channel.messages.fetchPinned().then(async msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value - if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]}) + if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]}) - await interaction.editReply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) + await interaction.editReply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) - 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()) - }) - - + 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()) }) } \ No newline at end of file diff --git a/commands/unclaim.js b/commands/unclaim.js index 9c99c2f..f591b35 100644 --- a/commands/unclaim.js +++ b/commands/unclaim.js @@ -26,19 +26,20 @@ module.exports = () => { const unclaimuser = storage.get("claimData",msg.channel.id) if (!unclaimuser || unclaimuser == "false") return msg.channel.send({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]}) + const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id) + if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value + + hiddendata.push({key:"claimedby",value:"false"}) + bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata) + storage.set("claimData",msg.channel.id,"false") + msg.channel.messages.fetchPinned().then(msglist => { /**@type {discord.Message} */ var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) - const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description) - const hiddendata = hdraw.hiddenData - const ticketId = hiddendata.data.find(d => d.key == "type").value - - hiddendata.data.push({key:"claimedby",value:"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)) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) if (ticketData && ticketData.autoclose.enable){ @@ -81,20 +82,20 @@ module.exports = () => { const unclaimuser = storage.get("claimData",interaction.channel.id) if (!unclaimuser || unclaimuser == "false") return interaction.editReply({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]}) + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value + + hiddendata.push({key:"claimedby",value:"false"}) + bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata) + storage.set("claimData",interaction.channel.id,"false") interaction.channel.messages.fetchPinned().then(msglist => { /**@type {discord.Message} */ var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description) - const hiddendata = hdraw.hiddenData - const ticketId = hiddendata.data.find(d => d.key == "type").value - hiddendata.data.push({key:"claimedby",value:"false"}) - storage.set("claimData",interaction.channel.id,"false") - const newEmbed = new embed(firstmsg.embeds[0].data) - .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data)) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) if (ticketData && ticketData.autoclose.enable){ diff --git a/config.json b/config.json index 463d6e8..9b69ccb 100644 --- a/config.json +++ b/config.json @@ -64,6 +64,15 @@ "autoclose":{ "enable":false, "inactiveHours":24 + }, + + "ping":{ + "@here":true, + "@everyone":false, + "custom":{ + "enable":false, + "roleId":"012345678910" + } } }, @@ -102,7 +111,7 @@ "dropdown":false, "enableFooter":false, - "footer":"Open Ticket v3.3.3 - I'm a footer!", + "footer":"Open Ticket v3.4.0 - I'm a footer!", "enableFooterImage":false, "footerImage":"https://www.example.com/catmemes/cat.png", diff --git a/core/checker.js b/core/checker.js index a0fd9d5..e44198c 100644 --- a/core/checker.js +++ b/core/checker.js @@ -427,7 +427,7 @@ exports.checker = async () => { 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") && !lf.startsWith("french") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish") && !lf.startsWith("slovenian")){ + 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") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish") && !lf.startsWith("slovenian") && !lf.startsWith("thai") && !lf.startsWith("norwegian") && !lf.startsWith("greek")){ createError("'languagefile' | invalid language, more info in the wiki") } diff --git a/core/interactionHandlers/handlers/accepted/claiming.js b/core/interactionHandlers/handlers/accepted/claiming.js index ecd27f8..0f9bcb1 100644 --- a/core/interactionHandlers/handlers/accepted/claiming.js +++ b/core/interactionHandlers/handlers/accepted/claiming.js @@ -7,7 +7,6 @@ const log = bot.errorLog.log const permissionChecker = require("../../../utils/permisssionChecker") const storage = bot.storage -const hiddendata = bot.hiddenData const embed = discord.EmbedBuilder const mc = config.color const permsChecker = require("../../../utils/permisssionChecker") @@ -32,20 +31,21 @@ module.exports = () => { return } + const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id) + if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value + + hiddendata.push({key:"claimedby",value:interaction.user.id}) + bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata) + storage.set("claimData",interaction.channel.id,interaction.user.id) + interaction.channel.messages.fetchPinned().then(msglist => { /**@type {discord.Message} */ var firstmsg = msglist.last() if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) - const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description) - 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) const newEmbed = new embed(firstmsg.embeds[0].data) .setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()}) - .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data)) if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){ firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) diff --git a/core/ticketActions/ticketCloser.js b/core/ticketActions/ticketCloser.js index f96213c..de4cbc0 100755 --- a/core/ticketActions/ticketCloser.js +++ b/core/ticketActions/ticketCloser.js @@ -73,26 +73,16 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => { if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0) //getID & send DM & send api event - 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("../utils/configParser").getTicketById(ticketId,true) - require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) + const hiddendata = bot.hiddenData.readHiddenData(channel.id) + if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - const id = hiddendata.data.find(d => d.key == "openerid").value + require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) - 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 - - }) + hiddendata.push({key:"pendingdelete",value:"true"}) + bot.hiddenData.writeHiddenData(channel.id,hiddendata) }else if (mode == "close"){ //close @@ -143,54 +133,39 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => { const ticketInfoError = bot.errorLog.serverError("Unable to detect ticket information.\n*(First message that this bot sends)*\n\n__**Possible reasons:**__\n- you unpinned the first message\n- the first message is deleted\n- it has been unpinned & repinned after another message has been pinned.\n\n__**Possible solutions:**__\n- unpin all messages in this channel & repin the first message that this bot sent.\nIf this doesn't work, just delete the ticket manually!") //add ticket adminroles - await channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id){ - var firstmsg = msglist.find((m => m.author.id == client.user.id)) - if (firstmsg == undefined || firstmsg.author.id != client.user.id){ - return channel.send({embeds:[ticketInfoError]}) - } + + const hiddendata = bot.hiddenData.readHiddenData(channel.id) + if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]}) + const ticketId = hiddendata.find(d => d.key == "type").value + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) + + if (!ticketData) return + if (ticketData.closedCategory.enable){ + /**@type {discord.CategoryChannel} */ + const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory) + try { + channel.setParent(category) + }catch{ + bot.errorLog.log("system","failed to move channel to new category!") } - - if (firstmsg.embeds.length < 1 || !firstmsg.embeds[0].description.includes("OTDATA")) return channel.send({embeds:[ticketInfoError]}) + } - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value - const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - - if (!ticketData) return - - if (ticketData.closedCategory.enable){ - /**@type {discord.CategoryChannel} */ - const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory) + ticketData.adminroles.forEach((role,index) => { + if (!config.adminRoles.includes(role)){ try { - channel.setParent(category) + const adminrole = guild.roles.cache.find(r => r.id == role) + if (!adminrole) return + + permissionArray.push({ + id:adminrole, + type:"role", + allow:[pfb.AddReactions,pfb.ViewChannel,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages], + deny:[] + }) }catch{ - bot.errorLog.log("system","failed to move channel to new category!") + log("system","invalid role! At 'config.json => options/ticket/...:"+index) } } - - /** - * @type {String[]} - */ - const ticketadmin = ticketData.adminroles - ticketadmin.forEach((role,index) => { - if (!config.adminRoles.includes(role)){ - try { - const adminrole = guild.roles.cache.find(r => r.id == role) - if (!adminrole) return - - permissionArray.push({ - id:adminrole, - type:"role", - allow:[pfb.AddReactions,pfb.ViewChannel,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages], - deny:[] - }) - }catch{ - log("system","invalid role! At 'config.json => options/ticket/...:"+index) - } - } - }) }) channel.permissionOverwrites.set(permissionArray) @@ -207,23 +182,8 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => { log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) - //getID & send DM & send api event - await channel.messages.fetchPinned().then(msglist => { - var firstmsg = msglist.last() - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type").value - 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) - - const id = hiddendata.data.find(d => d.key == "openerid").value - - if (!id) return false - - }) - - + //send api event + require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason) } /** @@ -263,6 +223,9 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => { const deleteHandler = async () => { if (deleteRequired){ pendingDelete.shift() + //delete HIDDENDATA + storage.delete("HIDDENDATA",channel.id) + await channel.delete() } } diff --git a/core/ticketActions/ticketOpener.js b/core/ticketActions/ticketOpener.js index ab3bfb2..0d38bef 100755 --- a/core/ticketActions/ticketOpener.js +++ b/core/ticketActions/ticketOpener.js @@ -132,12 +132,8 @@ module.exports = () => { }) //add ticket adminroles - /** - * @type {String[]} - */ - const readonlyTicketadmin = currentTicketOptions.readonlyAdminroles - if (readonlyTicketadmin){ - readonlyTicketadmin.forEach((role,index) => { + if (currentTicketOptions.readonlyAdminroles){ + currentTicketOptions.readonlyAdminroles.forEach((role,index) => { if (!config.adminRoles.includes(role) && !currentTicketOptions.adminroles.includes(role)){ try { const adminrole = guild.roles.cache.find(r => r.id == role) @@ -180,7 +176,7 @@ module.exports = () => { storage.set("userFromChannel",ticketChannel.id,interaction.member.id) 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()}]) + bot.hiddenData.writeHiddenData(ticketChannel.id,[{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}) @@ -193,16 +189,19 @@ module.exports = () => { } if (currentTicketOptions.ticketmessage.length > 0){ - ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata) - }else{ - ticketEmbed.setDescription(hiddendata) + ticketEmbed.setDescription(currentTicketOptions.ticketmessage) } if (currentTicketOptions.thumbnail.enable) ticketEmbed.setThumbnail(currentTicketOptions.thumbnail.url) if (currentTicketOptions.image.enable) ticketEmbed.setImage(currentTicketOptions.image.url) + const herePing = currentTicketOptions.ping['@here'] ? " @here" : "" + const everyonePing = currentTicketOptions.ping['@everyone'] ? " @everyone" : "" + const customPing = currentTicketOptions.ping.custom.enable ? " <@&"+currentTicketOptions.ping.custom.roleId+">" : "" + + ticketChannel.send({ - content:"<@"+interaction.member.id+"> @here", + content:"<@"+interaction.member.id+">"+herePing+everyonePing+customPing, embeds:[ticketEmbed], components:[closeButton] diff --git a/core/transcriptSystem/communication/compileJson.js b/core/transcriptSystem/communication/compileJsonV1.js similarity index 89% rename from core/transcriptSystem/communication/compileJson.js rename to core/transcriptSystem/communication/compileJsonV1.js index a28a5f5..d2be2cd 100644 --- a/core/transcriptSystem/communication/compileJson.js +++ b/core/transcriptSystem/communication/compileJsonV1.js @@ -11,6 +11,14 @@ const version = require("../info.json").version /**@typedef {{style:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String, titleColor:String}, bot:{name:String, id:Number, pfp:String}, ticket:{creatorname:String, creatorid:Number, closedtime:Number, openedtime:Number}}} OThtsDataOption */ +/**========================================================== +============================================================= +================THIS FILE ISN'T USED ANYMORE!!=============== + This file is for html transcripts V1! + Visit compileJsonV2.js for the current version! +============================================================= +===========================================================*/ + /** * * @param {discord.Guild} guild @@ -46,13 +54,9 @@ exports.compile = (guild,channel,user,messagesInv,data) => { }) msg.embeds.forEach((embed) => { - if (embed.description){ - var desc = bot.hiddenData.removeHiddenData(embed.description).description - }else{var desc = false} - embedArray.push({ title:embed.title || false, - description:desc, + description:embed.description ? embed.description : false, authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false), authortext:(embed.author ? embed.author.name : false), footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false), diff --git a/core/transcriptSystem/communication/compileJsonV2.js b/core/transcriptSystem/communication/compileJsonV2.js new file mode 100644 index 0000000..2a2acff --- /dev/null +++ b/core/transcriptSystem/communication/compileJsonV2.js @@ -0,0 +1,394 @@ +const discord = require('discord.js') + +const bot = require("../../../index") +const tsconfig = bot.tsconfig +const tsembeds = require("../embeds") +const tsdb = require("../tsdb") + +const otversion = require("../../../package.json").version +const version = require("../info.json").version + +const mentions = require("./mentions").replacementions + +/**@typedef {{background:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String}, header:{enableCustomHeader:Boolean, decoColor:String, backgroundColor:String, textColor:String}, stats:{enableCustomStats:Boolean, backgroundColor:String, keyTextColor:String, valueTextColor:String, hideBackgroundColor:String, hideTextColor:String}} OTTranscriptStyle} */ +/**@typedef {{name:String, id:String, pfp:String}} OTTranscriptBot */ +/**@typedef {{name:String, id:String, guildname:String, guildid:String, guildinvite:String|false, creatorname:String, creatorid:String, closedbyname:String, closedbyid:String, claimedname:String, claimedid:String, creatorpfp:String, closedbypfp:String, claimedpfp:String, closedtime:Number, openedtime:Number, components:{messages:1, files:1, embeds:1, reactions:1, interactions:{dropdowns:1, buttons:1, total:1}, attachments:{invites:1, images:1, gifs:1, stickers:1}}, roleColors:[{id:String,color:String}] }} OTTranscriptTicket */ +/**@typedef {{author:{name:String, id:String, color:String, pfp:String, bot:Boolean, verifiedBot:Boolean, system:Boolean}, content:String|false, timestamp:Number, type:"normal", important:Boolean, edited:Boolean, embeds:[{title:String|false, description:String|false, authorimg:String|false, authortext:String|false, footerimg:String|false, footertext:String|false, color:String, image:String|false, thumbnail:String|false, url:String|false, fields:[{name:String,value:String,inline:Boolean}]}], attachments:[{type:"FILE", name:String, fileType:String, size:String, url:String}, {type:"FILE:image", name:String, fileType:String, size:String, url:String}, {type:"URL:invite", guildId:String, guildName:String, guildSize:Number, guildOnline:Number, image:String, url:String}, {type:"URL:gif", url:String}, {type:"BUILDIN:sticker", name:String, url:String}], components:[{type:"buttons", buttons:[{type:"interaction"|"url", label:String|false, icon:String|false, color:"gray"|"green"|"red"|"blue", id:String|false, url:String|false, disabled:Boolean}]}, {type:"dropdown", placeholder:String|false, options:[{label:String|false, icon:String|false, description:String|false, id:String|false}]}, {type:"reactions", reactions:[{amount:1, emoji:String, type:"svg"|"image"|"gif"}]}], reply:{type:"reply"|"command"|false, user:{name:String, id:String, color:String, pfp:String, bot:Boolean, verifiedBot:Boolean, system:Boolean}, replyOptions:{content:String, messageId:String, channelId:String, guildId:String}, commandOptions:{interactionName:String, interactionId:String}}}} OTTranscriptMessage */ +/**@typedef {{enabled:Boolean,premiumToken:String, customCredits:{enable:Boolean, replaceText:String, replaceURL:String, enableReportBug:Boolean},customHeaderUrl:{enabled:Boolean, url:String, text:String}, customTranscriptUrl:{enabled:Boolean, name:String}, customFavicon:{enabled:Boolean, image:String},additionalFlags:String[]}} OTTranscriptPremium */ + +/**@typedef {{version:"2", otversion:String, language:String, style:OTTranscriptStyle, bot:OTTranscriptBot, ticket:OTTranscriptTicket, messages:OTTranscriptMessage[], premium:OTTranscriptPremium}} OTTranscriptCompileInput */ + +/**@typedef {{style:OTTranscriptStyle,bot:OTTranscriptBot,ticket:OTTranscriptTicket,premium:OTTranscriptPremium}} OTHTMLDataOption */ + + +/**@param {discord.ButtonStyle} buttonstyle */ +const buttonStyleToColor = (buttonstyle) => { + if (buttonstyle == discord.ButtonStyle.Primary){ + return "blue" + }else if (buttonstyle == discord.ButtonStyle.Secondary){ + return "gray" + }else if (buttonstyle == discord.ButtonStyle.Danger){ + return "red" + }else if (buttonstyle == discord.ButtonStyle.Success){ + return "green" + }else{ + return "gray" + } +} + +/** + * + * @param {discord.Guild} guild + * @param {discord.Channel} channel + * @param {discord.User} user + * @param {discord.Message[]} messagesInv + * @param {OTHTMLDataOption} data + */ +exports.compile = (guild,channel,user,messagesInv,data) => { + const messages = messagesInv.reverse() + var invisibleMessages = 0 + + //MESSAGE STATS COUNTS + var messageAmount = messages.length + var fileAmount = 0 + var embedAmount = 0 + var reactionsAmount = 0 + var interactionAmount = 0 + messages.forEach((msg) => { + fileAmount = fileAmount + Array.from(msg.attachments).length + embedAmount = embedAmount + msg.embeds.length + + msg.reactions.cache.forEach(reaction => { + reactionsAmount = reactionsAmount + reaction.count + }) + if (msg.components && msg.components.length > 0){ + msg.components.forEach((component) => { + if (component.components.length > 0){ + interactionAmount = interactionAmount + component.components.length + }else{ + interactionAmount = interactionAmount+1 + } + + }) + } + }) + + /**@type {OTTranscriptMessage[]} */ + const messagesArray = [] + messages.forEach((msg) => { + if (msg.content || msg.embeds.length > 0 || msg.attachments.toJSON().length > 0 || msg.components.length > 0 || msg.reactions.cache.size > 0){ + + const embedArray = [] + const attachmentArray = [] + const componentsArray = [] + + msg.attachments.forEach((file) => { + attachmentArray.push({ + type:"FILE", + name:file.name, + fileType:file.contentType, + size:Math.round(file.size/1000)+" kb", + url:file.url + }) + }) + + msg.embeds.forEach((embed) => { + embedArray.push({ + title:embed.title || false, + description:embed.description ? mentions(embed.description,guild) : false, + authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false), + authortext:(embed.author ? embed.author.name : false), + footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false), + footertext:(embed.footer ? embed.footer.text : false), + color:embed.hexColor, + image:((embed.image && embed.image.url) ? embed.image.url : false), + thumbnail:((embed.thumbnail && embed.thumbnail.url) ? embed.thumbnail.url : false), + url:(embed.url ? embed.url : false), + fields:embed.fields + }) + }) + + const tempreactions = [] + msg.reactions.cache.forEach((reaction) => { + const count = reaction.count + const emoji = reaction.emoji + + if (emoji instanceof discord.GuildEmoji){ + //custom emoji + tempreactions.push({ + amount:count, + emoji:(emoji.url) ? emoji.url : "", + type:(emoji.animated) ? "gif" : "image" + }) + }else if (emoji instanceof discord.ReactionEmoji){ + //build-in emoji + tempreactions.push({ + amount:count, + emoji:emoji.name, + type:"svg" + }) + } + }) + componentsArray.push({ + type: "reactions", + reactions:tempreactions + }) + + msg.components.forEach((actionrow) => { + var isdropdown = false + var actioncomponents = [] + actionrow.components.forEach((comp) => { + if (comp.type == discord.ComponentType.ActionRow || comp.type == discord.ComponentType.TextInput) return + + /** + * type: "buttons"; + buttons: [{ + type: "interaction" | "url"; + label: string | false; + icon: string | false; + color: "gray" | "green" | "red" | "blue"; + id: string | false; + url: string | false; + disabled: boolean; + }]; + }, { + type: "dropdown"; + placeholder: string | false; + options: [{ + label: string | false; + icon: string | false; + description: string | false; + id: string | false; + }]; + }, + */ + if (comp.type == discord.ComponentType.Button){ + actioncomponents.push({ + type: (comp.style == discord.ButtonStyle.Link) ? "url" : "interaction", + label: (comp.label) ? comp.label : false, + icon: (comp.emoji) ? comp.emoji.name : false, + color: buttonStyleToColor(comp.style), + id: comp.customId ? comp.customId : false, + url: (comp.url) ? comp.url : false, + disabled: false + }) + }else{ + isdropdown = true + var drpdwnoptions = [] + /**@type {discord.APISelectMenuOption[]} */ + const dropdownoptions = comp.options + dropdownoptions.forEach((opt) => { + drpdwnoptions.push({ + label: opt.label, + icon: (opt.emoji) ? opt.emoji : false, + description: (opt.description) ? opt.description : false, + id: "hello world :)" + }) + }) + + componentsArray.push({ + type:"dropdown", + placeholder:false, + options:drpdwnoptions + }) + } + }) + + if (!isdropdown){ + componentsArray.push({ + type:"buttons", + buttons:actioncomponents + }) + } + }) + + const important = msg.guild ? (msg.content.includes("<@"+msg.guild.id+">") || msg.content.includes("<@everyone") || msg.content.includes("@here")): false + + const replytype = (msg.interaction) ? "command" : ((msg.reference) ? "reply" : false) + if (replytype == "command"){ + const replycolorRAW = msg.guild.members.cache.find((m) => m.id == msg.interaction.user.id) + const replycolor = (replycolorRAW) ? replycolorRAW.displayHexColor.replace("#000000","#ffffff") : "#ffffff" + var reply = { + type:replytype, + commandOptions:{ + interactionId:msg.interaction.id, + interactionName:msg.interaction.commandName + }, + user:{ + name:msg.interaction.user.username, + id:msg.interaction.user.id, + color:replycolor, + pfp:msg.interaction.user.displayAvatarURL(), + bot:msg.interaction.user.bot, + system:msg.interaction.user.system, + verifiedBot:msg.interaction.user.flags.has(discord.UserFlags.VerifiedBot) + } + } + }else if (replytype == "reply"){ + + var replycontentRAW = messages.find((msg2) => msg2.id == msg.reference.messageId) + var replycontent = (replycontentRAW && replycontentRAW.content) ? replycontentRAW.content.slice(0,(60-replycontentRAW.author.username.length)) : "deleted this message" + const replycolorRAW = (replycontentRAW) ? msg.guild.members.cache.find((m) => m.id == replycontentRAW.author.id) : false + const replycolor = (replycolorRAW) ? replycolorRAW.displayHexColor.replace("#000000","#ffffff") : "#ffffff" + + var user = (replycontentRAW && replycontentRAW.content) ? { + name:(replycontentRAW) ? replycontentRAW.author.username : "undefined", + id:(replycontentRAW) ? replycontentRAW.author.id : "undefined", + color:replycolor, + pfp:(replycontentRAW) ? replycontentRAW.author.username : "", + bot:(replycontentRAW) ? replycontentRAW.author.bot : false, + system:(replycontentRAW) ? replycontentRAW.author.system : false, + verifiedBot:(replycontentRAW) ? replycontentRAW.author.flags.has(discord.UserFlags.VerifiedBot) : false, + } : { + name:"someone", + id:"undefined", + color:"#ffffff", + pfp:"https://raw.githubusercontent.com/twitter/twemoji/master/assets/72x72/1f5d1.png", + bot:false, + system:false, + verifiedBot:false, + } + + var reply = { + type:replytype, + replyOptions:{ + content:replycontent, + messageId: msg.reference.messageId, + channelId: msg.reference.channelId, + guildId: msg.reference.guildId + }, + user:user + } + }else{var reply = {type:replytype}} + + const authorColor = msg.member ? msg.member.displayHexColor.replace("#000000","#ffffff") : "#ffffff" + messagesArray.push({ + author:{ + name:msg.author.tag, + id:msg.author.id, + color:authorColor, + pfp:msg.author.displayAvatarURL(), + bot:msg.author.bot, + system:msg.author.system, + verifiedBot:msg.author.flags.has(discord.UserFlags.VerifiedBot) + }, + content:mentions(msg.content,guild) || "", + timestamp:msg.createdTimestamp, + embeds:embedArray, + attachments:attachmentArray, + edited: (typeof msg.editedTimestamp == "number"), + type:"normal", + important:important, + reply:reply, + components:componentsArray + }) + }else {invisibleMessages++} + }) + + const dsb = data.style.background + const dsh = data.style.header + const dss = data.style.stats + + /**@type {OTTranscriptCompileInput} */ + const result = { + version,otversion, + language:bot.config.languageFile, + style:{ + background:{ + backgroundData:dsb.backgroundData || "", + backgroundModus:dsb.backgroundModus || "", + enableCustomBackground:dsb.enableCustomBackground || false, + }, + header:{ + backgroundColor:dsh.backgroundColor || "#202225", + decoColor:dsh.decoColor || "#F8BA00", + textColor:dsh.textColor || "#ffffff", + enableCustomHeader:dsh.enableCustomHeader || false + }, + stats:{ + backgroundColor:dss.backgroundColor || "#202225", + keyTextColor:dss.keyTextColor || "#737373", + valueTextColor:dss.valueTextColor || "#ffffff", + hideBackgroundColor:dss.hideBackgroundColor || "#40444a", + hideTextColor:dss.hideTextColor || "#ffffff", + enableCustomStats:dss.enableCustomStats || false + } + }, + bot:{ + name:data.bot.name || "Open Ticket", + id:data.bot.id || 0, + pfp:data.bot.pfp || "dj-dj.be/wp-content/uploads/2022/07/profielfoto-blauw-wit.png?size=128" + }, + ticket:{ + name:channel.name, + id:channel.id, + + guildname:guild.name, + guildid:guild.id, + guildinvite:"", + + creatorname:data.ticket.creatorname, + creatorid:data.ticket.creatorid, + creatorpfp:data.ticket.creatorpfp, + + closedbyname:user.tag, + closedbyid:user.id, + closedbypfp:user.displayAvatarURL(), + + claimedid:"", + claimedname:"", + claimedpfp:"", + + closedtime:data.ticket.closedtime, + openedtime:data.ticket.openedtime, + + roleColors:[], + components:{ + messages:messageAmount, + embeds:embedAmount, + files:fileAmount, + interactions:{ + buttons:0, + dropdowns:0, + total:interactionAmount + }, + reactions:reactionsAmount, + attachments:{ + gifs:0, + images:0, + stickers:0, + invites:0 + } + } + }, + messages:messagesArray, + premium:{ + enabled:false, + premiumToken:"", + + customCredits:{ + enable:false, + replaceText:"Powered By Open Ticket!", + replaceURL:"https://openticket.dj-dj.be", + enableReportBug:true + }, + customHeaderUrl:{ + enabled:false, + url:"https://openticket.dj-dj.be", + text:"Hello!" + }, + customTranscriptUrl:{ + enabled:false, + name:"test-server" + }, + customFavicon:{ + enabled:false, + image:"https://openticket.dj-dj.be" + }, + additionalFlags:[] + } + } + + + return result +} \ No newline at end of file diff --git a/core/transcriptSystem/communication/index.js b/core/transcriptSystem/communication/index.js index 64235d3..72a4df7 100644 --- a/core/transcriptSystem/communication/index.js +++ b/core/transcriptSystem/communication/index.js @@ -6,7 +6,7 @@ const tsconfig = bot.tsconfig const tsembeds = require("../embeds") const tsdb = require("../tsdb") -/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */ +/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number,waittime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */ /** * @param {Object} json @@ -17,12 +17,12 @@ exports.upload = async (json) => { const data = encodeURIComponent(JSON.stringify(json)) try { - const res = await axios.get("https://api.transcripts.dj-dj.be/upload?auth=openticketTRANSCRIPT1234&version=1.0.0&data="+data) + const res = await axios.post("https://transcripts.dj-dj.be/api/upload?auth=openticketTRANSCRIPT1234&version=2",JSON.stringify(json)) if (res.status != 200) resolve(false) - + resolve(res.data) - }catch{ - console.log("failed transcript upload!") + }catch(err){ + console.log("failed transcript upload!",err.response) resolve(false) } }) diff --git a/core/transcriptSystem/communication/mentions.js b/core/transcriptSystem/communication/mentions.js new file mode 100644 index 0000000..13dd97a --- /dev/null +++ b/core/transcriptSystem/communication/mentions.js @@ -0,0 +1,57 @@ +const discord = require('discord.js') + +const bot = require("../../../index") +const tsconfig = bot.tsconfig +const tsembeds = require("../embeds") +const tsdb = require("../tsdb") + +/** + * + * @param {String} text + * @param {discord.Guild} guild + */ +exports.replacementions = (text,guild) => { + const userregex = /<@([0-9]+)>(\s)?/g + const usertext = text.replace(userregex,(x) => { + var res = userregex.exec(x) + userregex.lastIndex = 0 + + var member = guild.members.cache.find((m) => m.id == res[1]) + var text = member ? member.user.username.replace(/\s/g," ") : res[1] + return "<@"+text+"> " + }) + + const channelregex = /<#([0-9]+)>(\s)?/g + const channeltext = usertext.replace(channelregex,(x) => { + var res = channelregex.exec(x) + channelregex.lastIndex = 0 + + var channel = guild.channels.cache.find((c) => c.id == res[1]) + var text = channel ? channel.name.replace(/\s/g," ") : res[1] + return "<#"+text+"> " + }) + + const roleregex = /<@&([0-9]+)>(\s)?/g + const roletext = channeltext.replace(roleregex,(x) => { + var res = roleregex.exec(x) + roleregex.lastIndex = 0 + + var role = guild.roles.cache.find((r) => r.id == res[1]) + var text = role ? role.name.replace(/\s/g," ") : res[1] + + var color = role ? ((role.hexColor == "#000000") ? "regular" : role.hexColor) : "regular" + + return "<@&"+text+"::"+color+"> " + }) + + const defaultroleregex = /@(everyone|here)(\s)?/g + const defaultroletext = roletext.replace(defaultroleregex,(x) => { + var res = defaultroleregex.exec(x) + defaultroleregex.lastIndex = 0 + + var text = res[1] + return "<@&"+text+"::regular> " + }) + + return defaultroletext +} \ No newline at end of file diff --git a/core/transcriptSystem/communication/template.json b/core/transcriptSystem/communication/template.json deleted file mode 100644 index b8a3a0a..0000000 --- a/core/transcriptSystem/communication/template.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "version":"1.0.0", - "otversion":"3.3.3", - "style":{ - "enableCustomBackground":false, - "backgroundModus":"color OR image", - "backgroundData":"#ffffff OR https://www.example.com/image.png", - "titleColor":"#ffffff" - }, - "bot":{ - "name":"DJdj Support Bot", - "id":12345678910, - "pfp":"https://www.example.com/image.png" - }, - "ticket":{ - "name":"support-DJj123dj", - "id":12345678910, - - "guildname":"DJdj Development", - "guildid":12345678910, - - "creatorname":"DJj123dj#1706", - "creatorid":12345678910, - "closedbyname":"DJj123dj#1706", - "closedbyid":12345678910, - - "closedtime":12345678910, - "openedtime":12345678910, - - "messages":1, - "files":1 - }, - "messages":[ - { - "author":{ - "name":"DJj123dj#1706", - "id":12345678910, - "color":"#ffffff", - "pfp":"https://www.example.com/image.png" - }, - "content":"string or FALSE", - "timestamp":12345678910, - "embeds":[ - { - "title":"string or FALSE", - "description":"string or FALSE", - "authorimg":"https://www.example.com/image.png or FALSE", - "authortext":"string or FALSE", - "footerimg":"https://www.example.com/image.png or FALSE", - "footertext":"string or FALSE", - "color":"#ffffff", - "image":"https://www.example.com/image.png or FALSE", - "thumbnail":"https://www.example.com/image.png or FALSE", - "url":"https://www.example.com/image.png or FALSE" - } - ], - "files":[ - { - "name":"image.png", - "type":"PNG", - "size":"1MB", - "url":"https://www.example.com/image.png" - } - ] - } - ] -} \ No newline at end of file diff --git a/core/transcriptSystem/info.json b/core/transcriptSystem/info.json index ea2feef..1c4b27e 100644 --- a/core/transcriptSystem/info.json +++ b/core/transcriptSystem/info.json @@ -1,3 +1,3 @@ { - "version":"1.0.0" + "version":"2" } \ No newline at end of file diff --git a/core/transcriptSystem/manager.js b/core/transcriptSystem/manager.js index 15ee3da..10cc01a 100644 --- a/core/transcriptSystem/manager.js +++ b/core/transcriptSystem/manager.js @@ -14,11 +14,15 @@ const tsdb = require("./tsdb") const checkAvailability = async () => { if (process.argv.some((v) => v == "--tsoffline")) return true const axios = require("axios").default - const res = await axios.get("https://transcripts.dj-dj.be/status.txt") - if (!res || !(res.status == 200) || !res.data) return false + try{ + const res = await axios.get("https://transcripts.dj-dj.be/api/status.json") + if (!res || !(res.status == 200) || !res.data) return false - if ((res.data == "online") || (res.data == "1") || (res.data == "true")) return true - else return false + if (res.data && res.data["v2"] == "online") return true + else return false + }catch{ + return false + } } /** @@ -36,35 +40,54 @@ module.exports = async (messages,guild,channel,user,reason) => { const chName = channel.name const chId = channel.id - /**@param {discord.Collection>} msglist*/ - const asyncmanager = async (msglist) => { - var firstmsg = msglist.last() + const asyncmanager = async () => { + const hiddendata = bot.hiddenData.readHiddenData(channel.id) + if (hiddendata.length < 1) return + const ticketId = hiddendata.find(d => d.key == "type").value + const ticketData = require("../utils/configParser").getTicketById(ticketId,true) - if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false - const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) - const ticketId = hiddendata.data.find(d => d.key == "type") - - const id = hiddendata.data.find(d => d.key == "openerid").value - const opentime = new Date(Number(hiddendata.data.find(d => d.key == "createdms").value)) + const id = hiddendata.find(d => d.key == "openerid").value + const opentime = new Date(Number(hiddendata.find(d => d.key == "createdms").value)) const ticketopener = client.users.cache.find(u => u.id == id) if (tsconfig.sendTranscripts.useHTMLtranscripts){ - const JSONDATA = require("./communication/compileJson").compile(guild,channel,user,messages,{ + const tsb = tsconfig.style.background + const tsh = tsconfig.style.header + const tss = tsconfig.style.stats + const JSONDATA = require("./communication/compileJsonV2").compile(guild,channel,user,messages,{ style:{ - titleColor:tsconfig.style.titleColor, - enableCustomBackground:tsconfig.style.background.enableCustomBackground, - backgroundModus:tsconfig.style.background.backgroundModus, - backgroundData:tsconfig.style.background.backgroundData + background:{ + enableCustomBackground:tsb.enableCustomBackground, + backgroundModus:tsb.backgroundModus, + backgroundData:tsb.backgroundData + }, + header:{ + enableCustomHeader:tsh.enableCustomHeader, + backgroundColor:tsh.backgroundColor, + decoColor:tsh.decoColor, + textColor:tsh.textColor + }, + stats:{ + enableCustomStats:tss.enableCustomStats, + backgroundColor:tss.backgroundColor, + keyTextColor:tss.keyTextColor, + valueTextColor:tss.valueTextColor, + hideBackgroundColor:tss.hideBackgroundColor, + hideTextColor:tss.hideTextColor + } + }, bot:{ name:client.user.username, id:client.user.id, - pfp:client.user.displayAvatarURL() + pfp:client.user.displayAvatarURL(), }, ticket:{ creatorid:ticketopener.id, creatorname:ticketopener.tag, + creatorpfp:ticketopener.displayAvatarURL(), + openedtime:opentime.getTime(), closedtime:new Date().getTime() } @@ -88,16 +111,17 @@ module.exports = async (messages,guild,channel,user,reason) => { if (!TSdata) return false if (TSdata.status == "success"){ - const url = "https://transcripts.dj-dj.be/t/"+TSdata.time+"_"+TSdata.id+".html" + //MAKE THIS COMPATIBLE WITH PREMIUM "customTranscriptUrl" IN FUTURE VERSIONS!! + const url = "https://transcripts.dj-dj.be/v2/"+TSdata.time+"_"+TSdata.id+".html" //calculate estimated time - const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime()) - const dumpLoopTime = 15000 - const nextDump = new Date(lastDumpTime+dumpLoopTime) - const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow + //const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime()) + //const dumpLoopTime = 15000 + //const nextDump = new Date(lastDumpTime+dumpLoopTime) + //const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow - const finaltime = new Date(nextDump.getTime()+processtime) - const duration = finaltime.getTime()-new Date().getTime() + const duration = TSdata.estimated.waittime + const finaltime = new Date(new Date().getTime()+duration) //waiting if (tsconfig.sendTranscripts.enableChannel){ @@ -148,5 +172,5 @@ module.exports = async (messages,guild,channel,user,reason) => { } } } - asyncmanager(msglist) + asyncmanager() } \ No newline at end of file diff --git a/core/utils/configParser.js b/core/utils/configParser.js index 1352f9d..db183df 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[], 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 */ +/**@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}, ping:{"@here":Boolean, "@everyone":Boolean, custom:{enable:Boolean, roleId: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 */ @@ -22,7 +22,7 @@ const l = bot.language /**@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"|"adminroles"|"autoclose"} OTTicketStringOptions */ +/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"image"|"closedCategory"|"adminroles"|"autoclose"|"ping"} 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/hiddendata.js b/core/utils/hiddendata.js index 2760edd..e5c3955 100644 --- a/core/utils/hiddendata.js +++ b/core/utils/hiddendata.js @@ -1,68 +1,49 @@ +const storage = require("../../index").storage -/**@typedef {{type:String,data:[{key:String,value:String}],status:Boolean}} hiddenData */ +/**@typedef {[{key:String,value:String}]} hiddenData */ /** * - * @param {String} messageContent + * @param {String} channelid * @returns {hiddenData} */ -exports.readHiddenData = (messageContent) => { - //ticketdata//type:123|userid:456) - if (!messageContent.includes("[ ](https://OTDATA|")) return {type:"",data:[],status:false} - const rawhidden = messageContent.split("[ ](https://OTDATA|")[1] - const rawhidden2 = rawhidden.split("//") +exports.readHiddenData = (channelid) => { + const content = storage.get("HIDDENDATA",channelid) + if (!content) return {type:"",data:[],status:false} - const datatype = rawhidden2[0] - var rawhiddendata = rawhidden2[1] - var rawhiddendataArray = rawhiddendata.split("") - rawhiddendataArray.pop() - - rawhiddendata = rawhiddendataArray.join("") - - const splittedData = rawhiddendata.split("|") - - const resultData = [] - splittedData.forEach((data) => { - // type:123 - const dataresult = data.split(":") - - resultData.push({key:dataresult[0],value:dataresult[1]}) - }) - - return {type:datatype,data:resultData,status:true} + try { + return JSON.parse(content) + } catch { + return [] + } } /** * - * @param {String} type + * @param {String} channelid * @param {[{key:String,value:String}]} data - * @returns {String} + * @returns {Boolean} */ -exports.writeHiddenData = (type,data) => { - const dataValues = [] - data.forEach((d) => { - dataValues.push(d.key+":"+d.value) - }) - - const datastring = dataValues.join("|") - - const result = "[ ](https://OTDATA|"+type+"//"+datastring+")" - - return result +exports.writeHiddenData = (channelid,data) => { + try { + storage.set("HIDDENDATA",channelid,JSON.stringify(data)) + return true + } catch { + return false + } } /** * - * @param {String} description - * @returns {{description:String,hiddenData:hiddenData}} + * @param {String} channelid + * @returns {Boolean} */ -exports.removeHiddenData = (description) => { - if (!description.includes("[ ](https://OTDATA|")) return {description:description,hiddenData:[]} - - const hiddenData = this.readHiddenData(description) - const splitted = description.split("[ ](https://OTDATA") - const original = splitted[0] - - return {description:original,hiddenData:hiddenData} +exports.deleteHiddenData = (channelid) => { + try { + storage.delete("HIDDENDATA",channelid) + return true + } catch { + return false + } } \ No newline at end of file diff --git a/core/utils/liveStatus.js b/core/utils/liveStatus.js index 8a16cc6..472ab98 100644 --- a/core/utils/liveStatus.js +++ b/core/utils/liveStatus.js @@ -188,7 +188,7 @@ exports.liveStatusUploadManager = async (err) => { system:config.system }, language:config.languageFile, - version:require("../../package.json").version, + version:"3.4.0", slashcmds:slashMode, transcripts:transcriptMode, plugins:fs.readdirSync("./plugins"), diff --git a/index.js b/index.js index ac2ffb1..fffbb54 100644 --- a/index.js +++ b/index.js @@ -28,7 +28,7 @@ INFORMATION: ============ - Open Ticket v3.3.3 - © DJdj Development + Open Ticket v3.4.0 - © DJdj Development discord: https://discord.dj-dj.be website: https://www.dj-dj.be diff --git a/language/arabic.json b/language/arabic.json index 57f9b40..8b90660 100644 --- a/language/arabic.json +++ b/language/arabic.json @@ -1,4 +1,7 @@ { + "_CREDITS":"ChilledBroke#9986 & M4#5882", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors": { "missingArgsTitle": "قيمة غير صالحة!", "missingArgsDescription": "قيمة مفقودة", diff --git a/language/custom.json b/language/custom.json index ef296d2..9fcaf16 100644 --- a/language/custom.json +++ b/language/custom.json @@ -1,4 +1,7 @@ { + "_CREDITS":"DJdj Development", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Invalid Arguments!", "missingArgsDescription":"Missing Argument", diff --git a/language/czech.json b/language/czech.json index f3d23d9..d9978ff 100644 --- a/language/czech.json +++ b/language/czech.json @@ -1,4 +1,7 @@ { + "_CREDITS":"t0miiis#3022", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Neplatny Argument!", "missingArgsDescription":"Chybí Argument", diff --git a/language/danish.json b/language/danish.json index 4988ef8..820bfb9 100644 --- a/language/danish.json +++ b/language/danish.json @@ -1,5 +1,8 @@ { - "errors": { + "_CREDITS":"the_gamer#5095", + "_INFO":"This file is a translation for open ticket 3.4.0", + + "errors": { "missingArgsTitle": "Ugyldigt Argument!", "missingArgsDescription": "Manglende Argument", "noPermsTitle": "Ikke tilladelse!", diff --git a/language/dutch.json b/language/dutch.json index fb9dca4..decf929 100644 --- a/language/dutch.json +++ b/language/dutch.json @@ -1,4 +1,7 @@ { + "_CREDITS":"DJj123dj#1706", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Onjuiste parameters!", "missingArgsDescription":"Er missen parameters", diff --git a/language/english.json b/language/english.json index 9dcfa45..de9eebc 100644 --- a/language/english.json +++ b/language/english.json @@ -1,4 +1,7 @@ { + "_CREDITS":"DJdj Development", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Invalid Arguments!", "missingArgsDescription":"Missing Argument", diff --git a/language/french.json b/language/french.json index 6b7c3e8..177a69f 100644 --- a/language/french.json +++ b/language/french.json @@ -1,4 +1,7 @@ { + "_CREDITS":"Sanke#6086", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Arguments invalides!", "missingArgsDescription":"Argument manquant", diff --git a/language/german.json b/language/german.json index d8e1d12..3f61a12 100644 --- a/language/german.json +++ b/language/german.json @@ -1,4 +1,7 @@ { + "_CREDITS":"david.#8276 ", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Ungültiges Argument!", "missingArgsDescription":"Fehlendes Argument!", @@ -36,7 +39,7 @@ "goToTicket":"Geh zu deinem Ticket", "ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!", - "maxTicketWarning":"**Warnung:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_" + "maxTicketWarning":"**Warnung:** _Es können maximal {0} Tickets zur gleichen Zeit geöffnet sein!_" }, "helpMenu":{ "title":"Hilfe Menu:", diff --git a/language/greek.json b/language/greek.json new file mode 100644 index 0000000..f21ef18 --- /dev/null +++ b/language/greek.json @@ -0,0 +1,101 @@ +{ + "_CREDITS":"ꙅoᴎɒᎸɘƚꙅ#3744", + "_INFO":"This file is a translation for open ticket 3.4.0", + + "errors":{ + "missingArgsTitle":"Invalid Arguments!", + "missingArgsDescription":"Missing Argument", + "noPermsTitle":"Δεν έχεις άδεια για να τρέξεις αυτή την εντολή!", + "noPermsDescription":"Χρειάζεσε άδεια διαχειριστή για να τρέξεις αυτή την εντολή.", + "noPermsDelete":"Μόνο οι διαχειριστές μπορούν να διαγράψουν τα εισιτήρια!", + "chooseFromListTitle":"Μη έγκυρο id.", + "chooseFromListDescription":"Διάλεξε ενα απο τα παρακάτω id:", + "boterror":"Υπάρχει κάποιο πρόβλημα!", + "notInTicketTitle":"Δεν είσε στο κανάλι του εισιτηρίου!", + "notInTicketDescription":"Δεν μπορείς να τρέξεις αυτή την εντολή εκτός του εισιτηρίου", + "ticketDoesntExist":"Αυτο το εισιτήριο δεν υπάρχει!", + "roleDoesntExist":"Αυτός ο ρόλος δεν υπάρχει!", + "anotherOption":"Διάλεξε άλλο λόγο για εισιτήριο!", + "maxAmountTitle":"Έχεις ανοίξει πολλά εισιτήρια για την ώρα.", + "maxAmountDescription":"Έχεις υπερβεί το όριο των εισιτηρίον!\nΔεν μπορείς να ανοίξεις καινούργιο.!", + "somethingWentWrong":"**Κάτι πήγε λάθος!**\nΔοκίμασε ξανά αργότερα!" + }, + "commands":{ + "userAddedTitle":"Ο {0} προσθέθηκε στο εισιτήριο", + "userRemovedTitle":"Ο {0} αφαιρέθηκε απο το εισιτήριο!", + "renameTitle":"Το όνομα άλλαξε σε {0}!", + "closeTitle":"Το εισιτήριο έκλεισε!", + "deleteTitle":"Διαγράφω το εισιτήριο...", + "reopenTitle":"Το εισιτήριο ξανά άνοιξε!", + + "claimTitle":"Το εισιτήριο διεκδικήθεικε απο τον {0}", + "unclaimTitle":"Το εισιτήριο δεν είναι πλέον διεκδικημένο!", + "changeTitle":"Ο τύπος του εισιτηρίου άλλαξε σε {0}!", + + "statsTitle":"Εδώ είναι τα στατιστικά για το {0}!", + "autocloseTitle":"Αυτό το εισιτήριο θα κλείσε σε {0}!", + "autocloseRejectTitle":"Αυτό το εισιτήριο δεν θα κλέισε αυτόματα!", + "autocloseWarn":"Αυτό ισχύει μονο για μή ενεργά εισιτήρια!", + + "goToTicket":"Μεταφορά στο εισιτήριο.", + "ticketWarning":"Το εισιτήριο είναι στο παρακάτω μήνυμα!", + "maxTicketWarning":"**Προειδοποίηση:** _Μπορείς να φτιάξεις μόνο {0} εισιτήριο/εισιτήρια για την ώρα!_" + }, + "helpMenu":{ + "title":"Διαθέσιμες εντολές:", + "header1":"**Πηγαινε στο {0} για να φτιάξεις ενα νέο εισιτήριο!**\n\n", + "header2":"**Τρέχα την εντολή `/new` ή `/ticket` για να φτιάξεις ένα εισιτήριο!**\n\n", + + "msgCmd":"Εμφάνισε ένα embed με κουμπιά. (admins only)", + "renameCmd":"Μετονόμασε το εισιτήριο. (όχι κενά)", + "closeCmd":"Κλέισε το εισιτήριο.", + "deleteCmd":"Διέγραψε το εισιτήριο.", + "addCmd":"Πρόσθεσε κάποιον στο εισιτήριο.", + "removeCmd":"Αφαίρεσε κάποιον απο το εισιτήριο.", + "reopenCmd":"Ξανά άνοιξε το εισιτήριο.", + "changeCmd":"Άλλαξε τον τύπο του εισιτηρίου.", + "claimCmd":"Διεκδίκησε το εισιτήριο.", + "unclaimCmd":"Unclaim a ticket.", + "statsCmd":"Δές τα στατιστικά του εισιτηρίου.", + "autocloseCmd":"Βάλε χρονόμετρο για να κλείσει το εισιτήριο" + }, + "buttons":{ + "close":"κλείσε το εισιτήριο", + "delete":"Διέγραψε το εισιτήριο", + "reopen":"Ξανά άνοιξε το εισιτήριο", + "closeWithReason":"Κλείσε με αιτιολόγιση" + }, + "messages":{ + "closedDescription":"Μονο οι διαχειριστές μπορουν να διαγράψουν τα εισιτήρια!\n\n*Πάτα το παρακάτω κουμπί για να ξανά ανοίξεις το εισιτήριο!*", + "createdTitle":"Το εισιτήριο δημιουργήθηκε!", + "createdDescription":"Το εισιτήριο σου δημιουργήθηκε μπορείς να το βρείς με την αναφορά που έγινε στο κανάλι του εισιτηρίου!", + + "newTicketDmTitle":"Νέο εισιτήριο!", + "closedTicketDmTitle":"Το εισιτήριο έκλεισε!", + "deletedTicketDmTitle":"Tο εισιτήριο διεγράφη!", + "closedTicketDmDescription":"Το εισιτήριο σου είναι κλειστό!", + "deletedTicketDmDescription":"Το εισιτήριο σου διεγράφη!", + "reopenTicketDmTitle":"Tο εισιτήριο ξανά άνοιξε!", + "reopenTicketDmDescription":"Το εισιτήριο σου ξανά άνοιξε!", + + "chooseCategory":"Διάλεξε μία κατηγορία:", + "gettingdeleted":"Το εισιτήριο διαγράφεται...", + + "none":"Κανένας", + "reason":"Λόγος", + "createdat":"Δημιουργήθηκε", + "openedby":"Ανοίχτηκε από", + "deletedby":"Διεγράφη απο", + "closedby":"Έκλεισε από", + + "modalreason":"Ποιός είναι ο λόγος για να κλείσει το εισιτήριο?", + "chooseATicket": "Δίαλεξε ενα εισιτήριο" + }, + "transcripts":{ + "title":"Αντίγραφο", + "processed":"Το αντίγραφο ετοιμάζεται!", + "wait":"Παρακαλώ περιμένετε!", + "estimated":"Ώρα αναμονής", + "available":"Το αντίγραφο είναι ανοιχτώ εδώ!" + } +} \ No newline at end of file diff --git a/language/italian.json b/language/italian.json index 8a9624e..4e4e9cf 100644 --- a/language/italian.json +++ b/language/italian.json @@ -1,4 +1,7 @@ { + "_CREDITS":"Maurizio#0268", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Argomenti non validi!", "missingArgsDescription":"Argomenti mancanti", diff --git a/language/norwegian.json b/language/norwegian.json new file mode 100644 index 0000000..410e2d5 --- /dev/null +++ b/language/norwegian.json @@ -0,0 +1,101 @@ +{ + "_CREDITS":"NoOneNook#0266", + "_INFO":"This file is a translation for open ticket 3.4.0", + + "errors":{ + "missingArgsTitle":"Ugyldige argumenter!", + "missingArgsDescription":"Manglende argument", + "noPermsTitle":"Ingen rettigheter", + "noPermsDescription":"Du trenger administrator eller moderator rettigheter", + "noPermsDelete":"Bare staff kan slette en ticket!", + "chooseFromListTitle":"Ugyldig ID", + "chooseFromListDescription":"Velg en av ID-ene nedenfor:", + "boterror":"Bot Error!", + "notInTicketTitle":"Du er ikke i en ticket!", + "notInTicketDescription":"Du kan ikke bruke denne command utenfor en ticket.", + "ticketDoesntExist":"Ticket finnes ikke lenger!", + "roleDoesntExist":"Rollen eksisterer ikke lenger!", + "anotherOption":"Dette alternativet er ikke en ticket!", + "maxAmountTitle":"Maks antall er nådd!", + "maxAmountDescription":"Du har nådd maksimalt antall tillatte ticket's\nSå du kan ikke lage en ny før de andre er lukket!", + "somethingWentWrong":"**Noe gikk galt!**\nVennligst prøv igjen senere!" + }, + "commands":{ + "userAddedTitle":"{0} har blitt lagt til i ticket!", + "userRemovedTitle":"Fjernet {0} fra ticket!", + "renameTitle":"Endret navn til {0}!", + "closeTitle":"Ticket er blitt lukket!", + "deleteTitle":"Sletter ticket...", + "reopenTitle":"Ticket er gjenåpnet", + + "claimTitle":"{0} har tatt over denne saken!", + "unclaimTitle":"Denne ticket er blitt ledig igjen!", + "changeTitle":"Endret ticket-type til {0}!", + + "statsTitle":"Her er statistikken for {0}!", + "autocloseTitle":"Denne ticket stenges automatisk etter kl {0}!", + "autocloseRejectTitle":"Denne ticket vil ikke lenger stenges automatisk!", + "autocloseWarn":"Dette påvirker kun inaktive tickets!", + + "goToTicket":"DIN TICKET", + "ticketWarning":"Embed er i meldingen nedenfor!", + "maxTicketWarning":"**Advarsel:** _Du kan bare opprette {0}ticket(s) om gangen!_" + }, + "helpMenu":{ + "title":"Tilgjengelige Commands:", + "header1":"**Gå til {0} for å opprette en ticket!**\n\n", + "header2":"**Skriv kommandoen `/new` eller `/ticket` for å lage en ticket!**\n\n", + + "msgCmd":"Lag en embed med knapper. (admins only)", + "renameCmd":"Gi nytt navn til en ticket. (ingen mellomrom)", + "closeCmd":"Lukk en ticket.", + "deleteCmd":"Slett en ticket.", + "addCmd":"Legg til en bruker i ticket.", + "removeCmd":"Fjern en bruker fra ticket.", + "reopenCmd":"Åpne en ticket på nytt etter at den ble avsluttet.", + "changeCmd":"Endre ticket kategori", + "claimCmd":"Ta over ticket.", + "unclaimCmd":"Frigjør den fra ticket.", + "statsCmd":"Se ticket stats.", + "autocloseCmd":"Still inn når ticket lukkes automatisk etter den ble åpnet" + }, + "buttons":{ + "close":"Lukk Ticket", + "delete":"Slett Ticket", + "reopen":"Gjenåpne Ticket", + "closeWithReason":"Legg til årsak" + }, + "messages":{ + "closedDescription":"Bare staff medlemmer kan snakke i denne ticket nå!\n\n*Klikk på knappen nedenfor for å slette eller åpne ticket på nytt!*", + "createdTitle":"Ticket er laget!", + "createdDescription":"__Du finner den ved å trykke på knappen under__", + + "newTicketDmTitle":"New Ticket!", + "closedTicketDmTitle":"Ticket Åpnet!", + "deletedTicketDmTitle":"Ticket Slettet!", + "closedTicketDmDescription":"Din ticket er lukket!", + "deletedTicketDmDescription":"Din ticket er slettet!", + "reopenTicketDmTitle":"Ticket gjenåpnet!", + "reopenTicketDmDescription":"Din icket er gjenåpnet!", + + "chooseCategory":"Velg en kategori:", + "gettingdeleted":"Ticket slettes....", + + "none":"Ingen", + "reason":"Grunnlag", + "createdat":"Laget", + "openedby":"Laget av", + "deletedby":"Slettet av", + "closedby":"Lukket av", + + "modalreason":"Grunnlag for lukking!", + "chooseATicket": "Velg en ticket" + }, + "transcripts":{ + "title":"Ticket logg", + "processed":"Logg fil lages, snart klar!", + "wait":"Vennligst vent!", + "estimated":"Beregnet tid", + "available":"Loggfil er tilgjengelig over denne meldingen!" + } +} \ No newline at end of file diff --git a/language/polish.json b/language/polish.json index 97f9728..8d76c99 100644 --- a/language/polish.json +++ b/language/polish.json @@ -1,4 +1,7 @@ { + "_CREDITS":"MKevas#8311", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Nieprawidłowe argumenty!", "missingArgsDescription":"Brakujący argument", diff --git a/language/portuguese.json b/language/portuguese.json index b06c2c4..6168019 100644 --- a/language/portuguese.json +++ b/language/portuguese.json @@ -1,4 +1,7 @@ { + "_CREDITS":"QuirAddon#9778", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Argumentos inválidos!", "missingArgsDescription":"Argumento ausente", diff --git a/language/romanian.json b/language/romanian.json index c38ecd1..20734b6 100644 --- a/language/romanian.json +++ b/language/romanian.json @@ -1,4 +1,7 @@ { + "_CREDITS":"Sanke#6086", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Argumente Invalide", "missingArgsDescription":"Argument Lipsa", diff --git a/language/russian.json b/language/russian.json index d64d275..e123f4b 100644 --- a/language/russian.json +++ b/language/russian.json @@ -1,4 +1,7 @@ { + "_CREDITS":"Apexo#0723", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Неверные аргументы!", "missingArgsDescription":"Отсутствует аргумент", @@ -29,12 +32,12 @@ "unclaimTitle":"Этот тикет никем не взят!", "changeTitle":"Изменён тип тикета на {0}!", - "statsTitle":"Here are the stats for {0}!", - "autocloseTitle":"This ticket will be closed automatically after {0}!", - "autocloseRejectTitle":"This ticket will no longer be closed automatically!", - "autocloseWarn":"This only affects inactive tickets!", + "statsTitle":"Здесь статистика для {0}!", + "autocloseTitle":"Этот тикет будет закрыт автоматически после {0}!", + "autocloseRejectTitle":"Этот тикет больше не будет закрыт автоматически!", + "autocloseWarn":"Это касается только неактивных тикетов!", - "goToTicket":"go to ticket", + "goToTicket":"перейти в тикет", "ticketWarning":"embed ниже сообщения!", "maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_" }, @@ -50,11 +53,11 @@ "addCmd":"Добавить пользователя в тикет.", "removeCmd":"Удалить пользователя из тикета.", "reopenCmd":"Открыть заново тикет после того, как он был закрыт.", - "changeCmd":"Change ticket type.", - "claimCmd":"Claim a ticket.", - "unclaimCmd":"Unclaim a ticket.", - "statsCmd":"View ticket stats.", - "autocloseCmd":"Set timer to automatically close ticket" + "changeCmd":"Поменять тип тикета.", + "claimCmd":"Взять тикет.", + "unclaimCmd":"Снять тикет.", + "statsCmd":"Посмотреть статистику тикета.", + "autocloseCmd":"Установить таймер, чтобы автоматически закрыть тикет" }, "buttons":{ "close":"Закрыть тикет", @@ -80,8 +83,8 @@ "none":"отсутствует", "reason":"причина", - "createdat":"created at", - "openedby":"opened by", + "createdat":"создан", + "openedby":"открыт", "deletedby":"удалён", "closedby":"закрыт", @@ -90,9 +93,9 @@ }, "transcripts":{ "title":"Транскрипт", - "processed":"This transcript is being processed", + "processed":"Этот транскрипт находится в процессе обработки", "wait":"Пожайлуста подождите!", "estimated":"Оценочное время", "available":"Транскрипт здесь доступен" } -} \ No newline at end of file +} diff --git a/language/slashcmds/slash.json b/language/slashcmds/slash.json index 473e6d4..88186c4 100644 --- a/language/slashcmds/slash.json +++ b/language/slashcmds/slash.json @@ -10,6 +10,7 @@ "es-ES":"spanish", "it":"italian", "ru":"russian", + "tr": "Türkçe", "MISSING":"arabic,portuguese", "NOTAVAILABLE":"arabic,portuguese,czech" @@ -25,7 +26,8 @@ "fr":"Une liste des commandes.", "es-ES":"Una lista de los comandos disponibles.", "it":"Una lista di tutti i comandi disponibili.", - "ru":"Список доступных команд" + "ru":"Список доступных команд", + "tr": "Kullanılabilir komutların listesi." }, "message":{ "en-GB":"Spawn an embed with buttons.", @@ -37,7 +39,8 @@ "fr":"Créer un embed avec des boutons.", "es-ES":"Genera un embed con botones.", "it":"Genera un embed con un pulsante.", - "ru":"Создать embed с кнопками" + "ru":"Создать embed с кнопками", + "tr": "Butonlar ile bir yerleştirme oluşturun." }, "close":{ "en-GB":"Close a ticket.", @@ -49,7 +52,8 @@ "fr":"Fermer un ticket.", "es-ES":"Cierra un ticket.", "it":"Chiudi un ticket.", - "ru":"Закрыть тикет" + "ru":"Закрыть тикет", + "tr": "Bileti kapat." }, "delete":{ "en-GB":"Delete a ticket.", @@ -61,7 +65,8 @@ "fr":"Supprimer un ticket.", "es-ES":"Elimina un ticket.", "it":"Elimina un ticket.", - "ru":"Удалить тикет" + "ru":"Удалить тикет", + "tr": "Bileti sil." }, "reopen":{ "en-GB":"Re-Open a ticket.", @@ -73,7 +78,8 @@ "fr":"Re-ouvrir un ticket.", "es-ES":"Re-abre un ticket.", "it":"Ri-Apri un ticket.", - "ru":"Открыть заново тикет" + "ru":"Открыть заново тикет", + "tr": "Bileti yeniden aç." }, "add":{ "en-GB":"Add another user to a ticket.", @@ -85,7 +91,8 @@ "fr":"Ajouter un utilisateur au ticket.", "es-ES":"Agrega otro usuario al ticket.", "it":"Aggiungi un membro al ticket", - "ru":"Добавить другого пользователя в тикет" + "ru":"Добавить другого пользователя в тикет", + "tr": "Bilete başka bir kullanıcı ekle." }, "remove":{ "en-GB":"Remove a user from a ticket.", @@ -97,7 +104,8 @@ "fr":"Enlever quelqu’un du ticket.", "es-ES":"Elimina otro usuario del ticket.", "it":"Rimuovi un membro dal ticket", - "ru":"Удалить пользователя из тикета" + "ru":"Удалить пользователя из тикета", + "tr": "Kullanıcıyı bir biletten kaldır." }, "newticket":{ "en-GB":"Create a ticket", @@ -109,7 +117,8 @@ "fr":"Créer un ticket", "es-ES":"Crear un ticket.", "it":"Crea un ticket", - "ru":"Создать тикет" + "ru":"Создать тикет", + "tr": "Bilet oluştur" }, "rename":{ "en-GB":"Rename a ticket channel.", @@ -121,7 +130,8 @@ "fr":"Renommer un ticket.", "es-ES":"Renombrar un canal de ticket.", "it":"Rinomina il canale di un ticket.", - "ru":"Переименовать канал тикета" + "ru":"Переименовать канал тикета", + "tr": "Bilet kanalını yeniden adlandır." }, "claim":{ "en-GB":"Claim a ticket.", @@ -133,7 +143,8 @@ "fr":" ", "es-ES":" ", "it":" ", - "ru":"Взять тикет" + "ru":"Взять тикет", + "tr":"Bilet talep et." }, "unclaim":{ "en-GB":"Un-claim a ticket.", @@ -145,7 +156,8 @@ "fr":" ", "es-ES":" ", "it":" ", - "ru":"Снять тикет" + "ru":"Снять тикет", + "tr":"Bileti iptal et." }, "category":{ "en-GB":"Change ticket type.", @@ -157,7 +169,8 @@ "fr":" ", "es-ES":" ", "it":" ", - "ru":"Изменить тип тикета" + "ru":"Изменить тип тикета", + "tr":"Bilet türünü değiştir." } } } \ No newline at end of file diff --git a/language/slovenian.json b/language/slovenian.json index 13d43cd..9fae12a 100644 --- a/language/slovenian.json +++ b/language/slovenian.json @@ -1,4 +1,7 @@ { + "_CREDITS":"n1kkec#5341", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Napačen argument!", "missingArgsDescription":"Argument manka", diff --git a/language/spanish.json b/language/spanish.json index 44b9901..6bc1357 100644 --- a/language/spanish.json +++ b/language/spanish.json @@ -1,4 +1,7 @@ { + "_CREDITS":"Redactado#1673 & josuens14#5267", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"¡Argumentos inválidos!", "missingArgsDescription":"Argumento faltante.", diff --git a/language/thai.json b/language/thai.json new file mode 100644 index 0000000..0c11f54 --- /dev/null +++ b/language/thai.json @@ -0,0 +1,101 @@ +{ + "_CREDITS":"Mods HD#0661", + "_INFO":"This file is a translation for open ticket 3.4.0", + + "errors":{ + "missingArgsTitle":"อาร์กิวเมนต์ไม่ถูกต้อง!", + "missingArgsDescription":"อาร์กิวเมนต์ไม่ครบ", + "noPermsTitle":"ไม่มีสิทธิ์!", + "noPermsDescription":"คุณต้องมีสิทธิ์ ADMINISTRATOR หรืออยู่ในรายชื่อบทบาทที่อนุญาต!", + "noPermsDelete":"เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถลบตั๋วได้!", + "chooseFromListTitle":"ID ไม่ถูกต้อง", + "chooseFromListDescription":"เลือกหนึ่งใน ID ด้านล่าง:", + "boterror":"ข้อผิดพลาดของบอท!", + "notInTicketTitle":"คุณไม่ได้อยู่ในตั๋ว!", + "notInTicketDescription":"คำสั่งนี้ไม่สามารถทำงานนอกตั๋วได้!", + "ticketDoesntExist":"ตั๋วนี้ไม่มีอยู่แล้ว!", + "roleDoesntExist":"บทบาทนี้ไม่มีอยู่แล้ว!", + "anotherOption":"ตัวเลือกนี้ไม่ใช่ตั๋วแต่เป็นประเภทอื่น!", + "maxAmountTitle":"จำนวนสูงสุดแล้ว!", + "maxAmountDescription":"คุณได้สร้างตั๋วครบจำนวนที่เราให้สร้างไว้แล้ว\nดังนั้นคุณไม่สามารถสร้างตั๋วใหม่ได้!", + "somethingWentWrong":"เกิดข้อผิดพลาดบางอย่าง!\nโปรดลองอีกครั้งในครั้งถัดไป!" + }, + "commands":{ + "userAddedTitle":"เพิ่ม {0} เข้าสู่ตั๋วนี้แล้ว!", + "userRemovedTitle":"นำ {0} ออกจากตั๋วนี้แล้ว!", + "renameTitle":"เปลี่ยนชื่อเป็น {0}!", + "closeTitle":"ปิดตั๋วนี้!", + "deleteTitle":"กำลังลบตั๋วนี้...", + "reopenTitle":"เปิดตั๋วนี้ใหม่!", + + "claimTitle":"ตั๋วนี้ถูกเรียกเก็บโดย {0}", + "unclaimTitle":"ไม่มีการเรียกเก็บตั๋วนี้อีกต่อไป!", + "changeTitle":"เปลี่ยนประเภทตั๋วเป็น {0}!", + + "statsTitle":"นี่คือสถิติสำหรับ {0}!", + "autocloseTitle":"ตั๋วนี้จะถูกปิดอัตโนมัติหลังจาก {0}!", + "autocloseRejectTitle":"ตั๋วนี้จะไม่ถูกปิดอัตโนมัติอีกต่อไป!", + "autocloseWarn":"สิ่งนี้มีผลต่อตั๋วที่ไม่มีการเคลื่อนไหว!", + + "goToTicket":"ไปยังตั๋ว", + "ticketWarning":"Embed อยู่ในข้อความข้างล่าง", + "maxTicketWarning":"**คำเตือน:** _คุณสามารถสร้างตั๋วได้สูงสุด {0} ตั๋วต่อครั้ง!_" + }, + "helpMenu":{ + "title":"คำสั่งที่มีอยู่:", + "header1":"**ไปที่ {0} เพื่อสร้างตั๋ว!**\n\n", + "header2":"**ใช้คำสั่ง `/new` หรือ `/ticket` เพื่อสร้างตั๋ว!**\n\n", + + "msgCmd":"แสดง Embed พร้อมปุ่ม (สำหรับแอดมินเท่านั้น)", + "renameCmd":"เปลี่ยนชื่อตั๋ว (ห้ามมีช่องว่าง)", + "closeCmd":"ปิดตั๋ว", + "deleteCmd":"ลบตั๋ว", + "addCmd":"เพิ่มผู้ใช้เข้าสู่ตั๋ว", + "removeCmd":"นำผู้ใช้ออกจากตั๋ว", + "reopenCmd":"เปิดตั๋วใหม่หลังจากถูกปิด", + "changeCmd":"เปลี่ยนประเภทตั๋ว", + "claimCmd":"เรียกเก็บตั๋ว", + "unclaimCmd":"ยกเลิกการเรียกเก็บตั๋ว", + "statsCmd":"ดูสถิติของตั๋ว", + "autocloseCmd":"ตั้งเวลาปิดตั๋วโดยอัตโนมัติ" + }, + "buttons":{ + "close":"ปิดตั๋ว", + "delete":"ลบตั๋ว", + "reopen":"เปิดตั๋วใหม่", + "closeWithReason":"ปิดตั๋วพร้อมเหตุผล" + }, + "messages":{ + "closedDescription":"ตอนนี้เฉพาะผู้ดูแลเท่านั้นที่สามารถพูดได้ในตั๋วนี้!\n\n*คลิกที่ปุ่มด้านล่างเพื่อลบหรือเปิดตั๋วใหม่!*", + "createdTitle":"สร้างตั๋วแล้ว!", + "createdDescription":"ตั๋วของคุณถูกสร้างเรียบร้อยแล้ว คุณจะได้รับการแจ้งเตือนด้วยการพิมพ์ข้อความด้วย @ ตามตั๋วของคุณ!", + + "newTicketDmTitle":"ตั๋วใหม่!", + "closedTicketDmTitle":"ตั๋วถูกปิด!", + "deletedTicketDmTitle":"ตั๋วถูกลบ!", + "closedTicketDmDescription":"ตั๋วของคุณถูกปิด!", + "deletedTicketDmDescription":"ตั๋วของคุณถูกลบ!", + "reopenTicketDmTitle":"ตั๋วถูกเปิดใหม่!", + "reopenTicketDmDescription":"ตั๋วของคุณถูกเปิดใหม่!", + + "chooseCategory":"เลือกหมวดหมู่:", + "gettingdeleted":"กำลังลบตั๋ว...", + + "none":"ไม่มี", + "reason":"เหตุผล", + "createdat":"สร้างเมื่อ", + "openedby":"เปิดโดย", + "deletedby":"ลบโดย", + "closedby":"ปิดโดย", + + "modalreason":"เหตุผลที่ต้องการปิดตั๋ว?", + "chooseATicket": "เลือกตั๋ว" + }, + "transcripts":{ + "title":"บันทึกข้อความ", + "processed":"กำลังประมวลผลบันทึกข้อความ", + "wait":"โปรดรอสักครู่!", + "estimated":"เวลาโดยประมาณ", + "available":"บันทึกข้อความพร้อมใช้งานที่นี่" + } +} \ No newline at end of file diff --git a/language/turkish.json b/language/turkish.json index e09a912..459b42f 100644 --- a/language/turkish.json +++ b/language/turkish.json @@ -1,4 +1,7 @@ { + "_CREDITS":"Hydrâelčhâvø#1575", + "_INFO":"This file is a translation for open ticket 3.4.0", + "errors":{ "missingArgsTitle":"Geçersiz argümanlar!", "missingArgsDescription":"Eksik argüman!", diff --git a/package.json b/package.json index 9b42487..43ff6f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-ticket", - "version": "3.3.3", + "version": "3.4.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": { @@ -15,8 +15,7 @@ "dependencies": { "axios": "^0.27.2", "chalk": "^5.0.1", - "discord.js": "^14.8.0", - "node": "^16.10.0" + "discord.js": "^14.11.0" }, "repository": { "type": "git", diff --git a/transcriptconfig.json b/transcriptconfig.json index a5c003c..d5db7ff 100644 --- a/transcriptconfig.json +++ b/transcriptconfig.json @@ -7,12 +7,26 @@ "useHTMLtranscripts":true }, "style":{ - "titleColor":"#F8BA00", "background":{ "enableCustomBackground":false, - "backgroundModus":"color OR image", - "backgroundData":"#abc123 OR https://www.example.com/image.png" + "backgroundModus":"image OR color", + "backgroundData":"image url OR hex color (#ffffff)" + }, + "header":{ + "enableCustomHeader":false, + "backgroundColor":"#202225", + "decoColor":"#F8BA00", + "textColor":"#ffffff" + + }, + "stats":{ + "enableCustomStats":false, + "backgroundColor":"#202225", + "keyTextColor":"#737373", + "valueTextColor":"#ffffff", + "hideBackgroundColor":"#40444a", + "hideTextColor":"#ffffff" } } } \ No newline at end of file