Compare commits

..
12 Commits
Author SHA1 Message Date
Jasper d7ae040d60 Removed readme warning
Update README.md
2023-05-19 15:03:22 +02:00
Jasper 7b6202985a Update README.md 2023-05-19 15:02:43 +02:00
Jasper a2f2c601a5 Open Ticket 3.4.0!
Open Ticket 3.4.0!
2023-05-19 15:02:09 +02:00
Jasper b27016df2e Merge branch 'main' into dev 2023-05-19 15:00:47 +02:00
DJj123dj 6341f2f71b v3.4.0 last push 2023-05-19 14:55:29 +02:00
DJj123dj 56a5b9c7d0 Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-05-17 21:43:59 +02:00
DJj123dj f608cb71ce v3.4.0 push 2 (html transcripts v2) 2023-05-17 21:43:57 +02:00
Jasper 7c7c325307 temp fix for bugs 2023-05-01 13:11:34 +02:00
Jasper 832021d72a Update russian.json
Update russian.json
2023-04-30 12:23:11 +02:00
Apexo 030554a7f5 Update russian.json 2023-04-30 13:17:08 +03:00
Jasper ada5ea0c5d temp fix for "forEach" bug
This is a temporary fix for the "Cannot read properties of undefined (reading 'forEach')" bug. This will be fixed in a better way in v3.4.0
2023-04-30 12:11:31 +02:00
DJj123dj fb6b891835 v3.4.0 push 1: fixed all currently known bugs 2023-04-29 09:15:56 +02:00
49 changed files with 1350 additions and 665 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ Support for Open Ticket is only available for the versions specified below!
| Version | Supported | | Version | Supported |
| ------- | ------------------ | | ------- | ------------------ |
| 3.3.3 | :white_check_mark: | | 3.4.0 | :white_check_mark: |
| 3.3.0 | 🟧 | | 3.3.0 | 🟧 |
| 3.2.2 | 🟧 | | 3.2.2 | 🟧 |
| < 3.2.2 | :x: | | < 3.2.2 | :x: |
+7 -4
View File
@@ -1,6 +1,6 @@
<img src="https://www.dj-dj.be/wp-content/uploads/2023/02/open-ticket-cropped.png" alt="Open Ticket" width="600px"> <img src="https://www.dj-dj.be/wp-content/uploads/2023/02/open-ticket-cropped.png" alt="Open Ticket" width="600px">
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-3.3.3-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.3) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be) [![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-3.4.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.4.0) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be)
### Open Ticket ### Open Ticket
Open Ticket is of the most customisable discord ticket bots of all time! Open Ticket is of the most customisable discord ticket bots of all time!
@@ -11,9 +11,9 @@ Take a look at all the features and discover the possibilities!
### [Documentation](https://docs.openticket.dj-dj.be/quick-start) ### [Documentation](https://docs.openticket.dj-dj.be/quick-start)
## Features ## Features
- **🎉 NEW! html transcripts!** - **🎉 NEW! html transcripts V2!**
- 🔒 close, ❌ delete & ✅ re-open tickets - 🔒 close, ❌ delete & ✅ re-open tickets
- 🇬🇧 translation in 14 different languages - 🇬🇧 translation in 18 different languages
- 📄 very advanced customisation - 📄 very advanced customisation
- 🆗 buttons or 🔽 dropdowns! - 🆗 buttons or 🔽 dropdowns!
- 🆒 plugins - 🆒 plugins
@@ -60,9 +60,12 @@ Translators
|Turkish |Hydrâelčhâvø#1575 | |Turkish |Hydrâelčhâvø#1575 |
|Polish |MKevas#8311 | |Polish |MKevas#8311 |
|Slovenian |n1kkec#5341 | |Slovenian |n1kkec#5341 |
|Thai |Mods HD#0661 |
|Norwegian |NoOneNook#0266 |
|Greek |ꙅoᴎɒᎸɘƚꙅ#3744 |
## links ## links
current version: _v3.3.3_ current version: _v3.4.0_
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog) </br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start) </br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
+6 -15
View File
@@ -23,11 +23,9 @@ module.exports = () => {
return return
} }
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) 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.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
@@ -42,8 +40,6 @@ module.exports = () => {
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) => { if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "add") return if (interaction.commandName != "add") return
@@ -57,11 +53,9 @@ module.exports = () => {
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) 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.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
@@ -75,7 +69,4 @@ module.exports = () => {
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
})
} }
+7 -14
View File
@@ -12,7 +12,7 @@ const DISABLE = require("../core/api/api.json").disable
module.exports = () => { module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded change.js") 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.content.startsWith(config.prefix+"change")) return
if (!msg.guild) return if (!msg.guild) return
@@ -21,11 +21,9 @@ module.exports = () => {
return return
} }
msg.channel.messages.fetchPinned().then(async msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const list = [] const list = []
config.options.forEach((o) => list.push(o.id)) config.options.forEach((o) => list.push(o.id))
@@ -54,7 +52,6 @@ module.exports = () => {
log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}]) 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()) 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) => { if (!DISABLE.commands.slash.change) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
@@ -67,12 +64,9 @@ module.exports = () => {
} }
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(async (msglist) => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
/**@type {discord.Message} */ if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
var firstmsg = msglist.last() const ticketId = hiddendata.find(d => d.key == "type").value
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 list = [] const list = []
config.options.forEach((o) => list.push(o.id)) config.options.forEach((o) => list.push(o.id))
@@ -121,5 +115,4 @@ module.exports = () => {
log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}]) 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()) APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
})
} }
+15 -20
View File
@@ -26,20 +26,16 @@ module.exports = () => {
return return
} }
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
/**@type {discord.Message} */ if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
var firstmsg = msglist.last() const ticketId = hiddendata.find(d => d.key == "type").value
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:claimingUser.id}) hiddendata.push({key:"claimedby",value:claimingUser.id})
bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata)
storage.set("claimData",msg.channel.id,claimingUser.id) storage.set("claimData",msg.channel.id,claimingUser.id)
const newEmbed = new embed(firstmsg.embeds[0].data) const newEmbed = new embed(firstmsg.embeds[0].data)
.setFooter({text:"claimed by: "+msg.author.tag,iconURL:msg.author.displayAvatarURL()}) .setFooter({text:"claimed by: "+msg.author.tag,iconURL:msg.author.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){ if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
@@ -56,7 +52,6 @@ module.exports = () => {
APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) 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()) 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) => { if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
@@ -71,26 +66,27 @@ module.exports = () => {
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
/**@type {discord.Message} */ if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
var firstmsg = msglist.last() const ticketId = hiddendata.find(d => d.key == "type").value
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:user.id}) hiddendata.push({key:"claimedby",value:user.id})
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
storage.set("claimData",interaction.channel.id,user.id) 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) const newEmbed = new embed(firstmsg.embeds[0].data)
.setFooter({text:"claimed by: "+user.tag,iconURL:user.displayAvatarURL()}) .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){ if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}else{ }else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]}) firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
} }
})
interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]})
@@ -101,5 +97,4 @@ module.exports = () => {
APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) 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()) APIEvents.onCommand("claim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
})
} }
+8 -17
View File
@@ -24,13 +24,11 @@ module.exports = () => {
} }
const reason = tempreason const reason = tempreason
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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 const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
@@ -51,9 +49,6 @@ module.exports = () => {
}) })
})
if (!DISABLE.commands.slash.close) client.on("interactionCreate",async(interaction) => { if (!DISABLE.commands.slash.close) client.on("interactionCreate",async(interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "close") return if (interaction.commandName != "close") return
@@ -64,13 +59,11 @@ module.exports = () => {
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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 const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
@@ -88,7 +81,5 @@ module.exports = () => {
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) 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()) APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
})
}) })
} }
+6 -14
View File
@@ -21,11 +21,9 @@ module.exports = () => {
return return
} }
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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)]})
@@ -42,8 +40,6 @@ module.exports = () => {
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}]) 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()) APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
})
}) })
@@ -59,11 +55,9 @@ module.exports = () => {
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
@@ -80,7 +74,5 @@ module.exports = () => {
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}]) 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()) APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
})
}) })
} }
+6 -13
View File
@@ -23,11 +23,9 @@ module.exports = () => {
return return
} }
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
msg.channel.permissionOverwrites.delete(user.id) msg.channel.permissionOverwrites.delete(user.id)
msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]}) msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
@@ -42,8 +40,6 @@ module.exports = () => {
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) 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) => { if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "remove") return if (interaction.commandName != "remove") return
@@ -57,11 +53,9 @@ module.exports = () => {
await interaction.deferReply() await interaction.deferReply()
await interaction.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
interaction.channel.permissionOverwrites.delete(user.id) interaction.channel.permissionOverwrites.delete(user.id)
interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
@@ -75,5 +69,4 @@ module.exports = () => {
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) 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()) APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
})
} }
+6 -14
View File
@@ -21,11 +21,9 @@ module.exports = () => {
return return
} }
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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)
@@ -50,9 +48,6 @@ module.exports = () => {
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) 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) => { if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "rename") return if (interaction.commandName != "rename") return
@@ -65,11 +60,9 @@ module.exports = () => {
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
var newname = interaction.options.getString("name") var newname = interaction.options.getString("name")
var name = interaction.channel.name var name = interaction.channel.name
@@ -91,5 +84,4 @@ module.exports = () => {
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
})
} }
+7 -16
View File
@@ -15,13 +15,11 @@ module.exports = () => {
if (!DISABLE.commands.text.reopen) client.on("messageCreate",msg => { if (!DISABLE.commands.text.reopen) client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"reopen")) return if (!msg.content.startsWith(config.prefix+"reopen")) return
msg.channel.messages.fetchPinned().then(msglist => { const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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]})
@@ -31,19 +29,15 @@ module.exports = () => {
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
}) })
})
if (!DISABLE.commands.slash.reopen) client.on("interactionCreate",async (interaction) => { if (!DISABLE.commands.slash.reopen) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "reopen") return if (interaction.commandName != "reopen") return
await interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(async msglist => { const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
var firstmsg = msglist.last() if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) const ticketId = hiddendata.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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!")]})
@@ -54,7 +48,4 @@ module.exports = () => {
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}]) 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()) APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
}) })
})
} }
+15 -14
View File
@@ -26,19 +26,20 @@ module.exports = () => {
const unclaimuser = storage.get("claimData",msg.channel.id) 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!")]}) 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 => { msg.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */ /**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) 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) 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) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
if (ticketData && ticketData.autoclose.enable){ if (ticketData && ticketData.autoclose.enable){
@@ -81,20 +82,20 @@ module.exports = () => {
const unclaimuser = storage.get("claimData",interaction.channel.id) 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!")]}) 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 => { interaction.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */ /**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) 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) 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) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
if (ticketData && ticketData.autoclose.enable){ if (ticketData && ticketData.autoclose.enable){
+10 -1
View File
@@ -64,6 +64,15 @@
"autoclose":{ "autoclose":{
"enable":false, "enable":false,
"inactiveHours":24 "inactiveHours":24
},
"ping":{
"@here":true,
"@everyone":false,
"custom":{
"enable":false,
"roleId":"012345678910"
}
} }
}, },
@@ -102,7 +111,7 @@
"dropdown":false, "dropdown":false,
"enableFooter":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, "enableFooterImage":false,
"footerImage":"https://www.example.com/catmemes/cat.png", "footerImage":"https://www.example.com/catmemes/cat.png",
+1 -1
View File
@@ -427,7 +427,7 @@ exports.checker = async () => {
checkType(config.languageFile,"string","languagefile") checkType(config.languageFile,"string","languagefile")
const lf = config.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") createError("'languagefile' | invalid language, more info in the wiki")
} }
@@ -7,7 +7,6 @@ const log = bot.errorLog.log
const permissionChecker = require("../../../utils/permisssionChecker") const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.color const mc = config.color
const permsChecker = require("../../../utils/permisssionChecker") const permsChecker = require("../../../utils/permisssionChecker")
@@ -32,20 +31,21 @@ module.exports = () => {
return 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 => { interaction.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */ /**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]}) 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) const newEmbed = new embed(firstmsg.embeds[0].data)
.setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()}) .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){ if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]}) firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
+14 -51
View File
@@ -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) if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0)
//getID & send DM & send api event //getID & send DM & send api event
await channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last() const hiddendata = bot.hiddenData.readHiddenData(channel.id)
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const ticketId = hiddendata.find(d => d.key == "type").value
const ticketId = hiddendata.data.find(d => d.key == "type").value.value
const ticketData = require("../utils/configParser").getTicketById(ticketId,true) 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}) require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
const id = hiddendata.data.find(d => d.key == "openerid").value hiddendata.push({key:"pendingdelete",value:"true"})
bot.hiddenData.writeHiddenData(channel.id,hiddendata)
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
})
}else if (mode == "close"){ }else if (mode == "close"){
//close //close
@@ -143,23 +133,13 @@ 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!") 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 //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]})
}
}
if (firstmsg.embeds.length < 1 || !firstmsg.embeds[0].description.includes("OTDATA")) return channel.send({embeds:[ticketInfoError]}) const hiddendata = bot.hiddenData.readHiddenData(channel.id)
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const ticketId = hiddendata.find(d => d.key == "type").value
const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("../utils/configParser").getTicketById(ticketId,true) const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
if (!ticketData) return if (!ticketData) return
if (ticketData.closedCategory.enable){ if (ticketData.closedCategory.enable){
/**@type {discord.CategoryChannel} */ /**@type {discord.CategoryChannel} */
const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory) const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory)
@@ -170,11 +150,7 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
} }
} }
/** ticketData.adminroles.forEach((role,index) => {
* @type {String[]}
*/
const ticketadmin = ticketData.adminroles
ticketadmin.forEach((role,index) => {
if (!config.adminRoles.includes(role)){ if (!config.adminRoles.includes(role)){
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
@@ -191,7 +167,6 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
} }
} }
}) })
})
channel.permissionOverwrites.set(permissionArray) 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}]) log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
//getID & send DM & send api event //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) 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
})
} }
/** /**
@@ -263,6 +223,9 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
const deleteHandler = async () => { const deleteHandler = async () => {
if (deleteRequired){ if (deleteRequired){
pendingDelete.shift() pendingDelete.shift()
//delete HIDDENDATA
storage.delete("HIDDENDATA",channel.id)
await channel.delete() await channel.delete()
} }
} }
+11 -10
View File
@@ -132,11 +132,8 @@ module.exports = () => {
}) })
//add ticket adminroles //add ticket adminroles
/** if (currentTicketOptions.readonlyAdminroles){
* @type {String[]} currentTicketOptions.readonlyAdminroles.forEach((role,index) => {
*/
const readonlyTicketadmin = currentTicketOptions.readonlyAdminroles
readonlyTicketadmin.forEach((role,index) => {
if (!config.adminRoles.includes(role) && !currentTicketOptions.adminroles.includes(role)){ if (!config.adminRoles.includes(role) && !currentTicketOptions.adminroles.includes(role)){
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
@@ -151,6 +148,7 @@ module.exports = () => {
}catch{} }catch{}
} }
}) })
}
//add member role //add member role
if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){ if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
@@ -178,7 +176,7 @@ module.exports = () => {
storage.set("userFromChannel",ticketChannel.id,interaction.member.id) storage.set("userFromChannel",ticketChannel.id,interaction.member.id)
if (currentTicketOptions.autoclose.enable) storage.set("autocloseTickets",ticketChannel.id,currentTicketOptions.autoclose.inactiveHours) 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() var ticketEmbed = new discord.EmbedBuilder()
//.setAuthor({name:interaction.user.id}) //.setAuthor({name:interaction.user.id})
@@ -191,16 +189,19 @@ module.exports = () => {
} }
if (currentTicketOptions.ticketmessage.length > 0){ if (currentTicketOptions.ticketmessage.length > 0){
ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata) ticketEmbed.setDescription(currentTicketOptions.ticketmessage)
}else{
ticketEmbed.setDescription(hiddendata)
} }
if (currentTicketOptions.thumbnail.enable) ticketEmbed.setThumbnail(currentTicketOptions.thumbnail.url) if (currentTicketOptions.thumbnail.enable) ticketEmbed.setThumbnail(currentTicketOptions.thumbnail.url)
if (currentTicketOptions.image.enable) ticketEmbed.setImage(currentTicketOptions.image.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({ ticketChannel.send({
content:"<@"+interaction.member.id+"> @here", content:"<@"+interaction.member.id+">"+herePing+everyonePing+customPing,
embeds:[ticketEmbed], embeds:[ticketEmbed],
components:[closeButton] components:[closeButton]
@@ -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 */ /**@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 * @param {discord.Guild} guild
@@ -46,13 +54,9 @@ exports.compile = (guild,channel,user,messagesInv,data) => {
}) })
msg.embeds.forEach((embed) => { msg.embeds.forEach((embed) => {
if (embed.description){
var desc = bot.hiddenData.removeHiddenData(embed.description).description
}else{var desc = false}
embedArray.push({ embedArray.push({
title:embed.title || false, title:embed.title || false,
description:desc, description:embed.description ? embed.description : false,
authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false), authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false),
authortext:(embed.author ? embed.author.name : false), authortext:(embed.author ? embed.author.name : false),
footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false), footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false),
@@ -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
}
+4 -4
View File
@@ -6,7 +6,7 @@ const tsconfig = bot.tsconfig
const tsembeds = require("../embeds") const tsembeds = require("../embeds")
const tsdb = require("../tsdb") 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 * @param {Object} json
@@ -17,12 +17,12 @@ exports.upload = async (json) => {
const data = encodeURIComponent(JSON.stringify(json)) const data = encodeURIComponent(JSON.stringify(json))
try { 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) if (res.status != 200) resolve(false)
resolve(res.data) resolve(res.data)
}catch{ }catch(err){
console.log("failed transcript upload!") console.log("failed transcript upload!",err.response)
resolve(false) resolve(false)
} }
}) })
@@ -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,"&nbsp;") : 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,"&nbsp;") : 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,"&nbsp;") : 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
}
@@ -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"
}
]
}
]
}
+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"version":"1.0.0" "version":"2"
} }
+49 -25
View File
@@ -14,11 +14,15 @@ const tsdb = require("./tsdb")
const checkAvailability = async () => { const checkAvailability = async () => {
if (process.argv.some((v) => v == "--tsoffline")) return true if (process.argv.some((v) => v == "--tsoffline")) return true
const axios = require("axios").default const axios = require("axios").default
const res = await axios.get("https://transcripts.dj-dj.be/status.txt") 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 || !(res.status == 200) || !res.data) return false
if ((res.data == "online") || (res.data == "1") || (res.data == "true")) return true if (res.data && res.data["v2"] == "online") return true
else return false else return false
}catch{
return false
}
} }
/** /**
@@ -36,35 +40,54 @@ module.exports = async (messages,guild,channel,user,reason) => {
const chName = channel.name const chName = channel.name
const chId = channel.id const chId = channel.id
/**@param {discord.Collection<string, discord.Message<true>>} msglist*/ const asyncmanager = async () => {
const asyncmanager = async (msglist) => { const hiddendata = bot.hiddenData.readHiddenData(channel.id)
var firstmsg = msglist.last() 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 id = hiddendata.find(d => d.key == "openerid").value
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const opentime = new Date(Number(hiddendata.find(d => d.key == "createdms").value))
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 ticketopener = client.users.cache.find(u => u.id == id) const ticketopener = client.users.cache.find(u => u.id == id)
if (tsconfig.sendTranscripts.useHTMLtranscripts){ 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:{ style:{
titleColor:tsconfig.style.titleColor, background:{
enableCustomBackground:tsconfig.style.background.enableCustomBackground, enableCustomBackground:tsb.enableCustomBackground,
backgroundModus:tsconfig.style.background.backgroundModus, backgroundModus:tsb.backgroundModus,
backgroundData:tsconfig.style.background.backgroundData 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:{ bot:{
name:client.user.username, name:client.user.username,
id:client.user.id, id:client.user.id,
pfp:client.user.displayAvatarURL() pfp:client.user.displayAvatarURL(),
}, },
ticket:{ ticket:{
creatorid:ticketopener.id, creatorid:ticketopener.id,
creatorname:ticketopener.tag, creatorname:ticketopener.tag,
creatorpfp:ticketopener.displayAvatarURL(),
openedtime:opentime.getTime(), openedtime:opentime.getTime(),
closedtime:new Date().getTime() closedtime:new Date().getTime()
} }
@@ -88,16 +111,17 @@ module.exports = async (messages,guild,channel,user,reason) => {
if (!TSdata) return false if (!TSdata) return false
if (TSdata.status == "success"){ 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 //calculate estimated time
const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime()) //const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime())
const dumpLoopTime = 15000 //const dumpLoopTime = 15000
const nextDump = new Date(lastDumpTime+dumpLoopTime) //const nextDump = new Date(lastDumpTime+dumpLoopTime)
const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow //const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow
const finaltime = new Date(nextDump.getTime()+processtime) const duration = TSdata.estimated.waittime
const duration = finaltime.getTime()-new Date().getTime() const finaltime = new Date(new Date().getTime()+duration)
//waiting //waiting
if (tsconfig.sendTranscripts.enableChannel){ if (tsconfig.sendTranscripts.enableChannel){
@@ -148,5 +172,5 @@ module.exports = async (messages,guild,channel,user,reason) => {
} }
} }
} }
asyncmanager(msglist) asyncmanager()
} }
+2 -2
View File
@@ -6,7 +6,7 @@ const l = bot.language
//================== //==================
//OTTicketOptions //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 //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 */ /**@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 */ /**@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 //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"|"color"|"roles"|"mode"|"enableDmOnOpen"} OTRoleStringOptions */
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */ /**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */
+29 -48
View File
@@ -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} * @returns {hiddenData}
*/ */
exports.readHiddenData = (messageContent) => { exports.readHiddenData = (channelid) => {
//ticketdata//type:123|userid:456) const content = storage.get("HIDDENDATA",channelid)
if (!messageContent.includes("[ ](https://OTDATA|")) return {type:"",data:[],status:false} if (!content) return {type:"",data:[],status:false}
const rawhidden = messageContent.split("[ ](https://OTDATA|")[1]
const rawhidden2 = rawhidden.split("//")
const datatype = rawhidden2[0] try {
var rawhiddendata = rawhidden2[1] return JSON.parse(content)
var rawhiddendataArray = rawhiddendata.split("") } catch {
rawhiddendataArray.pop() return []
}
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}
} }
/** /**
* *
* @param {String} type * @param {String} channelid
* @param {[{key:String,value:String}]} data * @param {[{key:String,value:String}]} data
* @returns {String} * @returns {Boolean}
*/ */
exports.writeHiddenData = (type,data) => { exports.writeHiddenData = (channelid,data) => {
const dataValues = [] try {
data.forEach((d) => { storage.set("HIDDENDATA",channelid,JSON.stringify(data))
dataValues.push(d.key+":"+d.value) return true
}) } catch {
return false
const datastring = dataValues.join("|") }
const result = "[ ](https://OTDATA|"+type+"//"+datastring+")"
return result
} }
/** /**
* *
* @param {String} description * @param {String} channelid
* @returns {{description:String,hiddenData:hiddenData}} * @returns {Boolean}
*/ */
exports.removeHiddenData = (description) => { exports.deleteHiddenData = (channelid) => {
if (!description.includes("[ ](https://OTDATA|")) return {description:description,hiddenData:[]} try {
storage.delete("HIDDENDATA",channelid)
const hiddenData = this.readHiddenData(description) return true
const splitted = description.split("[ ](https://OTDATA") } catch {
const original = splitted[0] return false
}
return {description:original,hiddenData:hiddenData}
} }
+1 -1
View File
@@ -188,7 +188,7 @@ exports.liveStatusUploadManager = async (err) => {
system:config.system system:config.system
}, },
language:config.languageFile, language:config.languageFile,
version:require("../../package.json").version, version:"3.4.0",
slashcmds:slashMode, slashcmds:slashMode,
transcripts:transcriptMode, transcripts:transcriptMode,
plugins:fs.readdirSync("./plugins"), plugins:fs.readdirSync("./plugins"),
+1 -1
View File
@@ -28,7 +28,7 @@
INFORMATION: INFORMATION:
============ ============
Open Ticket v3.3.3 - © DJdj Development Open Ticket v3.4.0 - © DJdj Development
discord: https://discord.dj-dj.be discord: https://discord.dj-dj.be
website: https://www.dj-dj.be website: https://www.dj-dj.be
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"ChilledBroke#9986 & M4#5882",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors": { "errors": {
"missingArgsTitle": "قيمة غير صالحة!", "missingArgsTitle": "قيمة غير صالحة!",
"missingArgsDescription": "قيمة مفقودة", "missingArgsDescription": "قيمة مفقودة",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"DJdj Development",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
"missingArgsDescription":"Missing Argument", "missingArgsDescription":"Missing Argument",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"t0miiis#3022",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Neplatny Argument!", "missingArgsTitle":"Neplatny Argument!",
"missingArgsDescription":"Chybí Argument", "missingArgsDescription":"Chybí Argument",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"the_gamer#5095",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors": { "errors": {
"missingArgsTitle": "Ugyldigt Argument!", "missingArgsTitle": "Ugyldigt Argument!",
"missingArgsDescription": "Manglende Argument", "missingArgsDescription": "Manglende Argument",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"DJj123dj#1706",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Onjuiste parameters!", "missingArgsTitle":"Onjuiste parameters!",
"missingArgsDescription":"Er missen parameters", "missingArgsDescription":"Er missen parameters",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"DJdj Development",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Invalid Arguments!", "missingArgsTitle":"Invalid Arguments!",
"missingArgsDescription":"Missing Argument", "missingArgsDescription":"Missing Argument",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"Sanke#6086",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Arguments invalides!", "missingArgsTitle":"Arguments invalides!",
"missingArgsDescription":"Argument manquant", "missingArgsDescription":"Argument manquant",
+4 -1
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"david.#8276 ",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Ungültiges Argument!", "missingArgsTitle":"Ungültiges Argument!",
"missingArgsDescription":"Fehlendes Argument!", "missingArgsDescription":"Fehlendes Argument!",
@@ -36,7 +39,7 @@
"goToTicket":"Geh zu deinem Ticket", "goToTicket":"Geh zu deinem Ticket",
"ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!", "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":{ "helpMenu":{
"title":"Hilfe Menu:", "title":"Hilfe Menu:",
+101
View File
@@ -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":"Το αντίγραφο είναι ανοιχτώ εδώ!"
}
}
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"Maurizio#0268",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Argomenti non validi!", "missingArgsTitle":"Argomenti non validi!",
"missingArgsDescription":"Argomenti mancanti", "missingArgsDescription":"Argomenti mancanti",
+101
View File
@@ -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!"
}
}
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"MKevas#8311",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Nieprawidłowe argumenty!", "missingArgsTitle":"Nieprawidłowe argumenty!",
"missingArgsDescription":"Brakujący argument", "missingArgsDescription":"Brakujący argument",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"QuirAddon#9778",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Argumentos inválidos!", "missingArgsTitle":"Argumentos inválidos!",
"missingArgsDescription":"Argumento ausente", "missingArgsDescription":"Argumento ausente",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"Sanke#6086",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Argumente Invalide", "missingArgsTitle":"Argumente Invalide",
"missingArgsDescription":"Argument Lipsa", "missingArgsDescription":"Argument Lipsa",
+16 -13
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"Apexo#0723",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Неверные аргументы!", "missingArgsTitle":"Неверные аргументы!",
"missingArgsDescription":"Отсутствует аргумент", "missingArgsDescription":"Отсутствует аргумент",
@@ -29,12 +32,12 @@
"unclaimTitle":"Этот тикет никем не взят!", "unclaimTitle":"Этот тикет никем не взят!",
"changeTitle":"Изменён тип тикета на {0}!", "changeTitle":"Изменён тип тикета на {0}!",
"statsTitle":"Here are the stats for {0}!", "statsTitle":"Здесь статистика для {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!", "autocloseTitle":"Этот тикет будет закрыт автоматически после {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!", "autocloseRejectTitle":"Этот тикет больше не будет закрыт автоматически!",
"autocloseWarn":"This only affects inactive tickets!", "autocloseWarn":"Это касается только неактивных тикетов!",
"goToTicket":"go to ticket", "goToTicket":"перейти в тикет",
"ticketWarning":"embed ниже сообщения!", "ticketWarning":"embed ниже сообщения!",
"maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_" "maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_"
}, },
@@ -50,11 +53,11 @@
"addCmd":"Добавить пользователя в тикет.", "addCmd":"Добавить пользователя в тикет.",
"removeCmd":"Удалить пользователя из тикета.", "removeCmd":"Удалить пользователя из тикета.",
"reopenCmd":"Открыть заново тикет после того, как он был закрыт.", "reopenCmd":"Открыть заново тикет после того, как он был закрыт.",
"changeCmd":"Change ticket type.", "changeCmd":"Поменять тип тикета.",
"claimCmd":"Claim a ticket.", "claimCmd":"Взять тикет.",
"unclaimCmd":"Unclaim a ticket.", "unclaimCmd":"Снять тикет.",
"statsCmd":"View ticket stats.", "statsCmd":"Посмотреть статистику тикета.",
"autocloseCmd":"Set timer to automatically close ticket" "autocloseCmd":"Установить таймер, чтобы автоматически закрыть тикет"
}, },
"buttons":{ "buttons":{
"close":"Закрыть тикет", "close":"Закрыть тикет",
@@ -80,8 +83,8 @@
"none":"отсутствует", "none":"отсутствует",
"reason":"причина", "reason":"причина",
"createdat":"created at", "createdat":"создан",
"openedby":"opened by", "openedby":"открыт",
"deletedby":"удалён", "deletedby":"удалён",
"closedby":"закрыт", "closedby":"закрыт",
@@ -90,7 +93,7 @@
}, },
"transcripts":{ "transcripts":{
"title":"Транскрипт", "title":"Транскрипт",
"processed":"This transcript is being processed", "processed":"Этот транскрипт находится в процессе обработки",
"wait":"Пожайлуста подождите!", "wait":"Пожайлуста подождите!",
"estimated":"Оценочное время", "estimated":"Оценочное время",
"available":"Транскрипт здесь доступен" "available":"Транскрипт здесь доступен"
+25 -12
View File
@@ -10,6 +10,7 @@
"es-ES":"spanish", "es-ES":"spanish",
"it":"italian", "it":"italian",
"ru":"russian", "ru":"russian",
"tr": "Türkçe",
"MISSING":"arabic,portuguese", "MISSING":"arabic,portuguese",
"NOTAVAILABLE":"arabic,portuguese,czech" "NOTAVAILABLE":"arabic,portuguese,czech"
@@ -25,7 +26,8 @@
"fr":"Une liste des commandes.", "fr":"Une liste des commandes.",
"es-ES":"Una lista de los comandos disponibles.", "es-ES":"Una lista de los comandos disponibles.",
"it":"Una lista di tutti i comandi disponibili.", "it":"Una lista di tutti i comandi disponibili.",
"ru":"Список доступных команд" "ru":"Список доступных команд",
"tr": "Kullanılabilir komutların listesi."
}, },
"message":{ "message":{
"en-GB":"Spawn an embed with buttons.", "en-GB":"Spawn an embed with buttons.",
@@ -37,7 +39,8 @@
"fr":"Créer un embed avec des boutons.", "fr":"Créer un embed avec des boutons.",
"es-ES":"Genera un embed con botones.", "es-ES":"Genera un embed con botones.",
"it":"Genera un embed con un pulsante.", "it":"Genera un embed con un pulsante.",
"ru":"Создать embed с кнопками" "ru":"Создать embed с кнопками",
"tr": "Butonlar ile bir yerleştirme oluşturun."
}, },
"close":{ "close":{
"en-GB":"Close a ticket.", "en-GB":"Close a ticket.",
@@ -49,7 +52,8 @@
"fr":"Fermer un ticket.", "fr":"Fermer un ticket.",
"es-ES":"Cierra un ticket.", "es-ES":"Cierra un ticket.",
"it":"Chiudi un ticket.", "it":"Chiudi un ticket.",
"ru":"Закрыть тикет" "ru":"Закрыть тикет",
"tr": "Bileti kapat."
}, },
"delete":{ "delete":{
"en-GB":"Delete a ticket.", "en-GB":"Delete a ticket.",
@@ -61,7 +65,8 @@
"fr":"Supprimer un ticket.", "fr":"Supprimer un ticket.",
"es-ES":"Elimina un ticket.", "es-ES":"Elimina un ticket.",
"it":"Elimina un ticket.", "it":"Elimina un ticket.",
"ru":"Удалить тикет" "ru":"Удалить тикет",
"tr": "Bileti sil."
}, },
"reopen":{ "reopen":{
"en-GB":"Re-Open a ticket.", "en-GB":"Re-Open a ticket.",
@@ -73,7 +78,8 @@
"fr":"Re-ouvrir un ticket.", "fr":"Re-ouvrir un ticket.",
"es-ES":"Re-abre un ticket.", "es-ES":"Re-abre un ticket.",
"it":"Ri-Apri un ticket.", "it":"Ri-Apri un ticket.",
"ru":"Открыть заново тикет" "ru":"Открыть заново тикет",
"tr": "Bileti yeniden aç."
}, },
"add":{ "add":{
"en-GB":"Add another user to a ticket.", "en-GB":"Add another user to a ticket.",
@@ -85,7 +91,8 @@
"fr":"Ajouter un utilisateur au ticket.", "fr":"Ajouter un utilisateur au ticket.",
"es-ES":"Agrega otro usuario al ticket.", "es-ES":"Agrega otro usuario al ticket.",
"it":"Aggiungi un membro al ticket", "it":"Aggiungi un membro al ticket",
"ru":"Добавить другого пользователя в тикет" "ru":"Добавить другого пользователя в тикет",
"tr": "Bilete başka bir kullanıcı ekle."
}, },
"remove":{ "remove":{
"en-GB":"Remove a user from a ticket.", "en-GB":"Remove a user from a ticket.",
@@ -97,7 +104,8 @@
"fr":"Enlever quelqu’un du ticket.", "fr":"Enlever quelqu’un du ticket.",
"es-ES":"Elimina otro usuario del ticket.", "es-ES":"Elimina otro usuario del ticket.",
"it":"Rimuovi un membro dal ticket", "it":"Rimuovi un membro dal ticket",
"ru":"Удалить пользователя из тикета" "ru":"Удалить пользователя из тикета",
"tr": "Kullanıcıyı bir biletten kaldır."
}, },
"newticket":{ "newticket":{
"en-GB":"Create a ticket", "en-GB":"Create a ticket",
@@ -109,7 +117,8 @@
"fr":"Créer un ticket", "fr":"Créer un ticket",
"es-ES":"Crear un ticket.", "es-ES":"Crear un ticket.",
"it":"Crea un ticket", "it":"Crea un ticket",
"ru":"Создать тикет" "ru":"Создать тикет",
"tr": "Bilet oluştur"
}, },
"rename":{ "rename":{
"en-GB":"Rename a ticket channel.", "en-GB":"Rename a ticket channel.",
@@ -121,7 +130,8 @@
"fr":"Renommer un ticket.", "fr":"Renommer un ticket.",
"es-ES":"Renombrar un canal de ticket.", "es-ES":"Renombrar un canal de ticket.",
"it":"Rinomina il canale di un ticket.", "it":"Rinomina il canale di un ticket.",
"ru":"Переименовать канал тикета" "ru":"Переименовать канал тикета",
"tr": "Bilet kanalını yeniden adlandır."
}, },
"claim":{ "claim":{
"en-GB":"Claim a ticket.", "en-GB":"Claim a ticket.",
@@ -133,7 +143,8 @@
"fr":" ", "fr":" ",
"es-ES":" ", "es-ES":" ",
"it":" ", "it":" ",
"ru":"Взять тикет" "ru":"Взять тикет",
"tr":"Bilet talep et."
}, },
"unclaim":{ "unclaim":{
"en-GB":"Un-claim a ticket.", "en-GB":"Un-claim a ticket.",
@@ -145,7 +156,8 @@
"fr":" ", "fr":" ",
"es-ES":" ", "es-ES":" ",
"it":" ", "it":" ",
"ru":"Снять тикет" "ru":"Снять тикет",
"tr":"Bileti iptal et."
}, },
"category":{ "category":{
"en-GB":"Change ticket type.", "en-GB":"Change ticket type.",
@@ -157,7 +169,8 @@
"fr":" ", "fr":" ",
"es-ES":" ", "es-ES":" ",
"it":" ", "it":" ",
"ru":"Изменить тип тикета" "ru":"Изменить тип тикета",
"tr":"Bilet türünü değiştir."
} }
} }
} }
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"n1kkec#5341",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Napačen argument!", "missingArgsTitle":"Napačen argument!",
"missingArgsDescription":"Argument manka", "missingArgsDescription":"Argument manka",
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"Redactado#1673 & josuens14#5267",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"¡Argumentos inválidos!", "missingArgsTitle":"¡Argumentos inválidos!",
"missingArgsDescription":"Argumento faltante.", "missingArgsDescription":"Argumento faltante.",
+101
View File
@@ -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":"บันทึกข้อความพร้อมใช้งานที่นี่"
}
}
+3
View File
@@ -1,4 +1,7 @@
{ {
"_CREDITS":"Hydrâelčhâvø#1575",
"_INFO":"This file is a translation for open ticket 3.4.0",
"errors":{ "errors":{
"missingArgsTitle":"Geçersiz argümanlar!", "missingArgsTitle":"Geçersiz argümanlar!",
"missingArgsDescription":"Eksik argüman!", "missingArgsDescription":"Eksik argüman!",
+2 -3
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-ticket", "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.", "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", "main": "index.js",
"scripts": { "scripts": {
@@ -15,8 +15,7 @@
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^0.27.2",
"chalk": "^5.0.1", "chalk": "^5.0.1",
"discord.js": "^14.8.0", "discord.js": "^14.11.0"
"node": "^16.10.0"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
+17 -3
View File
@@ -7,12 +7,26 @@
"useHTMLtranscripts":true "useHTMLtranscripts":true
}, },
"style":{ "style":{
"titleColor":"#F8BA00",
"background":{ "background":{
"enableCustomBackground":false, "enableCustomBackground":false,
"backgroundModus":"color OR image", "backgroundModus":"image OR color",
"backgroundData":"#abc123 OR https://www.example.com/image.png" "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"
} }
} }
} }