Compare commits

...
43 Commits
Author SHA1 Message Date
Jasper d0bcf26b93 Open Ticket v3.2.2
new update :)
2023-02-24 21:58:40 +01:00
DJj123dj 65f82171d3 v3.2.2 push 4 2023-02-24 21:48:59 +01:00
DJj123dj 6e730f058d github files moved to new directory 2023-02-24 15:13:33 +01:00
DJj123dj 4702c633ec v3.2.2 push 2 2023-02-24 15:02:53 +01:00
DJj123dj dc14a39c4e v3.2.2 push 1 2023-02-24 14:49:36 +01:00
Jasper 05c97909d4 Merge pull request #49 from DJj123dj/translation
Translation
2023-02-13 21:18:59 +01:00
Jasper b3c4c2f6e8 Merge pull request #47 from Apexo01/main
Added russian language
2023-02-13 21:01:19 +01:00
Jasper e0e678bee0 Merge pull request #48 from DJj123dj/main
test
2023-02-13 20:59:04 +01:00
Jasper 1b01b1703f Merge branch 'dev' into main 2023-02-13 20:57:43 +01:00
Jasper 26539360c6 Merge pull request #46 from quiradon/patch-2
Update portuguese.json
2023-02-13 20:54:30 +01:00
Apexo 627c461f64 Update README.md 2023-02-13 22:30:18 +03:00
Apexo 2e40dc0468 Added russian language 2023-02-13 22:18:07 +03:00
Jasper fa57b9a93f Update checker.js 2023-02-12 15:09:27 +01:00
QuiraDon 930452155b Update portuguese.json
some fixes on what was missing.
2023-02-09 02:20:09 -03:00
DJj123dj e70f22162d Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-02-08 14:27:40 +01:00
DJj123dj d5b0a0f3c6 /change bugfix 2023-02-08 14:27:39 +01:00
Jasper c43081e05d Merge pull request #45 from quiradon/patch-1 2023-02-08 07:09:44 +01:00
QuiraDon 8c4bf735f1 Update Portugueses Lang
I completed the translation into Portuguese that was missing a few things.
2023-02-07 23:33:26 -03:00
Jasper 3a20c4707b open ticket v3.2.1
Update dev branch
2023-02-07 17:03:22 +01:00
Jasper 9a7e563c57 Update dev branch 2023-02-07 17:02:02 +01:00
Jasper 72b4f43a25 Open Ticket v3.2.1
Bug fix update
2023-02-07 17:01:14 +01:00
DJj123dj 5fec028cc9 Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-02-07 16:59:26 +01:00
DJj123dj 81300303e5 Update danish.json 2023-02-07 16:59:19 +01:00
Jasper 8a1ea1c856 Update README.md 2023-02-06 22:08:11 +01:00
Jasper 8a9d63bf8b Merge pull request #41 from Sank34/patch-2
French Translation New
2023-02-06 22:07:18 +01:00
DJj123dj 208b365276 Update czech.json 2023-02-06 21:49:42 +01:00
Andrei abb64a0575 French Translation New 2023-02-05 23:32:42 +02:00
DJj123dj c930140540 Update german.json 2023-02-05 22:17:19 +01:00
DJj123dj 294c4d3f2b Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-02-05 16:22:47 +01:00
DJj123dj 28e7d48e7e v3.2.1 push 3 2023-02-05 16:22:44 +01:00
Jasper bad278e681 Merge pull request #40 from DJj123dj/readme-edit
Edited readme
2023-02-02 18:16:52 +01:00
Jasper 2e2542d064 added documentation below 2023-02-02 18:15:42 +01:00
Jasper 2c48da45ae readme-update step 1 2023-02-02 18:11:46 +01:00
Jasper e1232a559e Added translation from Sank34/patch-1
Romanian for v3.2.1
2023-01-28 12:18:17 +01:00
Andrei 3d58475461 Update to the new Version 2023-01-28 13:16:17 +02:00
DJj123dj f702b199da v3.2.1 TRANSLATION! 2023-01-28 11:51:10 +01:00
DJj123dj ea1604a805 v3.2.1 push 1 (fixed /change bugs) 2023-01-25 16:28:19 +01:00
DJj123dj f8bc3d9e12 bug fix: tickets couldn't close in some situations 2023-01-19 17:42:44 +01:00
Jasper af35f83291 Open Ticket v3.2.0
Open Ticket v3.2.0
2023-01-18 21:48:13 +01:00
DJj123dj 39fec94ead changed readme.md 2023-01-18 21:47:32 +01:00
DJj123dj 1b8468330e v3.2 last push 2023-01-18 21:44:56 +01:00
DJj123dj b698c89a89 v3.2 push 2 2023-01-17 22:25:20 +01:00
DJj123dj 7ed2d7bcc7 v3.2 push 1 NOT WORKING YET!!! 2023-01-17 17:34:51 +01:00
51 changed files with 1816 additions and 871 deletions
+10 -6
View File
@@ -1,18 +1,22 @@
node_modules/ node_modules/
package-lock.json package-lock.json
devConfig.json devconfig.json
devConfig1.json devconfig1.json
devConfig2.json devconfig2.json
devConfig3.json devconfig3.json
devConfig4.json devconfig4.json
devConfig5.json devconfig5.json
.DS_Store .DS_Store
openticketdebug.txt openticketdebug.txt
developerChangelog.md developerChangelog.md
storage/dynamicDB/ storage/dynamicDB/
storage/slashcmdEnabled.txt storage/slashcmdEnabled.txt
storage/database.json storage/database.json
storage/tsdatabase.json
storage/.DS_Store storage/.DS_Store
.vscode/ .vscode/
livestatus.json livestatus.json
test.js test.js
devtsconfig.json
plugins/*
!plugins/example.plugin.js
+53 -46
View File
@@ -1,59 +1,66 @@
# Open Ticket <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.1.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.1.0) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![documentation](https://img.shields.io/badge/documentation-Click%20Here-yellow.svg?style=flat-square)](https://docs.openticket.dj-dj.be)
Open ticket is the most configurable open-source ticket bot for discord! Made with the newest technologies. Like: Slash commands, transcripts, multiple ticket types, buttons & dropdowns! [![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.2.2-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.2.2) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be)
Start using it now, you can do anything!
*We love to hear suggestions for more features!* ### Open Ticket
Open Ticket is of the most customisable discord ticket bots of all time!
You have more than +100 options to customise in the config! This includes html transcripts, unlimited tickets, custom embeds & more!
We also have a great support service, we can solve every question you have about open ticket! We even provide free 24/7 hosting if you want!
<img src="logo.png" alt="Open Ticket logo" style="height: 200px; width:200px;"/> Take a look at all the features and discover the possibilities!
### [Documentation](https://docs.openticket.dj-dj.be/quick-start)
[![wiki](https://img.shields.io/badge/documentation-click%20here-blue.svg?style=flat-square)](https://www.github.com/DJj123dj/open-ticket/wiki) ## Features
- **🎉 NEW! html transcripts!**
- 🔒 close, ❌ delete & ✅ re-open tickets
- 🇬🇧 translation in 12 different languages
- 📄 very advanced customisation
- 🆗 buttons or 🔽 dropdowns!
- 🆒 plugins
- ∞ unlimited tickets & unlimited messages
- ➕➖ add/remove users from a ticket
- /slash & text commands
### Thanks to these people: <details>
- DJ-Lite: for doing the administration <summary><b>Click here for even more features!</b></summary>
- Sanke: for translation & new ideas
- Everyone that reported a bug
#### And our translators!
- ExothDE
- 1x1
- Redactado
- t0miiis
- josuens14
- M4
- David.
- Maurizio
## features
- discord interaction buttons
- slash & text commands
- close, delete & re-open tickets
- translation in 10 different languages
- transcripts
- add/remove users from a ticket
- a lot of customisation options.
- tickets, reaction roles & links are all possible!
- choose between buttons or dropdowns!
- discord.js v14
- everyting is configurable
- custom API + plugins
- unlimited tickets spread over multiple messages
- close with reason
*comming soon* - very customisable
- share transcripts - close tickets with reason
- view transcripts in html - also includes reaction roles!
- discord interaction buttons
- discord.js 14
</details>
## quick start ## preview
[Click here to start your adventure!](https://docs.openticket.dj-dj.be/quick-start) Images coming soon<br>
You can already see some images at our [documentation!](https://docs.openticket.dj-dj.be)
## documentation
[<img src="./otWIKI.png" width="400px" href="https://docs.openticket.dj-dj.be">](https://docs.openticket.dj-dj.be)
## information ## credits
DJdj Development Team
|Main Developer|Developer|Support Team|Designer|
|--------------|---------|-----------|---------|
|DJj123dj |Sanke |DJ-Lite |vuur_draak|
_v3.1.0_ Translators
|Language |Translator |
|--------------|-------------------------|
|Dutch |DJj123dj#1706 |
|Romanian |Sanke#6086 |
|French |Sanke#6086 |
|Spanish |Redactado#1673 & josuens14#5267|
|German |david.#8276 |
|Italian |Maurizio#0268 |
|Czech |t0miiis#3022 |
|Arabic |ChilledBroke#9986 & M4#5882|
|Danish |the_gamer#5095 |
|Portuguese |QuirAddon#9778 |
|Russian |Apexo#0723 |
changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog) ## links
current version: _v3.2.2_
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
© 2022 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms) © 2023 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
+102
View File
@@ -0,0 +1,102 @@
const discord = require('discord.js')
const bot = require('../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const APIEvents = require("../core/api/modules/events")
const DISABLE = require("../core/api/api.json").disable
module.exports = () => {
bot.errorLog.log("debug","COMMANDS: loaded change.js")
if (!DISABLE.commands.text.change) client.on("messageCreate",msg => {
if (!msg.content.startsWith(config.prefix+"change")) return
if (!msg.guild) return
if (!permsChecker.command(msg.author.id,msg.guild.id)){
permsChecker.sendUserNoPerms(msg.author)
return
}
msg.channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
var newtype = msg.content.split(config.prefix+"change")[1].substring(1)
if (!newtype) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
const newTicket = require("../core/utils/configParser").getTicketById(newtype)
const list = []
config.options.forEach((o) => list.push(o.id))
if (!newTicket) return bot.errorLog.invalidIdChooseFromList(list)
/**@type {String} */
var chName = msg.channel.name
const splitted = chName.split("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await msg.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) msg.channel.setParent(parent)
}
msg.channel.setName(newTicket.channelprefix+name)
msg.channel.send({embeds:[bot.embeds.commands.changeEmbed(msg.author,newtype)]})
log("command","someone used the 'change' command",[{key:"user",value:msg.author.tag}])
log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
})
})
if (!DISABLE.commands.slash.change) client.on("interactionCreate",(interaction) => {
if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "change") return
if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user)
return
}
//interaction.deferReply()
interaction.channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
var newtype = interaction.options.getString("type",true)
if (!newtype) return interaction.reply({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
const newTicket = require("../core/utils/configParser").getTicketById(newtype,true)
const list = []
config.options.forEach((o) => list.push(o.id))
if (!newTicket) return bot.errorLog.invalidIdChooseFromList(list)
/**@type {String} */
var chName = interaction.channel.name
const splitted = chName.split("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await interaction.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent)
}
interaction.channel.setName(newTicket.channelprefix+name)
interaction.reply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]})
log("command","someone used the 'change' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
})
})
}
+1 -3
View File
@@ -19,9 +19,7 @@ module.exports = () => {
.setTitle("❔ "+l.helpMenu.title) .setTitle("❔ "+l.helpMenu.title)
const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2 const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2
helpEmbed.setDescription(header+"`"+prefix+msgName+" <id>` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename <name>` ➜ _"+l.helpMenu.renameCmd+"_\n`"+prefix+"close` ➜ _"+l.helpMenu.closeCmd+"_\n`"+prefix+"delete` ➜ _"+l.helpMenu.deleteCmd+"_\n`"+prefix+"reopen` ➜ _"+l.helpMenu.reopenCmd+"_\n\n`"+prefix+"add <user>` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove <user>` ➜ _"+l.helpMenu.removeCmd+"_") helpEmbed.setDescription(header+"`"+prefix+msgName+" <id>` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename <name>` ➜ _"+l.helpMenu.renameCmd+"_\n`"+prefix+"close` ➜ _"+l.helpMenu.closeCmd+"_\n`"+prefix+"delete` ➜ _"+l.helpMenu.deleteCmd+"_\n`"+prefix+"reopen` ➜ _"+l.helpMenu.reopenCmd+"_\n\n`"+prefix+"add <user>` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove <user>` ➜ _"+l.helpMenu.removeCmd+"_\n\n`"+prefix+"change <newtype>` ➜ _Change ticket type._")
if (config.credits) helpEmbed.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code",iconURL:"https://raw.githubusercontent.com/DJj123dj/open-ticket/main/logo.png"})
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
+11 -8
View File
@@ -6,7 +6,6 @@
"prefix":"!ticket ", "prefix":"!ticket ",
"languagefile":"english", "languagefile":"english",
"credits":true,
"status":{ "status":{
"enabled":true, "enabled":true,
"type":"PLAYING", "type":"PLAYING",
@@ -19,16 +18,16 @@
"enable_DM_Messages":true, "enable_DM_Messages":true,
"has@everyoneaccess":false, "has@everyoneaccess":false,
"member_role":"member role (doesn't have access to tickets)", "member_role":"member role (this role doesn't have access to tickets)",
"closeMode":"adminonly|normal", "closeMode":"adminonly or normal (select one of the 2)",
"enable_transcript":false, "transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!",
"enable_DM_transcript":false,
"transcript_channel":"channel id",
"showSlashcmdsInHelp":false "showSlashcmdsInHelp":false,
"answerInEphemeralOnOpen":true
}, },
"SUPPORT":"Take look at our wiki: https://docs.openticket.dj-dj.be or join our discord server: https://discord.dj-dj.be if you need support!",
"options":[ "options":[
{ {
"id":"general", "id":"general",
@@ -50,6 +49,10 @@
"enable":false, "enable":false,
"url":"https://www.example.com/catmemes/cat.png" "url":"https://www.example.com/catmemes/cat.png"
}, },
"image":{
"enable":false,
"url":"https://www.dj-dj.be/wp-content/uploads/2022/09/pfp-cropped.png"
},
"closedCategory":{ "closedCategory":{
"enable":false, "enable":false,
@@ -92,7 +95,7 @@
"dropdown":false, "dropdown":false,
"enableFooter":false, "enableFooter":false,
"footer":"Open Ticket v3.1.0 - I'm a footer!", "footer":"Open Ticket v3.2.2 - I'm a footer!",
"enableThumbnail":false, "enableThumbnail":false,
"thumbnail":"https://www.example.com/catmemes/cat.png", "thumbnail":"https://www.example.com/catmemes/cat.png",
+4 -2
View File
@@ -29,7 +29,8 @@
"remove":false, "remove":false,
"rename":false, "rename":false,
"claim":false, "claim":false,
"unclaim":false "unclaim":false,
"change":false
}, },
"slash":{ "slash":{
"help":false, "help":false,
@@ -42,7 +43,8 @@
"remove":false, "remove":false,
"rename":false, "rename":false,
"claim":false, "claim":false,
"unclaim":false "unclaim":false,
"change":false
} }
}, },
"checkerjs":{ "checkerjs":{
+93 -1
View File
@@ -17,6 +17,10 @@ const ticketReopenListeners = []
const ticketAddListeners = [] const ticketAddListeners = []
const ticketRemoveListeners = [] const ticketRemoveListeners = []
const ticketClaimListeners = []
const ticketUnclaimListeners = []
const ticketChangeListeners = []
const transcriptCreationListeners = [] const transcriptCreationListeners = []
const commandListeners = [] const commandListeners = []
@@ -146,6 +150,66 @@ exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => {
} }
/**
*
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/
exports.onTicketClaim = (user,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user claimed a ticket",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketClaimListeners.forEach((func) => {
try {
func(user,channel,guild,date,ticketdata)
}catch{}
})
}
/**
*
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/
exports.onTicketUnclaim = (user,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user unclaimed a ticket",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketUnclaimListeners.forEach((func) => {
try {
func(user,channel,guild,date,ticketdata)
}catch{}
})
}
/**
* @param {String} newtype
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/
exports.onTicketChange = (newtype,user,channel,guild,date,ticketdata) => {
//system
bot.errorLog.log("api","user changed ticket type",[{key:"newtype",value:newtype},{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
ticketChangeListeners.forEach((func) => {
try {
func(newtype,user,channel,guild,date,ticketdata)
}catch{}
})
}
/** /**
* *
* @param {discord.Message[]} messages * @param {discord.Message[]} messages
@@ -165,7 +229,7 @@ exports.onTranscriptCreation = (messages,channel,guild,date) => {
} }
/**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"} OTCommandType */ /**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"|"claim"|"unclaim"|"change"} OTCommandType */
/** /**
* *
@@ -269,6 +333,16 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/ */
/**
* @callback TicketTypeChangeEvent
* @param {String} newtype
* @param {discord.User} user
* @param {discord.TextChannel} channel
* @param {discord.Guild} guild
* @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/
/** /**
* @callback CommandEvent * @callback CommandEvent
* @param {OTCommandType} type * @param {OTCommandType} type
@@ -328,6 +402,21 @@ const onTicketRemove = (callback) => {
ticketRemoveListeners.push(callback) ticketRemoveListeners.push(callback)
} }
/**@param {TicketActionEvent} callback */
const onTicketClaim = (callback) => {
ticketClaimListeners.push(callback)
}
/**@param {TicketActionEvent} callback */
const onTicketUnclaim = (callback) => {
ticketUnclaimListeners.push(callback)
}
/**@param {TicketTypeChangeEvent} callback */
const onTicketChange = (callback) => {
ticketChangeListeners.push(callback)
}
/**@param {TranscriptCreationEvent} callback */ /**@param {TranscriptCreationEvent} callback */
const onTranscriptCreation = (callback) => { const onTranscriptCreation = (callback) => {
transcriptCreationListeners.push(callback) transcriptCreationListeners.push(callback)
@@ -355,6 +444,9 @@ exports.events = {
onTicketReopen, onTicketReopen,
onTicketAdd, onTicketAdd,
onTicketRemove, onTicketRemove,
onTicketClaim,
onTicketUnclaim,
onTicketChange,
onTranscriptCreation, onTranscriptCreation,
onCommand, onCommand,
onReactionRole, onReactionRole,
+1 -1
View File
@@ -33,5 +33,5 @@ module.exports = () => {
} }
}) })
log("info","loaded plugins",[{key:"success",value:successcount},{key:"error",value:failcount},{key:"total",value:totalcount}]) require("../startscreen").headerDataPlugins({total:totalcount,success:successcount,error:failcount})
} }
+49 -39
View File
@@ -5,7 +5,7 @@ exports.checker = async () => {
if (process.argv.some((v) => v == "--devconfig")){ if (process.argv.some((v) => v == "--devconfig")){
//console.log(chalk.blue("=> used dev config instead of normal config")) //console.log(chalk.blue("=> used dev config instead of normal config"))
try{ try{
var tempconfig = require("../devConfig.json") var tempconfig = require("../devconfig.json")
}catch(err){console.log(err);var tempconfig = require("../config.json")} }catch(err){console.log(err);var tempconfig = require("../config.json")}
}else{ }else{
var tempconfig = require("../config.json") var tempconfig = require("../config.json")
@@ -114,7 +114,7 @@ exports.checker = async () => {
}) })
} }
} }
/**@param {String} value @param {"string"|"boolean"|"number"} type */ /**@param {String} value @param {"string"|"boolean"|"number"|"array"|"object"} type */
const checkType = (value,type,path) => { const checkType = (value,type,path) => {
if (type == "boolean"){ if (type == "boolean"){
if (typeof value != "boolean"){ if (typeof value != "boolean"){
@@ -128,6 +128,14 @@ exports.checker = async () => {
if (typeof value != "string"){ if (typeof value != "string"){
createError("'"+path+"' | invalid type, this must be a string!") createError("'"+path+"' | invalid type, this must be a string!")
} }
}else if (type == "array"){
if (!Array.isArray(value)){
createError("'"+path+"' | invalid type, this must be an array!")
}
}else if (type == "object"){
if (typeof value != "object"){
createError("'"+path+"' | invalid type, this must be an object!")
}
} }
} }
@@ -197,6 +205,7 @@ exports.checker = async () => {
checkButtonColor(option.color,path+"/color") checkButtonColor(option.color,path+"/color")
//adminroles //adminroles
checkType(option.adminroles,"array",path+"/adminroles")
checkDiscordArray("roleid",option.adminroles,path+"/adminroles") checkDiscordArray("roleid",option.adminroles,path+"/adminroles")
//channelprefix //channelprefix
@@ -221,14 +230,30 @@ exports.checker = async () => {
checkType(option.ticketmessage,"string",path+"/ticketmessage") checkType(option.ticketmessage,"string",path+"/ticketmessage")
//thumbnail //thumbnail
checkType(option.thumbnail.enable,"boolean",path/"/thumbnail/enable") if (option.thumbnail){
checkType(option.thumbnail.url,"string",path/"/thumbnail/url") checkType(option.thumbnail.enable,"boolean",path+"/thumbnail/enable")
checkType(option.thumbnail.url,"string",path+"/thumbnail/url")
}else{
createError("'"+path+"/thumbnail' | there is no thumbnail object!")
}
//image
if (option.image){
checkType(option.image.enable,"boolean",path+"/image/enable")
checkType(option.image.url,"string",path+"/image/url")
}else{
createError("'"+path+"/image' | there is no image object!")
}
//closedCategory //closedCategory
checkType(option.closedCategory.enable,"boolean",path/"/closedCategory/enable") if (option.closedCategory){
checkType(option.closedCategory.id,"string",path/"/closedCategory/id") checkType(option.closedCategory.enable,"boolean",path/"/closedCategory/enable")
if (option.closedCategory.enable){ checkType(option.closedCategory.id,"string",path/"/closedCategory/id")
checkDiscord("roleid",option.closedCategory.id,path+"/closedCategory/id") if (option.closedCategory.enable){
checkDiscord("roleid",option.closedCategory.id,path+"/closedCategory/id")
}
}else{
createError("'"+path+"/closedCategory' | there is no closedCategory object!")
} }
}else if (type == "website"){ }else if (type == "website"){
@@ -368,7 +393,7 @@ exports.checker = async () => {
//--------------------------| //--------------------------|
//--------------------------| //--------------------------|
var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","credits","status","system","options","messages"] var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","status","system","options","messages"]
configArray.forEach((item) => { configArray.forEach((item) => {
if (config[item] == undefined){ if (config[item] == undefined){
throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json") throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json")
@@ -380,17 +405,17 @@ exports.checker = async () => {
if (!require("./api/api.json").disable.checkerjs.token) checkToken(config.auth_token) if (!require("./api/api.json").disable.checkerjs.token) checkToken(config.auth_token)
checkType(config.main_adminroles,"array","/main_adminroles")
checkDiscordArray("roleid",config.main_adminroles,"main_adminroles") checkDiscordArray("roleid",config.main_adminroles,"main_adminroles")
checkString(config.prefix,1,15,"prefix","prefix") checkString(config.prefix,1,15,"prefix","prefix")
//languagefile //languagefile
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")){ 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")){
createError("'languagefile' | invalid language, more info in the wiki") createError("'languagefile' | invalid language, more info in the wiki")
} }
checkType(config.credits,"boolean","credits")
//status: //status:
checkType(config.status.enabled,"boolean","status/enabled") checkType(config.status.enabled,"boolean","status/enabled")
if (config.status.enabled){ if (config.status.enabled){
@@ -405,30 +430,38 @@ exports.checker = async () => {
//system: //system:
//ticket channel
if (config.system.ticket_channel){ if (config.system.ticket_channel){
if (config.system.ticket_channel.length < 16 || config.system.ticket_channel.length > 20 || !/^\d+$/.test(config.system.ticket_channel)){ if (config.system.ticket_channel.length < 16 || config.system.ticket_channel.length > 20 || !/^\d+$/.test(config.system.ticket_channel)){
createError("'system/ticket_channel' | this channel id is invalid") createError("'system/ticket_channel' | this channel id is invalid")
} }
}else createWarn("'"+path+"' | you have no ticket channel selected!") }else createWarn("'"+path+"' | you have no ticket channel selected!")
//max tickets
checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets") checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets")
//enableDMmessages
checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages") checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages")
//has@everyoneaccess
checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess") checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess")
//member_role
checkType(config.system.member_role,"string","system/member_role")
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){ if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
checkDiscord("roleid",config.system.member_role,"system/member_role") checkDiscord("roleid",config.system.member_role,"system/member_role")
}else{ }else{
createWarn("'system/member_role' | You don't have a member role, but it's recommended!") createWarn("'system/member_role' | You don't have a member role, but it's recommended!")
} }
//closemode
checkType(config.system.closeMode,"string","system/closeMode") checkType(config.system.closeMode,"string","system/closeMode")
if (!["normal","adminonly"].includes(config.system.closeMode)){ if (!["normal","adminonly"].includes(config.system.closeMode)){
createError("'system/closeMode' | the close mode must be adminonly or normal") createError("'system/closeMode' | the close mode must be adminonly or normal")
} }
checkType(config.system.enable_transcript,"boolean","system/enable_transcript")
checkType(config.system.enable_DM_transcript,"boolean","system/enable_DM_transcript")
if (config.system.enable_transcript){
checkDiscord("channelid",config.system.transcript_channel,"system/transcript_channel")
}
checkType(config.system.showSlashcmdsInHelp,"boolean","system/showSlashcmdsInHelp") checkType(config.system.showSlashcmdsInHelp,"boolean","system/showSlashcmdsInHelp")
checkType(config.system.answerInEphemeralOnOpen,"boolean","system/answerInEphemeralOnOpen")
//options //options
@@ -442,29 +475,6 @@ exports.checker = async () => {
}) })
//discord check
/**
const discord = require("discord.js")
const {GatewayIntentBits,Partials} = discord
const client = new discord.Client({
intents:[
GatewayIntentBits.DirectMessages,
GatewayIntentBits.GuildInvites,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.Guilds,
GatewayIntentBits.MessageContent
],
partials:[Partials.Channel,Partials.Message]
})
await client.guilds.fetch()
if (!client.guilds.cache.find(g => g.id == config.server_id)){
createError("'server_id' | i'm not in a server with this id!")
}
*/
//the end //the end
if (errorList.length > 0 || warnList.length > 0){ if (errorList.length > 0 || warnList.length > 0){
console.log("REPORT:\n===========================") console.log("REPORT:\n===========================")
+15 -5
View File
@@ -25,16 +25,26 @@ exports.closeCommandRow = new arb()
) )
.addComponents( .addComponents(
new button() new button()
.setCustomId("OTsendTranscript") .setCustomId("OTreopenTicket")
.setDisabled(false) .setDisabled(false)
.setStyle(bs.Secondary) .setStyle(bs.Success)
.setLabel(l.buttons.sendTranscript) .setLabel(l.buttons.reopen)
.setEmoji("📄") .setEmoji("✔")
)
exports.closeCommandRowDisabled = new arb()
.addComponents(
new button()
.setCustomId("OTdeleteTicket1")
.setDisabled(true)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
) )
.addComponents( .addComponents(
new button() new button()
.setCustomId("OTreopenTicket") .setCustomId("OTreopenTicket")
.setDisabled(false) .setDisabled(true)
.setStyle(bs.Success) .setStyle(bs.Success)
.setLabel(l.buttons.reopen) .setLabel(l.buttons.reopen)
.setEmoji("✔") .setEmoji("✔")
+7 -17
View File
@@ -117,23 +117,13 @@ exports.renameEmbed = (renamer,newname) => {
/** /**
* *
* @param {Boolean} done * @param {discord.User} changer
* @param {discord.TextChannel} channel * @param {String} newtype
* @param {discord.User} author
* @returns {discord.EmbedBuilder} * @returns {discord.EmbedBuilder}
*/ */
exports.sendTranscriptEmbed = (done,channel,author) => { exports.changeEmbed = (changer,newtype) => {
if (done){ return new embed()
return new embed() .setTitle("🔄 "+l.commands.changeTitle.replace("{0}",newtype))
.setTitle("📄 "+l.messages.hereIsTheTranscript) .setColor(mc)
.setColor(mc) .setFooter({text:changer.tag,iconURL:changer.displayAvatarURL()})
.setDescription("Ticket: "+channel.name)
.setFooter({text:author.tag,iconURL:author.displayAvatarURL()})
}else{
return new embed()
.setTitle("📄 "+l.messages.hereIsTheTranscript)
.setColor(mc)
.setDescription("Loading...")
.setFooter({text:author.tag,iconURL:author.displayAvatarURL()})
}
} }
@@ -50,8 +50,8 @@ module.exports = () => {
} }
}) })
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]}) await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker = false deleteTicketButtonChecker = false
}) })
@@ -90,8 +90,10 @@ module.exports = () => {
} }
}) })
interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) await interaction.message.edit({components:[bot.buttons.close.closeCommandRowDisabled]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"deletenotranscript",false,true) await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker1 = false deleteTicketButtonChecker1 = false
}) })
} }
@@ -1,6 +1,5 @@
module.exports = () => { module.exports = () => {
require("./firstmsg")() require("./firstmsg")()
require("./sendTranscript")()
require("./verifyBars")() require("./verifyBars")()
//accepted //accepted
@@ -1,46 +0,0 @@
const discord = require('discord.js')
const bot = require('../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
client.on("interactionCreate",async (interaction) => {
if (!interaction.isButton()) return
if (interaction.customId != "OTsendTranscript") return
try {
interaction.deferUpdate()
} catch{}
const tsmsg = await interaction.channel.send({embeds:[bot.embeds.commands.sendTranscriptEmbed(false,interaction.channel,interaction.user)]})
const channelmessages = await interaction.channel.messages.fetch()
channelmessages.sweep((msgSweep) => {
return msgSweep.author.id == client.user.id
})
var fileattachment = await require("../../transcript").createTranscript(channelmessages,interaction.channel)
if (fileattachment == false){
log("system","internal error: transcript is not created!")
tsmsg.edit({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrongTranscript)]})
return
}
try {
tsmsg.edit({embeds:[bot.embeds.commands.sendTranscriptEmbed(true,interaction.channel,interaction.user)],files:[fileattachment]})
}catch{}
})
}
+6 -14
View File
@@ -1,33 +1,25 @@
const index = require("../index") const index = require("../index")
if (index.developerConfig){ if (index.developerConfig){
var config = require("../devConfig.json") var config = require("../devconfig.json")
}else{var config = require("../config.json")} }else{var config = require("../config.json")}
var localLanguage = require("../language/english.json") var localLanguage = require("../language/english.json")
if (config.languagefile.startsWith("custom")) localLanguage = require("../language/custom.json") const fs = require("fs")
else if (config.languagefile.startsWith("dutch")) localLanguage = require("../language/dutch.json") const lfexists = fs.existsSync("./language/"+config.languagefile+".json")
else if (config.languagefile.startsWith("english")) localLanguage = require("../language/english.json") if (lfexists) localLanguage = require("../language/"+config.languagefile+".json")
else if (config.languagefile.startsWith("german")) localLanguage = require("../language/german.json")
else if (config.languagefile.startsWith("french")) localLanguage = require("../language/french.json")
else if (config.languagefile.startsWith("romanian")) localLanguage = require("../language/romanian.json")
else if (config.languagefile.startsWith("arabic")) localLanguage = require("../language/arabic.json")
else if (config.languagefile.startsWith("spanish")) localLanguage = require("../language/spanish.json")
else if (config.languagefile.startsWith("portuguese")) localLanguage = require("../language/portuguese.json")
else if (config.languagefile.startsWith("italian")) localLanguage = require("../language/italian.json")
const errorLog = async () => { const errorLog = async () => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
console.log(chalk.red("Something went wrong when loading the language!")+"\nCheck the config file or create a ticket in our server!") require("./startscreen").headerDataLanguage("Something went wrong when loading the language!",true)
} }
const successLog = async (language) => { const successLog = async (language) => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
console.log(chalk.green("loaded language "+language+"...")) require("./startscreen").headerDataLanguage("sucessfully loaded language "+language,false)
} }
if (!localLanguage){ if (!localLanguage){
+7
View File
@@ -0,0 +1,7 @@
██████╗ ██████╗ ███████╗███╗ ██╗ ████████╗██╗ ██████╗██╗ ██╗███████╗████████╗
██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ╚══██╔══╝██║██╔════╝██║ ██╔╝██╔════╝╚══██╔══╝
██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ ██║██║ █████╔╝ █████╗ ██║
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
-1
View File
@@ -8,7 +8,6 @@ const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType const acot = discord.ApplicationCommandOptionType
module.exports = async () => { module.exports = async () => {
bot.errorLog.log("info","auto-updating slash commands...")
const sid = config.server_id const sid = config.server_id
const ids = configParser.getTicketValuesArray("id") const ids = configParser.getTicketValuesArray("id")
+21 -2
View File
@@ -32,8 +32,8 @@ module.exports = async () => {
//process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)") //process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)")
setInterval(() => { setInterval(() => {
process.stdout.cursorTo(0) process.stdout.cursorTo(0)
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 12")+" commands ready! (this can take up to 40 seconds)") process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 13")+" commands ready! (this can take up to 40 seconds)")
if (readystats >= 12){ if (readystats >= 13){
const fs = require("fs") const fs = require("fs")
fs.writeFileSync("./storage/slashcmdEnabled.txt","true") fs.writeFileSync("./storage/slashcmdEnabled.txt","true")
console.log(chalk.green("\nready!")) console.log(chalk.green("\nready!"))
@@ -245,4 +245,23 @@ module.exports = async () => {
readystats++ readystats++
}) })
//category
client.application.commands.create({
name:"change",
description:"Change ticket type.",
defaultPermission:true,
type:act.ChatInput,
options:[
{
type:acot.String,
name:"type",
description:"The new ticket type.",
required:true,
choices:choices
}
]
},sid).then(() => {
readystats++
})
} }
+75
View File
@@ -0,0 +1,75 @@
const discord = require('discord.js')
const bot = require('../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const logo = require("fs").readFileSync("./core/logo.txt").toString()
/**@param {import('chalk').ChalkInstance} chalk */
const showFlags = async (chalk) => {
var isFlag = false
if (process.argv.some((v) => v == "--devconfig")) console.log(chalk.blue("[FLAGS] => used dev config instead of normal config")); isFlag = true
if (process.argv.some((v) => v == "--nochecker")) console.log(chalk.blue("[FLAGS] => disabled checker.js")); isFlag = true
if (process.argv.some((v) => v == "--tsoffline")) console.log(chalk.blue("[FLAGS] => offline check for html transcripts disabled!")); isFlag = true
if (process.argv.some((v) => v == "--debug")) console.log(chalk.blue("[FLAGS] => enabled DEBUG mode")); isFlag = true
if (!isFlag) console.log(chalk.blue("no flags!"))
}
exports.run = async () => {
const chalk = await (await import("chalk")).default
console.log(chalk.hex("f8ba00")(logo))
const version = require("../package.json").version
var headertext = "v"+version+" - Support: https://discord.dj-dj.be - Language: "+config.languagefile
const spaceamount = (84-headertext.length)/2
var i = 0
while (i < spaceamount){
headertext = " "+headertext
i++
}
console.log(chalk.bold(headertext+"\n"))
console.log(chalk.bold(chalk.underline("FLAGS:")))
showFlags(chalk)
}
/**
* @param {import('chalk').ChalkInstance} chalk
* @param {{type:String,text:String,enabled:Boolean}} status
* @param {Boolean} updatingslash
* @param {Boolean} slashmode
*
*/
exports.headerDataReady = (chalk,status,updatingslash,slashmode) => {
console.log("\n"+chalk.bold(chalk.underline("STARTUP INFO:")))
if (status.enabled) console.log(chalk.hex("f8ba00")("status: ")+chalk.bold(status.type.toLowerCase())+" "+status.text)
if (slashmode){
console.log("\n\n"+chalk.red(chalk.underline("STARTING IN SLASH CMD CONFIGURATION MODE!")))
return
}
console.log(chalk.hex("f8ba00")("updating slash cmds: ")+chalk.bold(slashmode))
}
var languageMSG = ""
var languageErr = false
/**
* @param {String} message
* @param {Boolean} err
*/
exports.headerDataLanguage = async (message,err) => {
languageMSG = message
languageErr = err
}
/**
* @param {{total:Number,error:Number,success:Number}} plugins
*/
exports.headerDataPlugins = async (plugins) => {
const chalk = await (await import("chalk")).default
const lmsg = languageErr ? chalk.red(languageMSG) : languageMSG
console.log(chalk.hex("f8ba00")("language: ")+lmsg)
console.log(chalk.hex("f8ba00")("plugins loaded: ")+chalk.bold(plugins.total+" total ")+"("+plugins.success+"✅ "+plugins.error+"❌)")
console.log("\n"+chalk.bold(chalk.underline("LOGS:")))
}
+40 -109
View File
@@ -49,7 +49,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
var enableTranscript = true var enableTranscript = true
var deleteRequired = false var deleteRequired = false
if (mode == "delete"){ if (mode == "delete" || mode == "deletenotranscript"){
//delete //delete
//check perms //check perms
if (!guild) return if (!guild) return
@@ -88,12 +88,6 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
if (!id) return false if (!id) return false
try{
if (config.system.enable_DM_Messages){
member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
}) })
}else if (mode == "close"){ }else if (mode == "close"){
@@ -140,10 +134,21 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
} }
}) })
//ticketinfo error
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 => { await channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false 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(firstmsg.embeds[0].description) const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.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)
@@ -196,14 +201,6 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
.setLabel(l.buttons.delete) .setLabel(l.buttons.delete)
.setEmoji("✖️") .setEmoji("✖️")
) )
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTsendTranscript")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.sendTranscript)
.setEmoji("📄")
)
.addComponents( .addComponents(
new discord.ButtonBuilder() new discord.ButtonBuilder()
.setCustomId("OTreopenTicket") .setCustomId("OTreopenTicket")
@@ -237,117 +234,51 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
if (!id) return false if (!id) return false
try{
if (config.system.enable_DM_Messages){
member.send({embeds:[bot.errorLog.custom(l.messages.closedTicketDmTitle,l.messages.closedTicketDmDescription+"\n\n**reason:** "+newReason,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
}) })
}else if (mode == "deletenotranscript"){ }
//delete with no transcript
//check perms
if (!guild) return
if (!permsChecker.command(user.id,guild.id)){
permsChecker.sendUserNoPerms(user)
return
}
//start delete proccess /**
enableTranscript = false *
deleteRequired = true * @param {discord.TextChannel} channel
if (!nomessage){ * @param {Number} limit
await channel.send({content:"**"+l.messages.gettingdeleted+"**"}) * @returns
} */
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) const getmessages = async (channel,limit) => {
const final = []
var lastId = ""
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) while (true) {
const options = {limit:100}
if (lastId) options.before = lastId
//getID & send DM & send api event const messages = await channel.messages.fetch(options)
await channel.messages.fetchPinned().then(msglist => { messages.forEach(msg => {final.push(msg)})
var firstmsg = msglist.last() lastId = messages.last().id
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").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData}) if (messages.size != 100 || final >= limit) {
break
const id = hiddendata.data.find(d => d.key == "openerid").value
if (!id) return false
try{
if (config.system.enable_DM_Messages){
member.send({embeds:[bot.errorLog.custom(l.messages.deletedTicketDmTitle,l.messages.deletedTicketDmDescription,":ticket:",config.main_color)]})
}
} }
catch{log("system","can't send DM to member, member doesn't allow dm's")} }
}) return final
} }
const transcriptHandler = async () => { const transcriptHandler = async () => {
if (enableTranscript == true && mode != "deletenotranscript"){ if (!bot.tsconfig.sendTranscripts.enableChannel && !bot.tsconfig.sendTranscripts.enableDM) return false
//transcript messages
const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** "+l.messages.none
const closedByPrefix = (mode.startsWith("delete")) ? l.messages.deletedby : l.messages.closedby
if (config.system.enable_transcript || config.system.enable_DM_transcript){ const APIEvents = require("../api/modules/events")
const channelmessages = await channel.messages.fetch({cache:true}) const messages = await getmessages(channel,5000)
//remove ot bot from transcript await require("../transcriptSystem/manager")(messages,guild,channel,user,reason)
channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id}) APIEvents.onTranscriptCreation(messages,channel,guild,new Date())
var fileattachment = await require("../transcript").createTranscript(channelmessages,channel)
if (fileattachment == false){log("system","internal error: transcript is not created!");return}
}
if (config.system.enable_transcript && !require("../api/api.json").disable.transcripts.server){
const transcriptEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle("📄 "+l.messages.newTranscriptTitle)
.setDescription(transcriptReason)
.setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
guild.channels.cache.find(c => c.id == config.system.transcript_channel).send({
embeds:[transcriptEmbed],
files:[fileattachment]
})
}
if (config.system.enable_DM_transcript && !require("../api/api.json").disable.transcripts.dm){
const transcriptEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle("📄 "+l.messages.newTranscriptTitle)
.setDescription(transcriptReason)
.setFooter({text:closedByPrefix+": "+user.tag+" | ticket: "+channelname,iconURL:user.displayAvatarURL()})
if (!isDatabaseError) ticketOpener.send({
embeds:[transcriptEmbed],
files:[fileattachment]
})
}
}
} }
const deleteHandler = async () => { const deleteHandler = async () => {
if (deleteRequired){ if (deleteRequired){
//const timer = () => {return new Promise((resolve,reject) => {
// setTimeout(() => {resolve(true)},7000)
//})}
//await timer()
pendingDelete.shift() pendingDelete.shift()
await channel.delete() await channel.delete()
//setTimeout(async () => {
// pendingDelete.shift()
// await channel.delete()
//},6000)
} }
} }
await transcriptHandler() if (mode == "delete" || mode == "deletenotranscript") await transcriptHandler()
deleteHandler() deleteHandler()
} }
+28 -16
View File
@@ -53,10 +53,10 @@ module.exports = () => {
if (interaction.isButton()){ if (interaction.isButton()){
try { try {
interaction.deferUpdate() if (config.system.answerInEphemeralOnOpen) interaction.deferReply({ephemeral:true})
} catch{} } catch{}
}else if (interaction.isChatInputCommand()){ }else if (interaction.isChatInputCommand()){
interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]}) interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
}else if (interaction.isStringSelectMenu()){ }else if (interaction.isStringSelectMenu()){
try { try {
interaction.deferUpdate() interaction.deferUpdate()
@@ -65,14 +65,6 @@ module.exports = () => {
if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){ if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){
try{
if (config.system.enable_DM_Messages){
interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.main_color)]})
}
}
catch{log("system","can't send DM to member, member doesn't allow dm's")}
//update storage //update storage
storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1) storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1)
var ticketNumber = interaction.member.user.username var ticketNumber = interaction.member.user.username
@@ -156,12 +148,13 @@ module.exports = () => {
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){ if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
try { try {
const userrole = guild.roles.cache.find(r => r.id == config.system.member_role) const userrole = guild.roles.cache.find(r => r.id == config.system.member_role)
if (!userrole) return if (userrole){
permissionsArray.push({ permissionsArray.push({
id:userrole, id:userrole,
type:"role", type:"role",
deny:[pfb.ViewChannel] deny:[pfb.ViewChannel]
}) })
}
}catch{ }catch{
log("system","invalid role! At 'config.json => system/member_role") log("system","invalid role! At 'config.json => system/member_role")
} }
@@ -192,6 +185,7 @@ module.exports = () => {
} }
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)
ticketChannel.send({ ticketChannel.send({
content:"<@"+interaction.member.id+"> @here", content:"<@"+interaction.member.id+"> @here",
@@ -204,6 +198,24 @@ module.exports = () => {
log("system","created new ticket",[{key:"ticket",value:ticketName},{key:"user",value:interaction.user.tag}]) log("system","created new ticket",[{key:"ticket",value:ticketName},{key:"user",value:interaction.user.tag}])
require("../api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions}) require("../api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions})
const channelbutton = new discord.ActionRowBuilder()
.addComponents([
new discord.ButtonBuilder()
.setStyle(discord.ButtonStyle.Link)
.setDisabled(false)
.setEmoji("🎫")
.setLabel("go to ticket")
.setURL(ticketChannel.url)
])
try{
if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.main_color)],components:[channelbutton]})
}
catch{log("system","failed to send DM")}
if ((interaction.isButton() && config.system.answerInEphemeralOnOpen) || interaction.isChatInputCommand()) interaction.editReply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)],components:[channelbutton]})
}) })
}else{ }else{
try { try {
-75
View File
@@ -1,75 +0,0 @@
const discord = require('discord.js')
const bot = require('../index')
const client = bot.client
const config = bot.config
const l = bot.language
/** @param {discord.TextBasedChannel} channel @returns {Promise<{ticketname:String,ticketopener:{discordjsuser:discord.User,name:String,id:String}>} */
const getUserInfo = (channel) => {
return new Promise((promiseresolve,reject) => {
//getID
var result = {
ticketopener:{
discordjsuser:"",
id:"/",
name:"/"
},
ticketname:"/"
}
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")
const id = hiddendata.data.find(d => d.key == "openerid").value
result.ticketopener.id = id
const ticketopener = client.users.cache.find(u => u.id == id)
const name = ticketopener.tag
const channelname = channel.name
promiseresolve({ticketname:channelname,ticketopener:{discordjsuser:ticketopener,name:name,id:id}})
})
})
}
/**
*
* @param {discord.Message[]} messagecollection
* @param {discord.Channel} channel
* @returns new `discord.attachmentBuilder`
*/
exports.createTranscript = async (messagecollection,channel) => {
const ticketuserdata = await getUserInfo(channel)
require("./api/modules/events").onTranscriptCreation(messagecollection,channel,channel.guild,new Date())
try {
const cd = new Date()
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
const dateString = cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getHours()+":"+cd.getMinutes()+":"+cd.getSeconds()
const filearray = ["open ticket transcript:\ntranscript creation: "+dateString+"\nticket name: "+ticketuserdata.ticketname+"\nticket opener: "+ticketuserdata.ticketopener.name,"\nTRANSCRIPT START:"]
messagecollection.reverse()
messagecollection.forEach((msg) => {
const timestamp = new Date(msg.createdTimestamp)
if (msg.content){var content = msg.content}else{var content = "*empty message*"}
const msgstats = "files: "+msg.attachments.size+", embeds: "+msg.embeds.length
filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+", "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+"|"+msg.author.tag+"] ["+msgstats+"]\n"+content+"\n")
})
if (filearray.length < 2) filearray.push("transcript is empty")
const filestring = filearray.join("\n")
const filebuff = Buffer.from(filestring,"utf-8")
return new discord.AttachmentBuilder(filebuff,{name:"transcript_"+ticketuserdata.ticketname+".txt",description:"An Open Ticket transcript"})
}catch(err){
console.log("[error] "+err)
return false
}
}
@@ -0,0 +1,119 @@
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
/**@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 */
/**
*
* @param {discord.Guild} guild
* @param {discord.Channel} channel
* @param {discord.User} user
* @param {discord.Message[]} messagesInv
* @param {OThtsDataOption} data
*/
exports.compile = (guild,channel,user,messagesInv,data) => {
const messages = messagesInv.reverse()
var invisibleMessages = 0
const rawfiles = messages.filter((m) => Array.from(m.attachments).length > 0)
var fileAmount = 0
rawfiles.forEach((msg) => {
fileAmount = fileAmount + Array.from(msg.attachments).length
})
const messagesArray = []
messages.forEach((msg) => {
if (msg.content || msg.embeds.length > 0 || msg.attachments.toJSON().length > 0){
const embedArray = []
const fileArray = []
msg.attachments.forEach((file) => {
fileArray.push({
name:file.name,
type:file.contentType,
size:file.size.toString()+" bytes",
url:file.url
})
})
msg.embeds.forEach((embed) => {
if (embed.description){
var desc = bot.hiddenData.removeHiddenData(embed.description).description
}else{var desc = false}
embedArray.push({
title:embed.title || false,
description:desc,
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)
})
})
messagesArray.push({
author:{
name:msg.author.tag,
id:Number(msg.author.id),
color:msg.member.displayHexColor || "#ffffff",
pfp:msg.author.displayAvatarURL()
},
content:msg.content || "",
timestamp:msg.createdTimestamp,
embeds:embedArray,
files:fileArray
})
}else {invisibleMessages++}
})
const result = {
version,otversion,
style:{
backgroundData:data.style.backgroundData || "",
backgroundModus:data.style.backgroundModus || "",
enableCustomBackground:data.style.enableCustomBackground || false,
titleColor:data.style.titleColor || "#F8BA00"
},
bot:{
name:data.bot.name || "Open Ticket",
id:Number(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:Number(channel.id),
guildname:guild.name,
guildid:Number(guild.id),
creatorname:data.ticket.creatorname,
creatorid:Number(data.ticket.creatorid),
closedbyname:user.tag,
closedbyid:Number(user.id),
closedtime:data.ticket.closedtime,
openedtime:data.ticket.openedtime,
messages:Array.from(messages).length-invisibleMessages,
files:fileAmount
},
messages:messagesArray
}
return result
}
@@ -0,0 +1,29 @@
const axios = require("axios").default
const discord = require('discord.js')
const bot = require("../../../index")
const tsconfig = bot.tsconfig
const tsembeds = require("../embeds")
const tsdb = require("../tsdb")
/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */
/**
* @param {Object} json
* @returns {Promise<OTuploadResponse|false>}
*/
exports.upload = async (json) => {
return new Promise(async (resolve,reject) => {
const data = encodeURIComponent(JSON.stringify(json))
try {
const res = await axios.get("https://api.transcripts.dj-dj.be/upload?auth=openticketTRANSCRIPT1234&version=1.0.0&data="+data)
if (res.status != 200) resolve(false)
resolve(res.data)
}catch{
console.log("failed transcript upload!")
resolve(false)
}
})
}
@@ -0,0 +1,67 @@
{
"version":"1.0.0",
"otversion":"3.2.2",
"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"
}
]
}
]
}
+78
View File
@@ -0,0 +1,78 @@
const discord = require('discord.js')
const bot = require('../../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const storage = bot.storage
const tsconfig = bot.tsconfig
/**
*
* @param {String} name
* @param {String} id
* @param {Number} rawprocesstime milliseconds
* @param {discord.User} user
*/
exports.beingprocessed = (name,id,rawprocesstime,user) => {
const newtime = rawprocesstime
const processtime = "<t:"+newtime.getTime().toString().substring(0,newtime.getTime().toString().length-3)+":R>"
const embed = new discord.EmbedBuilder()
.setTitle("🧾 "+l.transcripts.title)
.setColor(config.main_color)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setFooter({text:name})
.setDescription("`"+l.transcripts.processed+"...`\n"+l.transcripts.wait+"\n\n"+l.transcripts.estimated+": "+processtime)
return embed
}
/**
*
* @param {String} name
* @param {String} id
* @param {String} url
* @param {discord.User} user
*/
exports.tsready = (name,id,url,user) => {
const embed = new discord.EmbedBuilder()
.setTitle("🧾 "+l.transcripts.title)
.setColor(config.main_color)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setFooter({text:name})
if (url){
embed.setURL(url)
embed.setDescription("\n["+l.transcripts.available+"]("+url+")\n")
}else{
embed.setDescription("\n"+l.transcripts.available+"\n")
}
return embed
}
/**
*
* @param {String} name
* @param {String} id
* @param {discord.User} user
* @param {undefined|String} err
*/
exports.tserror = (name,id,user,err) => {
const embed = new discord.EmbedBuilder()
.setTitle("❌ "+l.transcripts.title)
.setColor(discord.Colors.Red)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setFooter({text:name})
const errDesc = (typeof err == "string") ? "\n"+err : ""
embed.setDescription("Something went wrong while creating the HTML transcript.\n\n[possible reasons](https://docs.openticket.dj-dj.be/the-system/transcripts/transcript-errors)"+errDesc)
return embed
}
+3
View File
@@ -0,0 +1,3 @@
{
"version":"1.0.0"
}
+152
View File
@@ -0,0 +1,152 @@
const discord = require('discord.js')
const bot = require('../../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const storage = bot.storage
const tsconfig = bot.tsconfig
const tsembeds = require("./embeds")
const tsdb = require("./tsdb")
const checkAvailability = async () => {
if (process.argv.some((v) => v == "--tsoffline")) return true
const axios = require("axios").default
const res = await axios.get("https://transcripts.dj-dj.be/status.txt")
if (!res || !(res.status == 200) || !res.data) return false
if ((res.data == "online") || (res.data == "1") || (res.data == "true")) return true
else return false
}
/**
*
* @param {discord.Message[]} messages
* @param {discord.Guild} guild
* @param {discord.TextChannel} channel
* @param {discord.User} user
* @param {String|false} reason
*/
module.exports = async (messages,guild,channel,user,reason) => {
require("../api/modules/events").onTranscriptCreation(messages,channel,guild,new Date())
const msglist = await channel.messages.fetchPinned()
const chName = channel.name
const chId = channel.id
/**@param {discord.Collection<string, discord.Message<true>>} msglist*/
const asyncmanager = async (msglist) => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type")
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)
if (tsconfig.sendTranscripts.useHTMLtranscripts){
const JSONDATA = require("./communication/compileJson").compile(guild,channel,user,messages,{
style:{
titleColor:tsconfig.style.titleColor,
enableCustomBackground:tsconfig.style.background.enableCustomBackground,
backgroundModus:tsconfig.style.background.backgroundModus,
backgroundData:tsconfig.style.background.backgroundData
},
bot:{
name:client.user.username,
id:client.user.id,
pfp:client.user.displayAvatarURL()
},
ticket:{
creatorid:ticketopener.id,
creatorname:ticketopener.tag,
openedtime:opentime.getTime(),
closedtime:new Date().getTime()
}
})
if (!await checkAvailability()){
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
const errembed = tsembeds.tserror(chName,chId,user)
if (tsconfig.sendTranscripts.enableChannel){
/**@type {discord.TextChannel|undefined} */
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
if (!tc) return
tc.send({embeds:[errembed],files:[attachment]})
}
return
}
const TSdata = await require("./communication/index").upload(JSONDATA)
if (!TSdata) return false
if (TSdata.status == "success"){
const url = "https://transcripts.dj-dj.be/t/"+TSdata.time+"_"+TSdata.id+".html"
//calculate estimated time
const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime())
const dumpLoopTime = 15000
const nextDump = new Date(lastDumpTime+dumpLoopTime)
const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow
const finaltime = new Date(nextDump.getTime()+processtime)
const duration = finaltime.getTime()-new Date().getTime()
//waiting
if (tsconfig.sendTranscripts.enableChannel){
/**@type {discord.TextChannel|undefined} */
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
if (!tc) return
const embed = tsembeds.beingprocessed(chName,chId,finaltime,user)
var msg = await tc.send({embeds:[embed]})
}else {var msg = false}
//ready
setTimeout(() => {
if (msg){
msg.edit({embeds:[tsembeds.tsready(chName,chId,url,user)]})
}
if (tsconfig.sendTranscripts.enableDM){
if (!user) return
const embed = tsembeds.tsready(chName,chId,url,user)
try {
ticketopener.send({embeds:[embed]})
}catch{}
}
},duration)
}else{
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
const errembed = tsembeds.tserror(chName,chId,user,"`error type: transcript API error`")
if (tsconfig.sendTranscripts.enableChannel){
/**@type {discord.TextChannel|undefined} */
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
if (!tc) return
tc.send({embeds:[errembed],files:[attachment]})
}
}
}else{
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
const embed = tsembeds.tsready(chName,chId,false,user)
if (tsconfig.sendTranscripts.enableChannel){
/**@type {discord.TextChannel|undefined} */
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
if (!tc) return
tc.send({embeds:[embed],files:[attachment]})
}
}
}
asyncmanager(msglist)
}
+47
View File
@@ -0,0 +1,47 @@
const discord = require('discord.js')
const bot = require('../../index')
const client = bot.client
const config = bot.config
const l = bot.language
/**
*
* @param {discord.Message[]} messagecollection
* @param {discord.TextChannel} channel
* @param {Boolean} backup
* @returns new `discord.attachmentBuilder`
*/
exports.createTranscript = async (messagecollection,channel,backup) => {
try {
const cd = new Date()
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
const dateString = cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getHours()+":"+cd.getMinutes()+":"+cd.getSeconds()
let backuptitle = backup ? "BACKUP " : ""
let backupfilename = backup ? "backup" : ""
const filearray = [backuptitle+"TRANSCRIPT:\n"]
messagecollection.reverse()
messagecollection.forEach((msg) => {
const timestamp = new Date(msg.createdTimestamp)
if (msg.content){var content = msg.content}else{var content = "*empty message*"}
const fileurls = []
const rawfiles = Array.from(msg.attachments)
rawfiles.forEach((file) => {
fileurls.push("attachment: "+file[1].url)
})
const filestring = fileurls.length > 0 ? fileurls.join("\n")+"\n" : ""
const msgstats = "files: "+msg.attachments.size+", embeds: "+msg.embeds.length
filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+", "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+"|"+msg.author.tag+"] ["+msgstats+"]\n"+content+"\n"+filestring)
})
if (filearray.length < 2) filearray.push("transcript is empty")
const filestring = filearray.join("\n")
const filebuff = Buffer.from(filestring,"utf-8")
return new discord.AttachmentBuilder(filebuff,{name:backupfilename+"transcript.txt",description:"Open Ticket transcript"})
}catch{
return false
}
}
+71
View File
@@ -0,0 +1,71 @@
const fs = require("fs")
const location = "./storage/tsdatabase.json"
/**@returns {[{category:String, key:String, value:String}]}*/
function getData(){
if (fs.existsSync(location)){
return JSON.parse(fs.readFileSync(location).toString())
}else{
fs.writeFileSync(location,"[]")
return []
}
}
/**@param {[{category:String, key:String, value:String}]} data*/
function setData(data){
fs.writeFileSync(location,JSON.stringify(data,null,"\t"))
}
exports.set = (category,key,value) => {
const currentData = getData()
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
var newData = []
if (exists){
currentData.forEach((d,i) => {
if (d.category == category && d.key == key){
newData.push({category,key,value})
}else{
newData.push(d)
}
})
}else{
currentData.push({category,key,value})
newData = currentData
}
setData(newData)
return exists
}
/**
* @param {String} category
* @param {String} key
* @returns {String|false}
*/
exports.get = (category,key) => {
const currentData = getData()
const tempresult = currentData.find((d) => (d.category == category) && (d.key == key))
const result = tempresult ? tempresult.value : false
return result
}
/**
* @param {String} category
* @param {String} key
* @param {String} value
*/
exports.delete = (category,key) => {
const currentData = getData()
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
var newData = []
if (exists){
currentData.forEach((d,i) => {
if (!(d.category == category && d.key == key)){
newData.push(d)
}
})
}else{
newData = currentData
}
setData(newData)
return exists
}
+5 -4
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[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}}} OTTicketOptions */ /**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: "red"|"green"|"blue"|"gray",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}}} 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 */
@@ -18,8 +18,11 @@ const l = bot.language
//OTConfigMessage //OTConfigMessage
/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/ /**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/
//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}}} OTAllOptions */
//StringOptions //StringOptions
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"closedCategory"} OTTicketStringOptions */ /**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"image"|"closedCategory"} OTTicketStringOptions */
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"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 */
@@ -168,8 +171,6 @@ this.websiteType = {}
this.messageType = {} this.messageType = {}
//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}, url:String, closedCategory:{enable:Boolean,id:String}}} OTAllOptions */
/** /**
* *
+5 -2
View File
@@ -35,7 +35,10 @@ exports.createEmbed = (id) => {
const embed = new discord.EmbedBuilder() const embed = new discord.EmbedBuilder()
.setTitle(data.name) .setTitle(data.name)
if (data.enableFooter) embed.setFooter({text:data.footer}) if (data.enableFooter) embed.setFooter({text:data.footer})
if (data.enableThumbnail) embed.setThumbnail(data.thumbnail)
try {
if (data.enableThumbnail) embed.setThumbnail(data.thumbnail)
}catch{bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!")}
if (data.enableCustomColor){ if (data.enableCustomColor){
embed.setColor(data.color) embed.setColor(data.color)
@@ -43,7 +46,7 @@ exports.createEmbed = (id) => {
embed.setColor(config.main_color) embed.setColor(config.main_color)
} }
if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL) if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL.url)
var description = data.description var description = data.description
if (data.other.enableTicketExplaination){ if (data.other.enableTicketExplaination){
+58 -72
View File
@@ -1,13 +1,46 @@
// __________ __________ ___________ ____ ____ /**
// / ____ \ / ______ \ / | | \ | | ____ _____ ______ _ _ _______ _____ _____ _ ________ _______
// | / \ | | | | | | |_______| | \ | | / __ \| __ \| ____| \ | | |__ __|_ _/ ____| |/ / ____|__ __|
// | | | | | |____| | | | | |\ \ | | | | | | |__) | |__ | \| | | | | || | | ' /| |__ | |
// | | | | | ________/ | |______ | | \ \ | | | | | | ___/| __| | . ` | | | | || | | < | __| | |
// | | | | | | | _____| | | \ \ | | | |__| | | | |____| |\ | | | _| || |____| . \| |____ | |
// | | | | | | | | | | \ \ | | \____/|_| |______|_| \_| |_| |_____\_____|_|\_\______| |_|
// | | | | | | | |________ | | \ \| |
// | \____/ | | | | | | | \ | Hey! we are looking for you!
// \__________/ |__| \__________| |__| \___| Do you speak a language that isn't yet in our /languages directory
or do you speak one that isn't up-to-date? Open Ticket needs
translators for lots of different languages!
Feel free to join our translator team and help us improve Open Ticket!
SUGGESTING NEW FEATURES:
=====================
Open Ticket is a community project. This means that
almost all feature ideas come from our community.
Are you missing something you want in open ticket?
Then join our Discord server and we will add it (if possible)
Did you know that 80% of all features in OT were ideas from our community?
INFORMATION:
============
Open Ticket v3.2.2 - © DJdj Development
discord: https://discord.dj-dj.be
website: https://www.dj-dj.be
github: https://openticket.dj-dj.be
support e-mail: support@dj-dj.be
Config files:
./config.json
./transcriptconfig.json
Send ./openticketdebug.txt when there are errors!
*/
const discord = require("discord.js") const discord = require("discord.js")
const fs = require('fs') const fs = require('fs')
@@ -39,29 +72,13 @@ var tempconfig = require("./config.json")
var isDevConfig = false var isDevConfig = false
if (process.argv.some((v) => v == "--devconfig")){ if (process.argv.some((v) => v == "--devconfig")){
async function logFLAGS(){
const chalk = await (await import("chalk")).default
console.log(chalk.blue("[FLAGS] => used dev config instead of normal config"))
}; logFLAGS()
isDevConfig = true isDevConfig = true
try{ try{
tempconfig = require("./devConfig.json") tempconfig = require("./devconfig.json")
}catch{tempconfig = require("./config.json")} }catch{tempconfig = require("./config.json")}
}else{ }else{
tempconfig = require("./config.json") tempconfig = require("./config.json")
} }
if (process.argv.some((v) => v == "--nochecker")){
async function logFLAGS(){
const chalk = await (await import("chalk")).default
console.log(chalk.blue("[FLAGS] => disabled checker.js"))
}; logFLAGS()
}
if (process.argv.some((v) => v == "--debug")){
async function logFLAGS(){
const chalk = await (await import("chalk")).default
console.log(chalk.blue("[FLAGS] => enabled DEBUG mode"))
}; logFLAGS()
}
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded flags") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded flags")
exports.developerConfig = isDevConfig exports.developerConfig = isDevConfig
@@ -69,8 +86,13 @@ const language = require("./core/languageManager").language
exports.language = language exports.language = language
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language")
const config = tempconfig const config = tempconfig
exports.config = config exports.config = config
const tsconfig = isDevConfig ? require("./devtsconfig.json") : require("./transcriptconfig.json")
exports.tsconfig = tsconfig
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config")
exports.storage = require('./core/dynamicdatabase/storage') exports.storage = require('./core/dynamicdatabase/storage')
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage")
@@ -107,74 +129,37 @@ client.on('ready',async () => {
} }
client.user.setActivity(text,{type:getTypeEnum(type)}) client.user.setActivity(text,{type:getTypeEnum(type)})
statusSet = true statusSet = true
log("system","loaded status",[{key:"type",value:type},{key:"text",value:text}])
} }
this.errorLog.log("debug","bot status loaded") this.errorLog.log("debug","bot status loaded")
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
if (!process.argv[2]){ require("./core/startscreen").run()
console.log(chalk.red("WELCOME TO OPEN TICKET!")) if (!process.argv[2] || (process.argv[2] && !process.argv[2].startsWith("slash"))){
this.errorLog.log("debug","loaded console interface") this.errorLog.log("debug","loaded console interface")
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}])
require("./core/utils/liveStatus")() require("./core/utils/liveStatus")()
console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){ if (config.status.enabled){
setStatus(config.status.type,config.status.text) setStatus(config.status.type,config.status.text)
} }
var updatingSlash = false
if (fs.existsSync("./storage/slashcmdEnabled.txt")){ if (fs.existsSync("./storage/slashcmdEnabled.txt")){
/**@type {"true"|"false"} */ /**@type {"true"|"false"} */
const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString() const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString()
if (data === "true"){require("./core/slashSystem/autoSlashUpdate")()} if (data === "true"){require("./core/slashSystem/autoSlashUpdate")(); updatingSlash = true}
}else{fs.writeFileSync("./storage/slashcmdEnabled.txt","false")} }else{fs.writeFileSync("./storage/slashcmdEnabled.txt","false")}
log("system","bot logged in!")
try {
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
}catch{
this.errorLog.log("info","tried to cache user information, failed!")
}
return
}
if (process.argv[2] == "d"){
if (config.status.enabled){
setStatus(config.status.type,config.status.text)
}
}
if (!process.argv[2].startsWith("slash")){
console.log(chalk.red("WELCOME TO OPEN TICKET!"))
this.errorLog.log("debug","loaded console interface")
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}])
require("./core/utils/liveStatus")()
console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){
setStatus(config.status.type,config.status.text)
}
if (fs.existsSync("./storage/slashcmdEnabled.txt")){
/**@type {"true"|"false"} */
const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString()
if (data === "true"){require("./core/slashSystem/autoSlashUpdate")()}
}else{fs.writeFileSync("./storage/slashcmdEnabled.txt","false")}
log("system","bot logged in!")
try { try {
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
}catch{ }catch{
this.errorLog.log("info","tried to cache user information, failed!") this.errorLog.log("info","tried to cache user information, failed!")
} }
require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,false)
}else{ }else{
console.log(chalk.red("STARTING IN ")+chalk.blue("SLASH MODE")+chalk.red("...")) require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,true)
this.errorLog.log("debug","slashmode activated") this.errorLog.log("debug","slashmode activated")
console.log("logs:\n================")
console.log("client logged in...")
console.log("loading files...")
if (process.argv[3] == "enable"){ if (process.argv[3] == "enable"){
console.log(chalk.green("switching to slashEnable.js")) console.log(chalk.green("switching to slashEnable.js"))
require("./core/slashSystem/slashEnable")() require("./core/slashSystem/slashEnable")()
@@ -182,7 +167,7 @@ client.on('ready',async () => {
console.log(chalk.green("switching to slashDisable.js")) console.log(chalk.green("switching to slashDisable.js"))
require("./core/slashSystem/slashDisable")() require("./core/slashSystem/slashDisable")()
}else{ }else{
console.log(chalk.red("[SLASH CMD MANAGER]: unknown slash mode!")) console.log(chalk.bgRed("[SLASH CMD MANAGER]: unknown slash command action!"))
process.exit(1) process.exit(1)
} }
} }
@@ -211,6 +196,7 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){
require("./commands/reopen")() require("./commands/reopen")()
require("./commands/claim")() require("./commands/claim")()
require("./commands/unclaim")() require("./commands/unclaim")()
require("./commands/change")()
this.errorLog.log("debug","LOADING CORE") this.errorLog.log("debug","LOADING CORE")
//core //core
+10 -6
View File
@@ -15,8 +15,7 @@
"anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!", "anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!",
"maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!", "maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!",
"maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!", "maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!",
"somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!", "somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!"
"somethingWentWrongTranscript": "هناك خطاً في محاولة طبع التكت!**\nأعد المحاولة لاحقاً!"
}, },
"commands": { "commands": {
"userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!", "userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!",
@@ -27,6 +26,7 @@
"reopenTitle": "إعادة فتح التكت!", "reopenTitle": "إعادة فتح التكت!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!", "ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!",
"maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_" "maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_"
@@ -48,7 +48,6 @@
"close": "إغلاق التكت", "close": "إغلاق التكت",
"delete": "حذف التكت", "delete": "حذف التكت",
"reopen": "إعادة فتح التكت", "reopen": "إعادة فتح التكت",
"sendTranscript": "طبع التكت",
"closeWithReason":"close with reason" "closeWithReason":"close with reason"
}, },
"messages": { "messages": {
@@ -66,8 +65,6 @@
"deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!", "deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!",
"reopenTicketDmTitle": "تم إعادة فتح تذكرتك!", "reopenTicketDmTitle": "تم إعادة فتح تذكرتك!",
"reopenTicketDmDescription": "تم إعادة فتح التكت!", "reopenTicketDmDescription": "تم إعادة فتح التكت!",
"newTranscriptTitle": "توجد نسخة تكت جديدة هنا!",
"hereIsTheTranscript": "هذا هي النسخة:",
"chooseCategory": "أختر الكتقاجوري:", "chooseCategory": "أختر الكتقاجوري:",
"gettingdeleted": "يتم حذف التكت...", "gettingdeleted": "يتم حذف التكت...",
@@ -79,5 +76,12 @@
"closedby":"closed by", "closedby":"closed by",
"modalreason":"What is the reason for closing this ticket?", "modalreason":"What is the reason for closing this ticket?",
"chooseATicket": "Choose a ticket" "chooseATicket": "Choose a ticket"
} },
"transcripts":{
"title":"Transcript",
"processed":"This transcript is being processed",
"wait":"Please wait!",
"estimated":"Estimated time",
"available":"The transcript is available here"
}
} }
+9 -5
View File
@@ -15,8 +15,7 @@
"anotherOption":"This option is not a ticket but another type!", "anotherOption":"This option is not a ticket but another type!",
"maxAmountTitle":"Max amount reached!", "maxAmountTitle":"Max amount reached!",
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!", "maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!", "somethingWentWrong":"**Something went wrong!**\nPlease try again another time!"
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Added {0} to this ticket!", "userAddedTitle":"Added {0} to this ticket!",
@@ -27,6 +26,7 @@
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Re-Opened this ticket!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"ticketWarning":"The embed is in the message below!", "ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
@@ -48,7 +48,6 @@
"close":"Close Ticket", "close":"Close Ticket",
"delete":"Delete Ticket", "delete":"Delete Ticket",
"reopen":"Re-Open Ticket", "reopen":"Re-Open Ticket",
"sendTranscript":"Transcript",
"closeWithReason":"close with reason" "closeWithReason":"close with reason"
}, },
"messages":{ "messages":{
@@ -66,8 +65,6 @@
"deletedTicketDmDescription":"Your ticket is deleted!", "deletedTicketDmDescription":"Your ticket is deleted!",
"reopenTicketDmTitle":"Ticket Re-opened!", "reopenTicketDmTitle":"Ticket Re-opened!",
"reopenTicketDmDescription":"Your ticket is re-opened!", "reopenTicketDmDescription":"Your ticket is re-opened!",
"newTranscriptTitle":"A new transcript is here!",
"hereIsTheTranscript":"Here is the transcript:",
"chooseCategory":"choose a category:", "chooseCategory":"choose a category:",
"gettingdeleted":"Ticket is getting deleted...", "gettingdeleted":"Ticket is getting deleted...",
@@ -79,5 +76,12 @@
"closedby":"closed by", "closedby":"closed by",
"modalreason":"What is the reason for closing this ticket?", "modalreason":"What is the reason for closing this ticket?",
"chooseATicket": "Choose a ticket" "chooseATicket": "Choose a ticket"
},
"transcripts":{
"title":"Transcript",
"processed":"This transcript is being processed",
"wait":"Please wait!",
"estimated":"Estimated time",
"available":"The transcript is available here"
} }
} }
+64 -60
View File
@@ -1,83 +1,87 @@
{ {
"errors":{ "errors":{
"missingArgsTitle":"Neplatné argumenty", "missingArgsTitle":"Neplatny Argument!",
"missingArgsDescription":"Chybí argumenty", "missingArgsDescription":"Chybí Argument",
"noPermsTitle":"Nemáš práva!", "noPermsTitle":"Nemáš práva!",
"noPermsDescription":"Nemáš dostatečné práva na tento příkaz!\n Potřebuješ ADMINISTRATOR aby jsi mohl provést příkaz!", "noPermsDescription":"Potřebujes `ADMINISTRATOR`roli nebo byt v listině povolenych roli!",
"noPermsDelete":"Pouze admin může smazat ticket!", "noPermsDelete":"Pouze Admini muůřou mazat ticket!",
"chooseFromListTitle":"Neplatné ID", "chooseFromListTitle":"Neplatný ID",
"chooseFromListDescription":"Vyber si z těchto ID:", "chooseFromListDescription":"Vyber si jedno z ID níže:",
"boterror":"Error!", "boterror":"Bot Chyba!",
"notInTicketTitle":"Nejsi v ticketu!", "notInTicketTitle":"Nejsi v ticketu!",
"notInTicketDescription":"Tento příkaz nefunguje mimo tickety!", "notInTicketDescription":"Tenhle příkaz nefunguje mimo ticket!",
"ticketDoesntExist":"Tento ticket už bohužel neexistuje!", "ticketDoesntExist":"Tenhle ticket už neexistuje !",
"roleDoesntExist":"Tato role bohužel neexistuje!", "roleDoesntExist":"Tenhle role už neexistuje!",
"anotherOption":"Tato možnost není ticket ale něco jiného!", "anotherOption":"This option is not a ticket but another type!",
"maxAmountTitle":"Maximální počet ticketů dosažen!", "maxAmountTitle":"Max počet byl dosáhnut!",
"maxAmountDescription":"Dosáhl jsi maximálního povoleného počtu ticketů!\n Nemůžeš si vytvořit nový!", "maxAmountDescription":"Dosáhl jsi max počet povolených ticketu!\nSo nemůžeš si vytvořit nový!",
"somethingWentWrong":"**Něco je špatně**\nProsím zkus to příště znovu!", "somethingWentWrong":"**Něco se pokazilo!**\nProsím zkus to jindy!"
"somethingWentWrongTranscript":"Něco je špatně s transcriptem!**\nProsím zkus to příště znovu!"
}, },
"commands":{ "commands":{
"userAddedTitle":"{0} byl přidán do ticketu!", "userAddedTitle":"Přidat {0} do tohohle ticketu!",
"userRemovedTitle":"{0} byl odebrám z ticketu!", "userRemovedTitle":"Odstranit {0} z tohohle ticketu!",
"renameTitle":"Jméno bylo změněno!", "renameTitle":"Změnit jmeno na {0}!",
"closeTitle":"Zavři tento ticket!", "closeTitle":"Zavři tenhle ticket!",
"deleteTitle":"Smaž tento ticket!", "deleteTitle":"Mažu ticket...",
"reopenTitle":"Znovu otevři ticket!", "reopenTitle":"Znovu otevíram ticket",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"Nyní jsi převzal ticket {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"Tento ticketu už je převzatý!",
"changeTitle":"Změnil jsi typ ticketu na {0}!",
"ticketWarning":"The embed is in the message below!", "ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Varovaní:** _Můžeš si vytvořit použe {0} ticket(s) v jednu chvíli!_" "maxTicketWarning":"**Warning:** _Můžeš vytvořit pouze {0} v tuhle chvíli!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Příkazy:", "title":"Dostupné příkazy:",
"header1":"**Běž {0} vytvořit si ticket!**\n\n", "header1":"**Běž do {0} pro vytvoření ticketi!**\n\n",
"header2":"**Použij příkaz `/new` nebo `/ticket` k vytvoření ticketu!**\n\n", "header2":"**Použíj příkaz `/nový` nebo `/ticket` pro vytvoření ticketu**\n\n",
"msgCmd":"Vytvoř možnost otevírat tickety přes tlačítko. (ADMIN)", "msgCmd":"Vytvoř embed s tlačíky. (admins only)",
"renameCmd":"Přejmenovat ticket. (Žádné mezery)", "renameCmd":"Přejmenovat ticket. (no spaces)",
"closeCmd":"Zavři ticket.", "closeCmd":"Zavřít ticket.",
"deleteCmd":"Smaž ticket.", "deleteCmd":"Odstranit ticket.",
"addCmd":"Přidej člena do ticketu.", "addCmd":"Pridat uživatele do ticketu.",
"removeCmd":"Odebere člena z ticketu.", "removeCmd":"Odebrat uživatele z ticketu.",
"reopenCmd":"Znovu otevři ticket po uzavření." "reopenCmd":"Re-Open a ticket after it was closed."
}, },
"buttons":{ "buttons":{
"close":"Zavři ticket", "close":"Zavřit ticket",
"delete":"Smaž ticket", "delete":"Vymazat ticket",
"reopen":"Znovu otevři ticket", "reopen":"Znovu otevřít ticket",
"sendTranscript":"Odešli log ticketu", "closeWithReason":"zavřít s důvodem"
"closeWithReason":"close with reason"
}, },
"messages":{ "messages":{
"reopenTitle":"Ticket znovu otevřen!", "reopenTitle":"Znovu otevřit ticket!",
"reopenDescription":"Cítím se skvěle že si můžeme zase povídat!", "reopenDescription":"Klidně napiš znova!",
"closedTitle":"Zavřený ticket!", "closedTitle":"Zavřít tenhle ticket!",
"closedDescription":"Pouze admin team zde může nyní komunikovat!\n\n*Klikni na tlačítko níže pro smazání nebo znovu otevření ticketu!*", "closedDescription":"Pouze admini muzou zde psát ted!\n\n*Klikni na tlačítko níže pro smazání nebo pro znovu otevření tohohle ticketu!*",
"createdTitle":"Ticket vytvořen!", "createdTitle":"Ticket otevřen!",
"createdDescription":"Váš tiket je vytvořen, můžete ho zjistit pomocí pingu!", "createdDescription":"Tvůj ticket je vytvořem, můžeš si ho všimnout pomocí pingu!",
"newTicketDmTitle":"Nový ticket!", "newTicketDmTitle":"Nový ticket!",
"closedTicketDmTitle":"Ticket uzavřen!", "closedTicketDmTitle":"Ticket Zavřený!",
"deletedTicketDmTitle":"Ticket smazán!", "deletedTicketDmTitle":"Ticket Odstranen!",
"closedTicketDmDescription":"Tvůj ticket byl uzavřen!", "closedTicketDmDescription":"Tvuj ticket je uzavřen!",
"deletedTicketDmDescription":"Tvůj ticket byl smazán!", "deletedTicketDmDescription":"Tvuj ticket byl smazan!",
"reopenTicketDmTitle":"Ticket znovu otevřen!", "reopenTicketDmTitle":"Ticket je znovu otevřený!",
"reopenTicketDmDescription":"Tvůj ticket byl znovu otevřen!", "reopenTicketDmDescription":"Tvuj ticket byl znovu ovetřený!",
"newTranscriptTitle":"Nový log ticketu je zde!",
"hereIsTheTranscript":"Zde je log:",
"chooseCategory":"Vyber kategorii:", "chooseCategory":"Vyber si kategorii:",
"gettingdeleted":"Ticket bude smazán", "gettingdeleted":"Ticket bude vymazan...",
"none":"nic", "none":"žádný",
"reason":"důvod", "reason":"důvod",
"deletedby":"deleted by", "deletedby":"smazano uzivatelem",
"closedby":"closed by", "closedby":"zavreno uzivatelem",
"modalreason":"What is the reason for closing this ticket?", "modalreason":"Jakž byl důvod k zavření toho ticketu?",
"chooseATicket": "Choose a ticket" "chooseATicket": "Vyber ticket"
},
"transcripts":{
"title":"Přepis",
"processed":"Tento přepis se zpracoval",
"wait":"Prosím počkej!",
"estimated":"Odhadovaný čas",
"available":"Záloha je uložena zde!"
} }
} }
+87
View File
@@ -0,0 +1,87 @@
{
"errors": {
"missingArgsTitle": "Ugyldigt Argument!",
"missingArgsDescription": "Manglende Argument",
"noPermsTitle": "Ikke tilladelse!",
"noPermsDescription": "Du skal have tilladelsen `ADMINISTRATOR` eller være på listen over tilladte roller!",
"noPermsDelete": "Kun administratorer kan slette en ticket!",
"chooseFromListTitle": "Ugyldigt ID",
"chooseFromListDescription": "Vælg et af id'erne nedenfor:",
"boterror": "Bot Fejl!",
"notInTicketTitle": "Du er ikke i en ticket!",
"notInTicketDescription": "Denne kommando virker ikke udenfor tickets!",
"ticketDoesntExist": "Denne ticket findes ikke længere!",
"roleDoesntExist": "Denne rolle eksisterer ikke længere!",
"anotherOption": "Denne mulighed er ikke en ticket, men en anden type!",
"maxAmountTitle": "Maks. mængde opnået!",
"maxAmountDescription": "Du har nået det maksimale antal tilladte tickets!\nSå du kan ikke oprette en ny!",
"somethingWentWrong": "**Noget gik galt!**\nPrøv venligst igen en anden gang!"
},
"commands": {
"userAddedTitle": "Føjede {0} til denne ticket!",
"userRemovedTitle": "Fjernede {0} fra denne ticket!",
"renameTitle": "Ændrede navnet til {0}!",
"closeTitle": "Lukket denne ticket!",
"deleteTitle": "Sletter denne ticket...",
"reopenTitle": "Genåbnede denne ticket!",
"claimTitle": "Denne ticket er nu krævet til {0}",
"unclaimTitle": "Der gøres ikke krav på denne ticket længere!",
"changeTitle": "Ændrede ticket type til {0}!",
"ticketWarning": "Embedet er i meddelelsen nedenfor!",
"maxTicketWarning": "**Warning:** _Du kan kun oprette {0} ticket(s) ad gangen!_"
},
"helpMenu": {
"title": "Tilgængelige kommandoer:",
"header1": "**Gå til {0} for at oprette en ticket!**\n\n",
"header2": "**Kør kommandoen `/new` eller `/ticket` for at oprette en billet!**\n\n",
"msgCmd": "Lav et embed med buttons. (kun administratorer)",
"renameCmd": "Omdøb en ticket. (Ingen Mellemrum!!)",
"closeCmd": "Luk en ticket.",
"deleteCmd": "Slet en ticket.",
"addCmd": "Tilføj en bruger til ticketen.",
"removeCmd": "Fjern en bruger fra ticketen.",
"reopenCmd": "Genåbn en ticket, efter at den var lukket."
},
"buttons": {
"close": "Luk Ticket",
"delete": "Slet Ticket",
"reopen": "Genåben Ticket",
"closeWithReason": "Luk med grundlag"
},
"messages": {
"reopenTitle": "Genåbnede denne ticket!",
"reopenDescription": "Snak gerne igen!",
"closedTitle": "Lukket denne ticket!",
"closedDescription": "Kun administratorer kan tale i denne billet nu!\n\n*Klik på knappen nedenfor for at slette eller genåbne denne billet!",
"createdTitle": "Ticket Oprettet!",
"createdDescription": "Din ticket er oprettet, du kan registrere den ved et ping!",
"newTicketDmTitle": "Nt Ticket!",
"closedTicketDmTitle": "Ticket Lukket!",
"deletedTicketDmTitle": "Ticket Slettet!",
"closedTicketDmDescription": "Din ticket er lukket!",
"deletedTicketDmDescription": "Din ticket er slettet!",
"reopenTicketDmTitle": "Ticket Genåbnet!",
"reopenTicketDmDescription": "Din ticket er genåbnet!",
"chooseCategory": "vælg en kategori:",
"gettingdeleted": "Ticketen bliver slettet...",
"none": "intet",
"reason": "grundlag",
"deletedby": "slettet af",
"closedby": "lukket af",
"modalreason": "Hvad er grunden til at lukke denne ticket?",
"chooseATicket": "Vælg en ticket"
},
"transcripts": {
"title": "Transcript",
"processed": "Dette transcript er under behandling",
"wait": "Vent venligst!",
"estimated": "Estimeret tid",
"available": "Transcriptet er tilgængelig her"
}
}
+11 -7
View File
@@ -15,8 +15,7 @@
"anotherOption":"Deze optie is niet een ticket, maar een ander type!", "anotherOption":"Deze optie is niet een ticket, maar een ander type!",
"maxAmountTitle":"Maximum numer bereikt!", "maxAmountTitle":"Maximum numer bereikt!",
"maxAmountDescription":"Je hebt het maximum aantal openstaande tickets bereikt!\nDus je kan geen nieuwe meer maken!", "maxAmountDescription":"Je hebt het maximum aantal openstaande tickets bereikt!\nDus je kan geen nieuwe meer maken!",
"somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!", "somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!"
"somethingWentWrongTranscript":"Iets ging fout terwijl het transcript gemaakt werd!**\nProbeer een andere keer opnieuw!"
}, },
"commands":{ "commands":{
"userAddedTitle":"{0} is toegevoegd aan dit ticket!", "userAddedTitle":"{0} is toegevoegd aan dit ticket!",
@@ -25,8 +24,9 @@
"closeTitle":"Ticket gesloten!", "closeTitle":"Ticket gesloten!",
"deleteTitle":"Ticket aan het verwijderen...", "deleteTitle":"Ticket aan het verwijderen...",
"reopenTitle":"Ticket heropend!", "reopenTitle":"Ticket heropend!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"Dit ticket is geclaimed door {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"Dit ticket is niet meer geclaimed!",
"changeTitle":"Ticket type veranderd naar {0}!",
"ticketWarning":"De embed is in het bericht hier onder!", "ticketWarning":"De embed is in het bericht hier onder!",
"maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd maken!_" "maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd maken!_"
@@ -48,7 +48,6 @@
"close":"Sluit Ticket", "close":"Sluit Ticket",
"delete":"Verwijder Ticket", "delete":"Verwijder Ticket",
"reopen":"Heropen Ticket", "reopen":"Heropen Ticket",
"sendTranscript":"Transcript",
"closeWithReason":"sluit met reden" "closeWithReason":"sluit met reden"
}, },
"messages":{ "messages":{
@@ -66,8 +65,6 @@
"deletedTicketDmDescription":"Je ticket is verwijderd!", "deletedTicketDmDescription":"Je ticket is verwijderd!",
"reopenTicketDmTitle":"Ticket Heropend!", "reopenTicketDmTitle":"Ticket Heropend!",
"reopenTicketDmDescription":"Je ticket is heropend!", "reopenTicketDmDescription":"Je ticket is heropend!",
"newTranscriptTitle":"Er is een nieuw transcript!",
"hereIsTheTranscript":"Hier is het transcript:",
"chooseCategory":"kies een categorie:", "chooseCategory":"kies een categorie:",
"gettingdeleted":"Ticket wordt verwijderd...", "gettingdeleted":"Ticket wordt verwijderd...",
@@ -79,5 +76,12 @@
"closedby":"gesloten door", "closedby":"gesloten door",
"modalreason":"Wat is de reden om dit ticket te sluiten?", "modalreason":"Wat is de reden om dit ticket te sluiten?",
"chooseATicket": "Kies een ticket" "chooseATicket": "Kies een ticket"
},
"transcripts":{
"title":"Transcript",
"processed":"Dit transcript wordt verwerkt",
"wait":"Gelieve te wachten!",
"estimated":"Geschatte tijd",
"available":"Het transcript is hier beschikbaar"
} }
} }
+9 -5
View File
@@ -15,8 +15,7 @@
"anotherOption":"This option is not a ticket but another type!", "anotherOption":"This option is not a ticket but another type!",
"maxAmountTitle":"Max amount reached!", "maxAmountTitle":"Max amount reached!",
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!", "maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!", "somethingWentWrong":"**Something went wrong!**\nPlease try again another time!"
"somethingWentWrongTranscript":"Something went wrong while making the transcript!**\nPlease try again another time!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Added {0} to this ticket!", "userAddedTitle":"Added {0} to this ticket!",
@@ -27,6 +26,7 @@
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Re-Opened this ticket!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"ticketWarning":"The embed is in the message below!", "ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" "maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
@@ -48,7 +48,6 @@
"close":"Close Ticket", "close":"Close Ticket",
"delete":"Delete Ticket", "delete":"Delete Ticket",
"reopen":"Re-Open Ticket", "reopen":"Re-Open Ticket",
"sendTranscript":"Transcript",
"closeWithReason":"close with reason" "closeWithReason":"close with reason"
}, },
"messages":{ "messages":{
@@ -66,8 +65,6 @@
"deletedTicketDmDescription":"Your ticket is deleted!", "deletedTicketDmDescription":"Your ticket is deleted!",
"reopenTicketDmTitle":"Ticket Re-opened!", "reopenTicketDmTitle":"Ticket Re-opened!",
"reopenTicketDmDescription":"Your ticket is re-opened!", "reopenTicketDmDescription":"Your ticket is re-opened!",
"newTranscriptTitle":"A new transcript is here!",
"hereIsTheTranscript":"Here is the transcript:",
"chooseCategory":"choose a category:", "chooseCategory":"choose a category:",
"gettingdeleted":"Ticket is getting deleted...", "gettingdeleted":"Ticket is getting deleted...",
@@ -79,5 +76,12 @@
"closedby":"closed by", "closedby":"closed by",
"modalreason":"What is the reason for closing this ticket?", "modalreason":"What is the reason for closing this ticket?",
"chooseATicket": "Choose a ticket" "chooseATicket": "Choose a ticket"
},
"transcripts":{
"title":"Transcript",
"processed":"This transcript is being processed",
"wait":"Please wait!",
"estimated":"Estimated time",
"available":"The transcript is available here"
} }
} }
+9 -5
View File
@@ -15,8 +15,7 @@
"anotherOption":"Cette option n'est pas un ticket mais un autre type!", "anotherOption":"Cette option n'est pas un ticket mais un autre type!",
"maxAmountTitle":"Montant maximum atteint!", "maxAmountTitle":"Montant maximum atteint!",
"maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés!\nVous ne pouvez donc pas en créer un nouveau!", "maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés!\nVous ne pouvez donc pas en créer un nouveau!",
"somethingWentWrong":"**Quelque chose s'est mal passé!**\nVeuillez réessayer une autre fois!", "somethingWentWrong":"**Quelque chose s'est mal passé!**\nVeuillez réessayer une autre fois!"
"somethingWentWrongTranscript":"Une erreur s'est produite lors de la création de la transcription!**\nVeuillez réessayer une autre fois!"
}, },
"commands":{ "commands":{
"userAddedTitle":"{0} a été ajouté à ce ticket!", "userAddedTitle":"{0} a été ajouté à ce ticket!",
@@ -27,6 +26,7 @@
"reopenTitle":"A rouvert ce ticket!", "reopenTitle":"A rouvert ce ticket!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"ticketWarning":"L'intégration est dans le message ci-dessous!", "ticketWarning":"L'intégration est dans le message ci-dessous!",
"maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_" "maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_"
@@ -48,7 +48,6 @@
"close":"Fermer le ticket", "close":"Fermer le ticket",
"delete":"Supprimer le billet", "delete":"Supprimer le billet",
"reopen":"Billet de réouverture", "reopen":"Billet de réouverture",
"sendTranscript":"Transcript",
"closeWithReason":"fermer avec une raison" "closeWithReason":"fermer avec une raison"
}, },
"messages":{ "messages":{
@@ -66,8 +65,6 @@
"deletedTicketDmDescription":"Votre billet est supprimé !", "deletedTicketDmDescription":"Votre billet est supprimé !",
"reopenTicketDmTitle":"Billet rouvert!", "reopenTicketDmTitle":"Billet rouvert!",
"reopenTicketDmDescription":"Votre billet est rouvert !", "reopenTicketDmDescription":"Votre billet est rouvert !",
"newTranscriptTitle":"Une nouvelle transcription est ici!",
"hereIsTheTranscript":"Voici la transcription :",
"chooseCategory":"choisissez une catégorie:", "chooseCategory":"choisissez une catégorie:",
"gettingdeleted":"Le ticket est en cours de suppression...", "gettingdeleted":"Le ticket est en cours de suppression...",
@@ -79,5 +76,12 @@
"closedby":"fermé par", "closedby":"fermé par",
"modalreason":"Qu’elle est la raison pour fermer ce ticket?", "modalreason":"Qu’elle est la raison pour fermer ce ticket?",
"chooseATicket": "Choisir un ticket" "chooseATicket": "Choisir un ticket"
},
"transcripts":{
"title":"Transcript",
"processed":"Cette transcript est en cours de traitement",
"wait":"S'il vous plait, attendez...",
"estimated":"Temps estime:",
"available":"La transcript est disponible ici"
} }
} }
+24 -23
View File
@@ -3,35 +3,30 @@
"missingArgsTitle":"Ungültiges Argument!", "missingArgsTitle":"Ungültiges Argument!",
"missingArgsDescription":"Fehlendes Argument!", "missingArgsDescription":"Fehlendes Argument!",
"noPermsTitle":"Du hast keine Rechte!", "noPermsTitle":"Du hast keine Rechte!",
"noPermsDescription":"Sie haben nicht die richtigen Rollen, um diesen Befehl auszuführen!\nSie benötigen die `ADMINISTRATOR` Erlaubnis oder in der Liste der erlaubten Rollen sein!", "noPermsDescription":"Du benötigst die `ADMINISTRATOR` Rechte oder die erlaubte Rolle",
"noPermsDelete":"Nur Administratoren können ein Ticket löschen!",
"chooseFromListTitle":"Ungültige ID", "chooseFromListTitle":"Ungültige ID",
"chooseFromListDescription":"Wählen Sie eine der folgenden ID:", "chooseFromListDescription":"Wählen Sie eine der folgenden ID's:",
"boterror":"Bot Fehler!", "boterror":"Bot Fehler!",
"notInTicketTitle":"Du bist ein kein Ticket!", "notInTicketTitle":"Du bist in keinem Ticket!",
"notInTicketDescription":"Der Befehl funktioniert nicht außerhalb eines Tickets!", "notInTicketDescription":"Der Befehl funktioniert außerhalb eines Tickets nicht!",
"ticketDoesntExist":"Das Ticket Exisitert nicht mehr!", "ticketDoesntExist":"Das Ticket exisitert nicht mehr!",
"roleDoesntExist":"Die Rolle Exisitiert nicht mehr!", "roleDoesntExist":"Die Rolle exisitiert nicht mehr!",
"anotherOption":"Diese Option ist kein Ticket, sondern eine andere Art!", "anotherOption":"Diese Option ist kein Ticket, sondern eine andere Art!",
"maxAmountTitle":"Das Limit wurde erreicht!", "maxAmountTitle":"Das Limit wurde erreicht!",
"maxAmountDescription":"Sie haben die maximal zulässige Anzahl von Tickets erreicht!\nSie können also keine neue erstellen.!", "maxAmountDescription":"Sie haben die maximal zulässige Anzahl von Tickets erreicht!\nSie können also keine neuen erstellen.!",
"somethingWentWrong":"Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!", "somethingWentWrong":"**Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!"
"somethingWentWrongTranscript":"Bei der Erstellung der Transcript ist etwas schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!"
}, },
"commands":{ "commands":{
"userAddedTitle":"User geaddet!", "userAddedTitle":"User geaddet!",
"userAddedDescription":"{0} wird zu diesem Ticket hinzugefügt!",
"userRemovedTitle":"User entfernt!", "userRemovedTitle":"User entfernt!",
"userRemovedDescription":"{0} wird aus diesem Ticket entfernt!",
"renameTitle":"Der Name wurde geändert!", "renameTitle":"Der Name wurde geändert!",
"renameWarning":"Achtung: Sie können den Kanalnamen nur 2 Mal pro Minute ändern!\n(dies ist auf die Begrenzung der Diskordrate zurückzuführen)",
"closeTitle":"Dieses Ticket schließen!", "closeTitle":"Dieses Ticket schließen!",
"closeDescription":"Sie können dieses Ticket schließen, indem Sie auf die Schaltfläche unten klicken!",
"deleteTitle":"Löschen Sie dieses Ticket!", "deleteTitle":"Löschen Sie dieses Ticket!",
"deleteDescription":"Sie können dieses Ticket löschen, indem Sie auf die Schaltfläche unten klicken!",
"reopenTitle":"Öffne dieses Ticket erneut!", "reopenTitle":"Öffne dieses Ticket erneut!",
"reopenDescription":"Sie können dieses Ticket erneut öffnen, indem Sie auf die Schaltfläche unten klicken!", "claimTitle":"Das Ticket wurde beansprucht von {0}",
"unclaimTitle":"Das Ticket wrid nicht mehr beansprucht",
"changeTitle":"Ticket Typ wurde geändert auf {0}!",
"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:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_"
@@ -53,7 +48,6 @@
"close":"Ticket schließen", "close":"Ticket schließen",
"delete":"Ticket löschen", "delete":"Ticket löschen",
"reopen":"Ticket wieder öffnen", "reopen":"Ticket wieder öffnen",
"sendTranscript":"Transcript-Datei senden",
"closeWithReason":"Geschlossen mit dem Grund" "closeWithReason":"Geschlossen mit dem Grund"
}, },
"messages":{ "messages":{
@@ -69,18 +63,25 @@
"deletedTicketDmTitle":"Ticket löschen!", "deletedTicketDmTitle":"Ticket löschen!",
"closedTicketDmDescription":"Ihr Ticket ist geschlossen!", "closedTicketDmDescription":"Ihr Ticket ist geschlossen!",
"deletedTicketDmDescription":"Ihr Ticket ist gelöscht!", "deletedTicketDmDescription":"Ihr Ticket ist gelöscht!",
"newTranscriptTitle":"Eine neue Transscript finden Sie hier!", "newTranscriptTitle":"Eine neue Transcript finden Sie hier!",
"newTranscriptDescription":"Die Abschrift finden Sie in der obigen Textdatei!", "hereIsTheTranscript":"Hier ist das Transcript:",
"hereIsTheTranscript":"Hier ist das Transscript:",
"chooseCategory":"Wähle eine Kategorie:", "chooseCategory":"Wähle eine Kategorie:",
"gettingdeleted":"Ticket wird gelöscht...",
"none":"keiner", "none":"none",
"reason":"Grund", "reason":"Grund",
"deletedby":"Gelöscht von", "deletedby":"Gelöscht von",
"closedby":"Geschlossen von", "closedby":"Geschlossen von",
"modalreason":"Was ist der Grund?", "modalreason":"Was ist der Grund?",
"chooseATicket": "Wähle ein Ticket" "chooseATicket": "Wähle ein passendes Thema!"
},
"transcripts":{
"title":"Transcript",
"processed":"Das Transcript wird erstellt",
"wait":"Bitte warten!",
"estimated":"Verbleibende Zeit",
"available":"Das Transcript ist hier verfügbar"
} }
} }
+46 -42
View File
@@ -1,61 +1,60 @@
{ {
"errors":{ "errors":{
"missingArgsTitle":"Argomenti non validi!", "missingArgsTitle":"Argomenti non validi!",
"missingArgsDescription":"Argomento mancante", "missingArgsDescription":"Argomenti mancanti",
"noPermsTitle":"Permessi mancanti!", "noPermsTitle":"Non hai i permessi sufficienti!",
"noPermsDescription":"Hai bisogno del permesso `ADMINISTRATOR` e essere nella lista dei ruoli accettati!", "noPermsDescription":"Hai bisogno del permesso `ADMINISTRATOR` o essere nella lista dei ruoli consentiti!",
"noPermsDelete":"Solo gli amministratori possono chiudere un ticket!", "noPermsDelete":"Solo gli amministratori possono eliminare i ticket!",
"chooseFromListTitle":"ID non valido", "chooseFromListTitle":"ID non valido",
"chooseFromListDescription":"Scegli uno degli ID sotto:", "chooseFromListDescription":"Scegli uno degli id sottostanti:",
"boterror":"Errore del bot!", "boterror":"Errore del bot!",
"notInTicketTitle":"Non sei in un ticket!", "notInTicketTitle":"Non sei in un ticket!",
"notInTicketDescription":"Questo comando non funziona fuori da un ticket!", "notInTicketDescription":"Questo comando non funziona al di fuori di un ticket!",
"ticketDoesntExist":"Questo ticket non esiste più!", "ticketDoesntExist":"Questo ticket non esiste!",
"roleDoesntExist":"Questo ruolo non esiste più!", "roleDoesntExist":"Questo ruolo non esiste!",
"anotherOption":"Questa opzione non è di un ticket!", "anotherOption":"Questa opzione non è un ticket ma un'altra!",
"maxAmountTitle":"Massimo numero raggiunto!", "maxAmountTitle":"Massimo ammontare raggiunto!",
"maxAmountDescription":"Hai raggiunto il massimo numero di ticket consentiti!\nNon puoi crearne altri!", "maxAmountDescription":"Hai raggiunto il massimo di ticket aperti!\nNon puoi creare altri!",
"somethingWentWrong":"**Qualcosa è andato storto!**\nPerfavore riprova un'altra volta!", "somethingWentWrong":"*Qualcosa è andato storto!*\nPerfavore riprova un'altra volta!"
"somethingWentWrongTranscript":"Qualcosa è andata storta durante la trascrizione!**\nPerfavore riprova un'altra volta!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Aggiunto {0} al ticket!", "userAddedTitle":"Aggiunti {0} a questo ticket!",
"userRemovedTitle":"Rimosso {0} da questo ticket!", "userRemovedTitle":"Rimossi {0} da questo ticket!",
"renameTitle":"Cambia il nome in {0}!", "renameTitle":"Cambiato il nome a {0}!",
"closeTitle":"Chiudo questo ticket!", "closeTitle":"Ticket chiuso!",
"deleteTitle":"Eliminando questo ticket...", "deleteTitle":"Eliminando questo ticket...",
"reopenTitle":"Ri-Aperto questo ticket!", "reopenTitle":"Ri-aperto questo ticket!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"Questo ticket è ora gestito da {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"Questo ticket non è più gestito!",
"changeTitle":"Cambiato il tipo di ticket in {0}!",
"ticketWarning":"L'embed è nel messaggio sotto!", "ticketWarning":"L'embed è nel messaggio sotto!",
"maxTicketWarning":"**Attenzione:** _Tu puoi creare solo {0} ticket(s) per volta!_" "maxTicketWarning":"*Attenzione:* Tu puoi creare solo {0} ticket alla volta!"
}, },
"helpMenu":{ "helpMenu":{
"title":"Comandi disponibili:", "title":"Comandi disponibili:",
"header1":"**Vai a {0} per creare un ticket!**\n\n", "header1":"*Vai a {0} per creare un ticket!*\n\n",
"header2":"**Esegui il comando `/new` o `/ticket` per creare un ticket!**\n\n", "header2":"*Esegui il comando `/new` o `/ticket` per creare un ticket!*\n\n",
"msgCmd":"Crea un embed con pulsanti. (solo amministratori)", "msgCmd":"Crea un embed con bottoni. (solo amministratori)",
"renameCmd":"Rinomina un ticket. (senza spazi)", "renameCmd":"Rinomina un ticket. (senza spazi)",
"closeCmd":"Chiudi un ticket.", "closeCmd":"Chiudi un ticket.",
"deleteCmd":"Elimina un ticket.", "deleteCmd":"Elimina un ticket.",
"addCmd":"Aggiungi un membro al ticket.", "addCmd":"Aggiungi un utente al ticket.",
"removeCmd":"Rimuovi un membro dal ticket.", "removeCmd":"Rimuovi un utente da un ticket.",
"reopenCmd":"Riapri un ticket dopo averlo chiuso." "reopenCmd":"Ri-apri un ticket dopo averlo chiuso."
}, },
"buttons":{ "buttons":{
"close":"Chiudi il ticket", "close":"Chiudi",
"delete":"Elimina il ticket", "delete":"Elimini",
"reopen":"Riapri il ticket", "reopen":"Ri-apri un ticket",
"sendTranscript":"Trascrizione", "closeWithReason":"chiudi con motivo"
"closeWithReason":"chiudi con un motivo"
}, },
"messages":{ "messages":{
"reopenTitle":"Riaperto questo ticket!", "reopenTitle":"Ticket ri-aperto!",
"reopenDescription":"Sentiti libero di parlare di nuovo!", "reopenDescription":"Sentiti libero di parlare nuovamente!",
"closedTitle":"Chiudo questo ticket!", "closedTitle":"Ticket chiuso!",
"closedDescription":"Solo gli amministratori possono parlare in questo ticket ora!\n\n*Clicca sul bottone sotto per chiudere o riaprire questo ticket!*", "closedDescription":"Solo gli amministratori possono parlare in questo ticket ora!\n\n*Clicca sul pulsante sotto per eliminare o ri-aprire questo ticket!*",
"createdTitle":"Ticket creato!", "createdTitle":"Ticket creato!",
"createdDescription":"Il tuo ticket è stato creato, puoi capirlo dal ping!", "createdDescription":"Il tuo ticket è stato creato, puoi capirlo dal ping!",
@@ -63,11 +62,9 @@
"closedTicketDmTitle":"Ticket chiuso!", "closedTicketDmTitle":"Ticket chiuso!",
"deletedTicketDmTitle":"Ticket eliminato!", "deletedTicketDmTitle":"Ticket eliminato!",
"closedTicketDmDescription":"Il tuo ticket è chiuso!", "closedTicketDmDescription":"Il tuo ticket è chiuso!",
"deletedTicketDmDescription":"Il tuo ticket è stato eliminato!", "deletedTicketDmDescription":"Il tuo ticket è eliminato!",
"reopenTicketDmTitle":"Ticket riaperto!", "reopenTicketDmTitle":"Ticket ri-aperto!",
"reopenTicketDmDescription":"Il tuo ticket è stato riaperto!", "reopenTicketDmDescription":"Il tuo ticket è stato ri-aperto!",
"newTranscriptTitle":"Un nuova trascrizione è qui!",
"hereIsTheTranscript":"Qui è la trascrizione:",
"chooseCategory":"scegli una categoria:", "chooseCategory":"scegli una categoria:",
"gettingdeleted":"Il ticket sta per essere chiuso...", "gettingdeleted":"Il ticket sta per essere chiuso...",
@@ -77,7 +74,14 @@
"deletedby":"eliminato da", "deletedby":"eliminato da",
"closedby":"chiuso da", "closedby":"chiuso da",
"modalreason":"Quale'è il motivo per chiudere il ticket?", "modalreason":"Quale è il motivo per chiudere questo ticket?",
"chooseATicket": "Scegli un ticket" "chooseATicket": "Scegli un ticket"
},
"transcripts":{
"title":"Trascrizione",
"processed":"Questo ticket sta per essere processato",
"wait":"Perfavore attendi!",
"estimated":"Tempo estimato",
"available":"La trascrizione è disponibile qui"
} }
} }
+17 -12
View File
@@ -15,8 +15,7 @@
"anotherOption":"Esta opção não é um ticket, mas sim outro tipo!", "anotherOption":"Esta opção não é um ticket, mas sim outro tipo!",
"maxAmountTitle":"Quantidade máxima atingida!", "maxAmountTitle":"Quantidade máxima atingida!",
"maxAmountDescription":"Você atingiu o número máximo de tickets permitidos!\nEntão você não pode criar um novo!", "maxAmountDescription":"Você atingiu o número máximo de tickets permitidos!\nEntão você não pode criar um novo!",
"somethingWentWrong":"**Algo deu errado!**\nPor favor, tente novamente outra vez!", "somethingWentWrong":"**Algo deu errado!**\nPor favor, tente novamente outra vez!"
"somethingWentWrongTranscript":"Algo deu errado ao fazer a transcrição!**\nPor favor, tente novamente outra vez!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Adicionado {0} a este ticket!", "userAddedTitle":"Adicionado {0} a este ticket!",
@@ -27,6 +26,7 @@
"reopenTitle":"Reabriu este ticket!", "reopenTitle":"Reabriu este ticket!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"ticketWarning":"A incorporação está na mensagem abaixo!", "ticketWarning":"A incorporação está na mensagem abaixo!",
"maxTicketWarning":"**Cuidado:** _Você só pode criar {0} ticket(s) de cada vez!!_" "maxTicketWarning":"**Cuidado:** _Você só pode criar {0} ticket(s) de cada vez!!_"
@@ -48,8 +48,7 @@
"close":"Fechar Ticket", "close":"Fechar Ticket",
"delete":"Excluir Ticket", "delete":"Excluir Ticket",
"reopen":"Reabrir Ticket", "reopen":"Reabrir Ticket",
"sendTranscript":"Transcrição", "closeWithReason":"fechado com motivo"
"closeWithReason":"close with reason"
}, },
"messages":{ "messages":{
"reopenTitle":"Reabriu este ticket!", "reopenTitle":"Reabriu este ticket!",
@@ -66,18 +65,24 @@
"deletedTicketDmDescription":"Seu bilhete foi excluído!", "deletedTicketDmDescription":"Seu bilhete foi excluído!",
"reopenTicketDmTitle":"Ticket reaberto!", "reopenTicketDmTitle":"Ticket reaberto!",
"reopenTicketDmDescription":"Seu ticket foi reaberto!", "reopenTicketDmDescription":"Seu ticket foi reaberto!",
"newTranscriptTitle":"Uma nova transcrição está aqui!",
"hereIsTheTranscript":"Aqui está a transcrição:",
"chooseCategory":"Escolha a categoria:", "chooseCategory":"Escolha a categoria:",
"gettingdeleted":"Ticket está sendo deletado...", "gettingdeleted":"Ticket está sendo deletado...",
"none":"none", "none":"vazio",
"reason":"reason", "reason":"motivo",
"deletedby":"deleted by", "deletedby":"deletado por",
"closedby":"closed by", "closedby":"fechado por",
"modalreason":"What is the reason for closing this ticket?", "modalreason":"Qual o motivo de fechar o ticket?",
"chooseATicket": "Choose a ticket"
"chooseATicket": "Fechar Ticket"
},
"transcripts":{
"title":"Transcrever",
"processed":"A Transcrição está em andamento",
"wait":"Por favor espere!",
"estimated":"Tempo estimado",
"available":"A Transcrição está disponível aqui"
} }
} }
+9 -5
View File
@@ -15,8 +15,7 @@
"anotherOption":"Aceasta optiune este altceva decat un tip de ticket!", "anotherOption":"Aceasta optiune este altceva decat un tip de ticket!",
"maxAmountTitle":"Limita atinsa!", "maxAmountTitle":"Limita atinsa!",
"maxAmountDescription":"Ai atins limita de tickets!\nAsa ca nu mai poti creea altele noi!", "maxAmountDescription":"Ai atins limita de tickets!\nAsa ca nu mai poti creea altele noi!",
"somethingWentWrong":"**Ceva nu a mers bine!**\nTe rugam sa incerci mai tarziu!", "somethingWentWrong":"**Ceva nu a mers bine!**\nTe rugam sa incerci mai tarziu!"
"somethingWentWrongTranscript":"Ceva nu aa mers bine in timpul creeari transcript-ului!**\nTe rugam sa incerci mai tarziu!"
}, },
"commands":{ "commands":{
"userAddedTitle":"{0} a fost adaugat in acest ticket!", "userAddedTitle":"{0} a fost adaugat in acest ticket!",
@@ -27,6 +26,7 @@
"reopenTitle":"Ticket Re-deschis!", "reopenTitle":"Ticket Re-deschis!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"ticketWarning":"Embed-ul se afla in mesajul de mai jos!", "ticketWarning":"Embed-ul se afla in mesajul de mai jos!",
"maxTicketWarning":"**Avertizare:** _Poti creea doar {0} tickete active!_" "maxTicketWarning":"**Avertizare:** _Poti creea doar {0} tickete active!_"
@@ -48,7 +48,6 @@
"close":"Inchide ticket-ul", "close":"Inchide ticket-ul",
"delete":"Sterge ticket-ul", "delete":"Sterge ticket-ul",
"reopen":"Re-deschide un ticket", "reopen":"Re-deschide un ticket",
"sendTranscript":"Transcript",
"closeWithReason":"Inchide cu motiv" "closeWithReason":"Inchide cu motiv"
}, },
"messages":{ "messages":{
@@ -66,8 +65,6 @@
"deletedTicketDmDescription":"Ticket-ul tau este sters!", "deletedTicketDmDescription":"Ticket-ul tau este sters!",
"reopenTicketDmTitle":"Ticket Re-deschis!", "reopenTicketDmTitle":"Ticket Re-deschis!",
"reopenTicketDmDescription":"Ticket-ul tau este re-deschis!", "reopenTicketDmDescription":"Ticket-ul tau este re-deschis!",
"newTranscriptTitle":"Un nou transcript este aici!",
"hereIsTheTranscript":"Aici este transcriptul:",
"chooseCategory":"Alege o categorie:", "chooseCategory":"Alege o categorie:",
"gettingdeleted":"Ticket-ul se sterge...", "gettingdeleted":"Ticket-ul se sterge...",
@@ -79,5 +76,12 @@
"closedby":"Inchis de", "closedby":"Inchis de",
"modalreason":"Care este motivul pentru inchiderea acestui ticket?", "modalreason":"Care este motivul pentru inchiderea acestui ticket?",
"chooseATicket": "Alege un ticket" "chooseATicket": "Alege un ticket"
},
"transcripts":{
"title":"Transcript",
"processed":"Transcript in curs de procesare...",
"wait":"Te rugam sa astepti!",
"estimated":"Timp estimat",
"available":"Transcriptul este disponibil aici"
} }
} }
+87
View File
@@ -0,0 +1,87 @@
{
"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}!",
"ticketWarning":"embed ниже сообщения!",
"maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_"
},
"helpMenu":{
"title":"Доступные команды:",
"header1":"**Перейдите в {0}, чтобы создать тикет!**\n\n",
"header2":"**Выполните команду `/new` или `/ticket` для создания тикета!**\n\n",
"msgCmd":"Создать embed с кнопками. (только админам)",
"renameCmd":"Переименовать тикет. (без пробелов)",
"closeCmd":"Закрыть тикет.",
"deleteCmd":"Удалить тикет.",
"addCmd":"Добавить пользователя в тикет.",
"removeCmd":"Удалить пользователя из тикета.",
"reopenCmd":"Открыть заново тикет после того, как он был закрыт."
},
"buttons":{
"close":"Закрыть тикет",
"delete":"Удалить тикет",
"reopen":"Открыть заново тикет",
"closeWithReason":"закрыть с причиной"
},
"messages":{
"reopenTitle":"Открыл заново этот тикет!",
"reopenDescription":"Не стесняйтесь обращаться снова!",
"closedTitle":"Закрыл этот тикет!",
"closedDescription":"Только админы теперь могут писать в этом тикете!\n\n*Нажмите на кнопку ниже, чтобы удалить или заново окрыть тикет!*",
"createdTitle":"Тикет создан!",
"createdDescription":"Ваш тикет создан, вы можете обнаружить его по пингу!",
"newTicketDmTitle":"Новый тикет!",
"closedTicketDmTitle":"Тикет закрыт!",
"deletedTicketDmTitle":"Тикет удалён!",
"closedTicketDmDescription":"Ваш тикет закрыт!",
"deletedTicketDmDescription":"Ваш тикет удалён!",
"reopenTicketDmTitle":"Тикет открыт заново!",
"reopenTicketDmDescription":"Ваш тикет открыт заново!",
"chooseCategory":"выберите категорию:",
"gettingdeleted":"Тикет будет удалён...",
"none":"отсутствует",
"reason":"причина",
"deletedby":"удалён",
"closedby":"закрыт",
"modalreason":"Какая причина закрытия этого тикета?",
"chooseATicket": "Выберите тикет"
},
"transcripts":{
"title":"Транскрипт",
"processed":"This transcript is being processed",
"wait":"Пожайлуста подождите!",
"estimated":"Оценочное время",
"available":"Транскрипт здесь доступен"
}
}
+51 -27
View File
@@ -9,6 +9,7 @@
"fr":"french", "fr":"french",
"es-ES":"spanish", "es-ES":"spanish",
"it":"italian", "it":"italian",
"ru":"russian",
"MISSING":"arabic,portuguese", "MISSING":"arabic,portuguese",
"NOTAVAILABLE":"arabic,portuguese,czech" "NOTAVAILABLE":"arabic,portuguese,czech"
@@ -23,7 +24,8 @@
"cs":"A list of the available commands", "cs":"A list of the available commands",
"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":"Список доступных команд"
}, },
"message":{ "message":{
"en-GB":"Spawn an embed with buttons.", "en-GB":"Spawn an embed with buttons.",
@@ -34,7 +36,8 @@
"cs":"Spawn an embed with buttons.", "cs":"Spawn an embed with buttons.",
"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 с кнопками"
}, },
"close":{ "close":{
"en-GB":"Close a ticket.", "en-GB":"Close a ticket.",
@@ -45,7 +48,8 @@
"cs":"Close a ticket.", "cs":"Close a ticket.",
"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":"Закрыть тикет"
}, },
"delete":{ "delete":{
"en-GB":"Delete a ticket.", "en-GB":"Delete a ticket.",
@@ -56,7 +60,8 @@
"cs":"Delete a ticket.", "cs":"Delete a ticket.",
"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":"Удалить тикет"
}, },
"reopen":{ "reopen":{
"en-GB":"Re-Open a ticket.", "en-GB":"Re-Open a ticket.",
@@ -67,7 +72,8 @@
"cs":"Re-Open a ticket.", "cs":"Re-Open a ticket.",
"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":"Открыть заново тикет"
}, },
"add":{ "add":{
"en-GB":"Add another user to a ticket.", "en-GB":"Add another user to a ticket.",
@@ -78,7 +84,8 @@
"cs":"Add another user to a ticket.", "cs":"Add another user to a ticket.",
"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":"Добавить другого пользователя в тикет"
}, },
"remove":{ "remove":{
"en-GB":"Remove a user from a ticket.", "en-GB":"Remove a user from a ticket.",
@@ -89,7 +96,8 @@
"cs":"Remove a user from a ticket.", "cs":"Remove a user from a ticket.",
"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":"Удалить пользователя из тикета"
}, },
"newticket":{ "newticket":{
"en-GB":"Create a ticket", "en-GB":"Create a ticket",
@@ -100,7 +108,8 @@
"cs":"Create a ticket", "cs":"Create a ticket",
"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":"Создать тикет"
}, },
"rename":{ "rename":{
"en-GB":"Rename a ticket channel.", "en-GB":"Rename a ticket channel.",
@@ -111,29 +120,44 @@
"cs":"Rename a ticket channel", "cs":"Rename a ticket channel",
"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":"Переименовать канал тикета"
}, },
"claim":{ "claim":{
"en-GB":"", "en-GB":"Claim a ticket.",
"en-US":"", "en-US":"Claim a ticket.",
"nl":"", "nl":"Claim een ticket.",
"ro":"", "ro":" ",
"de":"", "de":" ",
"cs":"", "cs":" ",
"fr":"", "fr":" ",
"es-ES":"", "es-ES":" ",
"it":"" "it":" ",
"ru":"Взять тикет"
}, },
"unclaim":{ "unclaim":{
"en-GB":"", "en-GB":"Un-claim a ticket.",
"en-US":"", "en-US":"Un-claim a ticket.",
"nl":"", "nl":"Ontclaim een ticket.",
"ro":"", "ro":" ",
"de":"", "de":" ",
"cs":"", "cs":" ",
"fr":"", "fr":" ",
"es-ES":"", "es-ES":" ",
"it":"" "it":" ",
"ru":"Снять тикет"
},
"category":{
"en-GB":"Change ticket type.",
"en-US":"Change ticket type.",
"nl":"Verander ticket type.",
"ro":" ",
"de":" ",
"cs":" ",
"fr":" ",
"es-ES":" ",
"it":" ",
"ru":"Изменить тип тикета"
} }
} }
} }
+11 -7
View File
@@ -15,8 +15,7 @@
"anotherOption":"¡Esta opción no es un ticket, si no otra cosa!", "anotherOption":"¡Esta opción no es un ticket, si no otra cosa!",
"maxAmountTitle":"¡Máxima cantidad alcanzada!", "maxAmountTitle":"¡Máxima cantidad alcanzada!",
"maxAmountDescription":"¡Has alcanzado la máxima cantidad de tickets permitida!\n¡Por lo que no puedes crear otro!", "maxAmountDescription":"¡Has alcanzado la máxima cantidad de tickets permitida!\n¡Por lo que no puedes crear otro!",
"somethingWentWrong":"**¡Algo salió mal!**\n¡Prueba dentro de un rato!", "somethingWentWrong":"**¡Algo salió mal!**\n¡Prueba dentro de un rato!"
"somethingWentWrongTranscript":"**¡Algo salió mal al hacer el transcript!**\n¡Prueba en otro momento!"
}, },
"commands":{ "commands":{
"userAddedTitle":"Se agregó {0} al ticket!", "userAddedTitle":"Se agregó {0} al ticket!",
@@ -25,8 +24,9 @@
"closeTitle":"Cerró este ticket!", "closeTitle":"Cerró este ticket!",
"deleteTitle":"Eliminando este ticket...", "deleteTitle":"Eliminando este ticket...",
"reopenTitle":"Re-abrió este boleto!", "reopenTitle":"Re-abrió este boleto!",
"claimTitle":"This ticket is now claimed to {0}", "claimTitle":"Este ticket será atendido por {0}",
"unclaimTitle":"This ticket isn't claimed anymore!", "unclaimTitle":"¡Este ticket ya no está reservado!",
"changeTitle":"¡Cambiando el tipo de ticket a {0}!",
"ticketWarning":"La inserción está en el mensaje a continuación!", "ticketWarning":"La inserción está en el mensaje a continuación!",
"maxTicketWarning":"**Advertencia:** _Solo puedes crear {0} ticket(s) a la vez!_" "maxTicketWarning":"**Advertencia:** _Solo puedes crear {0} ticket(s) a la vez!_"
@@ -48,7 +48,6 @@
"close":"Cerrar ticket.", "close":"Cerrar ticket.",
"delete":"Eliminar ticket", "delete":"Eliminar ticket",
"reopen":"Re-Abrir ticket", "reopen":"Re-Abrir ticket",
"sendTranscript":"Obtener transcript.",
"closeWithReason":"cerrar con razón" "closeWithReason":"cerrar con razón"
}, },
"messages":{ "messages":{
@@ -66,8 +65,6 @@
"deletedTicketDmDescription":"¡Tu ticket fué eliminado!", "deletedTicketDmDescription":"¡Tu ticket fué eliminado!",
"reopenTicketDmTitle":"¡Ticket re-abierto!", "reopenTicketDmTitle":"¡Ticket re-abierto!",
"reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!", "reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!",
"newTranscriptTitle":"¡Un nuevo transcript está aquí!",
"hereIsTheTranscript":"Aquí está el transcript:",
"chooseCategory":"Elije una categoría:", "chooseCategory":"Elije una categoría:",
"gettingdeleted":"El ticket se está viendo eliminado...", "gettingdeleted":"El ticket se está viendo eliminado...",
@@ -79,5 +76,12 @@
"closedby":"cerrado por", "closedby":"cerrado por",
"modalreason":"Cúal es la razón para cerrar este ticket?", "modalreason":"Cúal es la razón para cerrar este ticket?",
"chooseATicket": "Elije un ticket" "chooseATicket": "Elije un ticket"
},
"transcripts":{
"title":"Transcripción",
"processed":"La transcripción del ticket está siendo procesada...",
"wait":"¡Por favor, espere!",
"estimated":"Tiempo estimado",
"available":"La transcripción estará disponible aquí"
} }
} }
+2 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "open-ticket", "name": "open-ticket",
"version": "3.1.0", "version": "3.2.2",
"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": {
@@ -16,9 +16,7 @@
"axios": "^0.27.2", "axios": "^0.27.2",
"chalk": "^5.0.1", "chalk": "^5.0.1",
"discord.js": "^14.7.1", "discord.js": "^14.7.1",
"express": "^4.17.1", "node": "^16.10.0"
"node": "^16.10.0",
"node-localstorage": "^2.2.1"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
+18
View File
@@ -0,0 +1,18 @@
{
"sendTranscripts":{
"enableChannel":false,
"channel":"transcript channel id",
"useHTMLtranscripts":true,
"enableDM":false
},
"style":{
"titleColor":"#F8BA00",
"background":{
"enableCustomBackground":false,
"backgroundModus":"color OR image",
"backgroundData":"#abc123 OR https://www.example.com/image.png"
}
}
}