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,
-[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.3) []() [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [](https://docs.openticket.dj-dj.be)
+[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v3.4.0) []() [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [](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