Compare commits

...
69 Commits
Author SHA1 Message Date
Jasper 94ee890848 Open Ticket v3.3!
Open Ticket v3.3!
2023-03-19 12:34:23 +01:00
DJj123dj 4dced819a3 v3.3 push 7 (added autoclose) 2023-03-19 12:29:24 +01:00
DJj123dj 1159af9fa9 v3.3 push 6 (added ticket claiming) 2023-03-18 11:48:01 +01:00
DJj123dj 67d429c52b v3.3 push 5 2023-03-16 20:58:08 +01:00
DJj123dj f67af805c1 v3.3 push 4 (1 entire afternoon of work)
My TODO list is too big :)
2023-03-15 20:57:14 +01:00
DJj123dj 944032f690 v3.3 push 3 (lots of small changes 😄) 2023-03-13 20:22:23 +01:00
DJj123dj ee248e86bc Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-03-12 11:22:55 +01:00
DJj123dj b171bce62b v3.3 push 2 (added Polish) 2023-03-12 11:22:53 +01:00
Jasper df0bce0189 Delete test.txt 2023-03-01 14:31:36 +01:00
Jasper 2630aa899f Create test.txt 2023-03-01 14:03:50 +01:00
DJj123dj dba370d66e v3.3 push 1 & added turkish language 2023-02-25 21:02:31 +01:00
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
Jasper f2ddaa5fd4 Merge pull request #36 from DJj123dj/dev
Open Ticket v3.1.0
2022-12-31 11:47:35 +01:00
DJj123dj fc50a8e83f v3.1 last push 2022-12-31 11:42:33 +01:00
DJj123dj 5bece3357d v3.1.0 push 3 2022-12-27 17:41:54 +01:00
Jasper 97d1489558 Delete .DS_Store 2022-12-27 17:37:23 +01:00
Jasper a211cef1f6 Delete database.json 2022-12-27 17:36:52 +01:00
DJj123dj ae002e168b v3.1.0 push 2 2022-12-27 17:35:01 +01:00
DJj123dj 86a5a1a2ca v3.1.0 push 1 2022-12-27 11:38:32 +01:00
Jasper 23ebc14b8b Merge pull request #35 from DJj123dj/dev
Open Ticket v3.0.1
2022-12-10 13:38:08 +01:00
DJj123dj 3a5768a1b1 added new README image 2022-12-10 13:37:02 +01:00
DJj123dj 33c3803ca8 openticket v3.0.1 2022-12-10 12:59:44 +01:00
DJj123dj f3613fb674 update to discord.js 14.7 2022-12-05 19:32:11 +01:00
DJj123dj f1dc8cbcf5 changed some stuff 2022-11-24 21:51:13 +01:00
Jasper a365c4b69f Update issue templates 2022-10-10 20:01:10 +02:00
Jasper 687372481a Update issue templates 2022-10-10 19:54:28 +02:00
Jasper 1bc8bde922 Update issue templates 2022-10-10 19:49:16 +02:00
87 changed files with 3703 additions and 1314 deletions
+37
View File
@@ -0,0 +1,37 @@
---
name: Bug report
about: Create a report to help us improve Open Ticket
title: "[BUG] your bug"
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Device:**
- Device: [e.g. Macbook pro, raspberry pi, HP Probook]
- OS: [e.g. MacOS, Ubuntu, Windows,...]
- Node.js version:
- Open Ticket Version:
**Files:**
Please include the `openticketdebug.txt` file in your report!
This is a file that we can see what happend!
**Additional context**
Add any other context about the problem here.
+29
View File
@@ -0,0 +1,29 @@
---
name: Plugin
about: Show your open ticket plugins here!
title: "[PLUGIN] your plugin"
labels: plugin
assignees: ''
---
**Plugin Name:**
What's the name of your plugin?
**Description:**
Tell a little bit about what the plugin does!
Also tell how to use the plugin, like if there is additional setup needed!
**NPM libraries:**
List all the libraries needed for this plugin to work!
*The default open ticket libraries are not required!*
**Author:**
- github account [e.g. DJj123dj]
- discord account [e.g. Wumpus#1234]
**Compatible versions:**
[e.g. from v2.2.1 until v3.0.1]
**File:**
Please attach the plugin file to this issue!
+12 -6
View File
@@ -1,16 +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/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
+55 -46
View File
@@ -1,59 +1,68 @@
# 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.0.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.0.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.3.0-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.0) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be)
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 14 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
[Official Documentation](https://docs.openticket.dj-dj.be)
## information ## credits
DJdj Development Team
|Main Developer|Developer|Support Team|Designer|
|--------------|---------|-----------|---------|
|DJj123dj |Sanke |DJ-Lite |vuur_draak|
_v3.0.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 |
|Turkish |Hydrâelčhâvø#1575 |
|Polish |MKevas#8311 |
changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog) ## links
current version: _v3.3.0_
</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)
+5 -3
View File
@@ -44,7 +44,7 @@ module.exports = () => {
}) })
if (!DISABLE.commands.slash.add) client.on("interactionCreate",(interaction) => { if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "add") return if (interaction.commandName != "add") return
const user = interaction.options.getUser("user") const user = interaction.options.getUser("user")
@@ -55,14 +55,16 @@ module.exports = () => {
return return
} }
await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const 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
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true}) interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
interaction.reply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
var loguser = user var loguser = user
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}])
+125
View File
@@ -0,0 +1,125 @@
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
const list = []
config.options.forEach((o) => list.push(o.id))
var newtype = msg.content.split(config.prefix+"change")[1].substring(1)
if (!newtype) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
const newTicket = require("../core/utils/configParser").getTicketById(newtype)
if (!newTicket) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
/**@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",async (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
}
await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(async (msglist) => {
/**@type {discord.Message} */
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const list = []
config.options.forEach((o) => list.push(o.id))
var newtype = interaction.options.getString("type",true)
const newTicket = require("../core/utils/configParser").getTicketById(newtype,true)
if (!newTicket) return interaction.editReply({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
/**@type {discord.PermissionOverwriteManager} */
const prePermsManager = interaction.channel.permissionOverwrites
const prePerms = prePermsManager.cache
/**@type {String} */
var chName = interaction.channel.name
const splitted = chName.split("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await interaction.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent)
}
await prePermsManager.set(prePerms)
interaction.channel.setName(newTicket.channelprefix+name)
var newHiddendata = hiddendata.data
newHiddendata.find((value,index) => {
if (value.key == "type"){
newHiddendata[index] = {key:"type",value:newtype}
}
})
const prevDescription = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description).description
const newData = bot.hiddenData.writeHiddenData("ticketdata",newHiddendata)
const newDescription = prevDescription+newData
const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data)
.setDescription(newDescription)
firstmsg.edit({embeds:[newEmbed]})
interaction.editReply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]})
log("command","someone used the 'change' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
})
})
}
+46 -19
View File
@@ -5,6 +5,8 @@ const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const embed = discord.EmbedBuilder
const storage = bot.storage
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
const DISABLE = require("../core/api/api.json").disable const DISABLE = require("../core/api/api.json").disable
@@ -25,27 +27,39 @@ module.exports = () => {
} }
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
const hiddendata = hdraw.hiddenData
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
hiddendata.data.push({key:"claimedby",value:interaction.user.id})
storage.set("claimData",interaction.channel.id,interaction.user.id)
//msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]}) const newEmbed = new embed(firstmsg.embeds[0].data)
msg.channel.send({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]}) .setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}
msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]})
var loguser = claimingUser
log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}])
log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}]) log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
//APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
//APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("claim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
}) })
}) })
if (!DISABLE.commands.slash.claim) client.on("interactionCreate",(interaction) => { if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "claim") return if (interaction.commandName != "claim") return
const user = interaction.options.getUser("user",false) ? interaction.options.getUser("user",true) : interaction.user const user = interaction.options.getUser("user",false) ? interaction.options.getUser("user",true) : interaction.user
@@ -56,25 +70,38 @@ module.exports = () => {
return return
} }
await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
const hiddendata = hdraw.hiddenData
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
//interaction.reply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]}) hiddendata.data.push({key:"claimedby",value:interaction.user.id})
interaction.reply({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]}) storage.set("claimData",interaction.channel.id,interaction.user.id)
const newEmbed = new embed(firstmsg.embeds[0].data)
.setFooter({text:"claimed by: "+user.tag,iconURL:user.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}
interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]})
var loguser = user
log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.tag}])
log("system","user claimed to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:loguser.tag}]) log("system","user claimed to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:user.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
//APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
//APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("claim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
} }
+8 -6
View File
@@ -44,7 +44,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",reason,true) require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"close",reason,true)
log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
@@ -54,7 +54,7 @@ module.exports = () => {
}) })
if (!DISABLE.commands.slash.close) client.on("interactionCreate",(interaction) => { if (!DISABLE.commands.slash.close) client.on("interactionCreate",async(interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "close") return if (interaction.commandName != "close") return
@@ -62,16 +62,18 @@ module.exports = () => {
const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false
await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const 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
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]}) if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]}) interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
var name = interaction.channel.name var name = interaction.channel.name
var prefix = "" var prefix = ""
@@ -82,7 +84,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true) require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",false,true)
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
+7 -7
View File
@@ -38,7 +38,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true) require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}]) log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
@@ -47,25 +47,25 @@ module.exports = () => {
}) })
if (!DISABLE.commands.slash.delete) client.on("interactionCreate",(interaction) => { if (!DISABLE.commands.slash.delete) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "delete") return if (interaction.commandName != "delete") return
//interaction.deferReply()
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
permsChecker.sendUserNoPerms(interaction.user) permsChecker.sendUserNoPerms(interaction.user)
return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]}) return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]})
} }
await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const 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
interaction.reply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
var name = interaction.channel.name var name = interaction.channel.name
var prefix = "" var prefix = ""
@@ -76,7 +76,7 @@ module.exports = () => {
} }
}) })
require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
+6 -5
View File
@@ -15,13 +15,14 @@ module.exports = () => {
const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix
const helpEmbed = new discord.EmbedBuilder() const helpEmbed = new discord.EmbedBuilder()
.setColor(config.main_color) .setColor(config.color)
.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 = 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 [reason]` ➜ _"+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>` ➜ _"+l.helpMenu.changeCmd+"_\n`"+prefix+"claim [user]` ➜ _"+l.helpMenu.claimCmd+"_\n`"+prefix+"unclaim` ➜ _"+l.helpMenu.unclaimCmd+"_")
helpEmbed.addFields([
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"}) {name:"Autoclose",value:l.helpMenu.autocloseCmd+"\n`"+prefix+"autoclose enable <inactive time>`\n`"+prefix+"autoclose disable`"}
])
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
+4 -2
View File
@@ -55,14 +55,16 @@ module.exports = () => {
return return
} }
await interaction.deferReply()
await interaction.channel.messages.fetchPinned().then(msglist => { await interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const 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
interaction.channel.permissionOverwrites.delete(user.id) interaction.channel.permissionOverwrites.delete(user.id)
interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]}) interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
var loguser = user var loguser = user
+4 -4
View File
@@ -53,7 +53,7 @@ module.exports = () => {
}) })
if (!DISABLE.commands.slash.rename) client.on("interactionCreate",(interaction) => { if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "rename") return if (interaction.commandName != "rename") return
@@ -63,11 +63,11 @@ module.exports = () => {
return return
} }
//interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const 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
@@ -84,7 +84,7 @@ module.exports = () => {
if (!prefix) prefix = "noprefix-" if (!prefix) prefix = "noprefix-"
interaction.channel.setName(prefix+newname) interaction.channel.setName(prefix+newname)
interaction.reply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]}) interaction.editReply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}]) log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}]) log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
+4 -4
View File
@@ -37,17 +37,17 @@ module.exports = () => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "reopen") return if (interaction.commandName != "reopen") return
//interaction.deferReply() await interaction.deferReply()
interaction.channel.messages.fetchPinned().then(async msglist => { interaction.channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const 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
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]}) if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]}) await interaction.editReply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user) require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
+2 -2
View File
@@ -30,8 +30,8 @@ module.exports = () => {
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
if (!id) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]}) if (!id) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds,l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]}) if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds,l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id) const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
+69 -23
View File
@@ -5,6 +5,8 @@ const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker") const permsChecker = require("../core/utils/permisssionChecker")
const embed = discord.EmbedBuilder
const storage = bot.storage
const APIEvents = require("../core/api/modules/events") const APIEvents = require("../core/api/modules/events")
const DISABLE = require("../core/api/api.json").disable const DISABLE = require("../core/api/api.json").disable
@@ -21,31 +23,52 @@ module.exports = () => {
return return
} }
const unclaimuser = storage.get("claimData",msg.channel.id)
if (!unclaimuser || unclaimuser == "false") return msg.channel.send({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
msg.channel.messages.fetchPinned().then(msglist => { msg.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
const hiddendata = hdraw.hiddenData
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
hiddendata.data.push({key:"claimedby",value:"false"})
storage.set("claimData",interaction.channel.id,"false")
//msg.channel.send({embeds:[bot.embeds.commands.unclaimEmbed(msg.author)]}) const newEmbed = new embed(firstmsg.embeds[0].data)
msg.channel.send({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]}) .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
var loguser = msg.author
log("command","someone used the 'unclaim' command",[{key:"user",value:msg.author.tag}])
log("system","user unclaimed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"unclaimed_user",value:msg.author.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
//APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData}) if (ticketData && ticketData.autoclose.enable){
//APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date()) const footerText = l.commands.autocloseTitle.replace("{0}",ticketData.autoclose.inactiveHours+"h")
}) newEmbed.setFooter({text:footerText})
}else{
newEmbed.setFooter(null)
}
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled],embeds:[newEmbed]})
}
msg.channel.send({embeds:[bot.embeds.commands.unclaimEmbed(msg.author)]})
log("command","someone used the 'unclaim' command",[{key:"user",value:msg.author.tag}])
log("system","user unclaimed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"unclaimed_user",value:unclaimuser}])
APIEvents.onTicketUnclaim(msg.author,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("unclaim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
})
}) })
if (!DISABLE.commands.slash.unclaim) client.on("interactionCreate",(interaction) => { if (!DISABLE.commands.slash.unclaim) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "unclaim") return if (interaction.commandName != "unclaim") return
const user = interaction.user
if (!interaction.guild) return if (!interaction.guild) return
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){ if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
@@ -53,25 +76,48 @@ module.exports = () => {
return return
} }
await interaction.deferReply()
const unclaimuser = storage.get("claimData",interaction.channel.id)
if (!unclaimuser || unclaimuser == "false") return interaction.editReply({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
interaction.channel.messages.fetchPinned().then(msglist => { interaction.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */
var firstmsg = msglist.last() var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]}) if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description) const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
const hiddendata = hdraw.hiddenData
const ticketId = hiddendata.data.find(d => d.key == "type").value const ticketId = hiddendata.data.find(d => d.key == "type").value
//interaction.reply({embeds:[bot.embeds.commands.unclaimEmbed(interaction.user)]}) hiddendata.data.push({key:"claimedby",value:"false"})
interaction.reply({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]}) storage.set("claimData",interaction.channel.id,"false")
var loguser = user const newEmbed = new embed(firstmsg.embeds[0].data)
log("command","someone used the 'unclaim' command",[{key:"user",value:interaction.user.tag}]) .setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
log("system","user unclaimed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"unclaimed_user",value:loguser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true) const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
//APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData}) if (ticketData && ticketData.autoclose.enable){
//APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date()) const footerText = l.commands.autocloseTitle.replace("{0}",ticketData.autoclose.inactiveHours+"h")
newEmbed.setFooter({text:footerText})
}else{
newEmbed.setFooter(null)
}
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled],embeds:[newEmbed]})
}
interaction.editReply({embeds:[bot.embeds.commands.unclaimEmbed(interaction.user)]})
log("command","someone used the 'unclaim' command",[{key:"user",value:interaction.user.tag}])
log("system","user unclaimed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"unclaimed_user",value:unclaimuser}])
APIEvents.onTicketUnclaim(interaction.user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("unclaim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
}) })
}) })
} }
+44 -19
View File
@@ -1,12 +1,14 @@
{ {
"main_color":"#ffffff", "color":"#ffffff",
"server_id":"server id (for slash cmds)", "serverId":"server id (for slash cmds)",
"auth_token":"auth token", "token":{
"main_adminroles":["discord role id"], "value":"insert your bot token here",
"fromENV":false
},
"adminRoles":["discord role id"],
"prefix":"!ticket ", "prefix":"!ticket ",
"languagefile":"english", "languageFile":"english",
"credits":true,
"status":{ "status":{
"enabled":true, "enabled":true,
"type":"PLAYING", "type":"PLAYING",
@@ -14,21 +16,19 @@
}, },
"system":{ "system":{
"ticket_channel":"channel id", "maxAmountOfTickets":3,
"max_allowed_tickets":3, "dmMessages":false,
"enable_DM_Messages":true,
"has@everyoneaccess":false, "memberRole":"member role (leave empty if you have no member role)",
"member_role":"member role (doesn't have access to tickets)", "closeMode":"adminonly OR normal (select one!)",
"closeMode":"adminonly|normal",
"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,10 +50,19 @@
"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,
"id":"category id" "id":"category id"
},
"autoclose":{
"enable":false,
"inactiveHours":24
} }
}, },
@@ -92,7 +101,7 @@
"dropdown":false, "dropdown":false,
"enableFooter":false, "enableFooter":false,
"footer":"Open Ticket v3.0.0 - I'm a footer!", "footer":"Open Ticket v3.3.0 - I'm a footer!",
"enableThumbnail":false, "enableThumbnail":false,
"thumbnail":"https://www.example.com/catmemes/cat.png", "thumbnail":"https://www.example.com/catmemes/cat.png",
@@ -101,8 +110,24 @@
"color":"#ffffff", "color":"#ffffff",
"options":["general","apply"], "options":["general","apply"],
"enableTicketExplaination":true,
"enableMaxTicketsWarning":true "other":{
"enableTicketExplaination":true,
"enableMaxTicketsWarning":true,
"customDropdownPlaceholder":{
"enable":false,
"text":"Choose a ticket"
},
"customCategoryText":{
"enable":false,
"text":"choose a category:"
},
"embedTitleURL":{
"enable":false,
"url":"https://www.dj-dj.be/projects/open-ticket"
}
}
} }
] ]
} }
+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":{
-8
View File
@@ -1,8 +0,0 @@
/** FOR DEVELOPERS ONLY!!
* Don't change anything in this file before reading the documentation!
* visit the api documentation at https://docs.openticket.dj-dj.be
*/
exports.embeddedMode = false
exports.clientLocation = require("../../../index").client
+103 -10
View File
@@ -4,7 +4,8 @@ const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const l = bot.language const l = bot.language
const storage = bot.storage
const configParser = require("../../utils/configParser")
//EVENT API: //EVENT API:
@@ -16,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 = []
@@ -48,7 +53,7 @@ exports.onTicketOpen = (user,channel,guild,date,ticketdata) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
* @param {String} reason * @param {String} reason
*/ */
exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => { exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => {
@@ -69,7 +74,7 @@ exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/ */
exports.onTicketDelete = (user,channel,guild,date,ticketdata) => { exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
//system //system
@@ -89,7 +94,7 @@ exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/ */
exports.onTicketReopen = (user,channel,guild,date,ticketdata) => { exports.onTicketReopen = (user,channel,guild,date,ticketdata) => {
//system //system
@@ -110,7 +115,7 @@ exports.onTicketReopen = (user,channel,guild,date,ticketdata) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/ */
exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => { exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => {
//system //system
@@ -131,7 +136,7 @@ exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/ */
exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => { exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => {
//system //system
@@ -145,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
@@ -164,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 */
/** /**
* *
@@ -237,7 +302,7 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
*/ */
/** /**
@@ -246,7 +311,7 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata * @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
* @param {String} reason * @param {String} reason
*/ */
@@ -265,7 +330,17 @@ exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
* @param {discord.TextChannel} channel * @param {discord.TextChannel} channel
* @param {discord.Guild} guild * @param {discord.Guild} guild
* @param {Date} date * @param {Date} date
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} 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
*/ */
/** /**
@@ -327,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)
@@ -354,6 +444,9 @@ exports.events = {
onTicketReopen, onTicketReopen,
onTicketAdd, onTicketAdd,
onTicketRemove, onTicketRemove,
onTicketClaim,
onTicketUnclaim,
onTicketChange,
onTranscriptCreation, onTranscriptCreation,
onCommand, onCommand,
onReactionRole, onReactionRole,
+8 -4
View File
@@ -19,9 +19,13 @@ module.exports = () => {
/**@type {Error} */ /**@type {Error} */
const theError = err const theError = err
if (api.enableAPIdebug){ if (api.enableAPIdebug){
const data = fs.readFileSync("./apiDebug.txt") try {
const newData = data ? data.toString() : "" const data = fs.readFileSync("./apiDebug.txt")
fs.writeFileSync("./apiDebug.txt",newData+"ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n") const newData = data ? data.toString() : ""
fs.writeFileSync("./apiDebug.txt",newData+"ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n")
}catch{
fs.writeFileSync("./apiDebug.txt","ERROR: "+theError.name+": "+theError.message+"\n"+theError.stack+"\n\n")
}
} }
failcount++ failcount++
totalcount++ totalcount++
@@ -29,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})
} }
+128 -75
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")
@@ -53,9 +53,9 @@ exports.checker = async () => {
/**@param {String} value */ /**@param {String} value */
const checkToken = (value) => { const checkToken = (value) => {
if (value.length < 40){ if (value.length < 40){
createError("'auth_token' | your token is invalid") createError("'token/value' | your token is invalid")
} }
if (value.includes(" ")) createError("'auth_token' | your token includes spaces!") if (value.includes(" ")) createError("'token/value' | your token includes spaces!")
} }
/**@param {String} value @param {String} path */ /**@param {String} value @param {String} path */
@@ -85,6 +85,9 @@ exports.checker = async () => {
/**@param {"userid"|"roleid"|"channelid"|"serverid"} mode @param {String[]} arrayValue @param {String} path */ /**@param {"userid"|"roleid"|"channelid"|"serverid"} mode @param {String[]} arrayValue @param {String} path */
const checkDiscordArray = (mode,arrayValue,path) => { const checkDiscordArray = (mode,arrayValue,path) => {
if (!Array.isArray(arrayValue)){
return createError("'"+path+"' | this needs to be an Array!")
}
if (mode == "userid"){ if (mode == "userid"){
arrayValue.forEach((value,index) => { arrayValue.forEach((value,index) => {
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){ if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
@@ -111,21 +114,34 @@ 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"){
createError("'"+path+"' | invalid type, this must be a boolean!") createError("'"+path+"' | invalid type, this must be a boolean!")
} return true
}else return false
}else if (type == "number"){ }else if (type == "number"){
if (typeof value != "number"){ if (typeof value != "number"){
createError("'"+path+"' | invalid type, this must be a number!") createError("'"+path+"' | invalid type, this must be a number!")
} return true
}else return false
}else if (type == "string"){ }else if (type == "string"){
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!")
} return true
} }else return false
}else if (type == "array"){
if (!Array.isArray(value)){
createError("'"+path+"' | invalid type, this must be an array!")
return true
}else return false
}else if (type == "object"){
if (typeof value != "object"){
createError("'"+path+"' | invalid type, this must be an object!")
return true
}else return false
}else return false
} }
const checkButtonColor = (value,path) => { const checkButtonColor = (value,path) => {
@@ -194,6 +210,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
@@ -218,14 +235,38 @@ 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!")
}
//autoclose
if (option.autoclose){
checkType(option.autoclose.enable,"boolean",path/"/autoclose/enable")
checkType(option.autoclose.inactiveHours,"number",path/"/autoclose/id")
}else{
createError("'"+path+"/autoclose' | there is no autoclose object!")
} }
}else if (type == "website"){ }else if (type == "website"){
@@ -308,22 +349,56 @@ exports.checker = async () => {
checkHexColor(input.color,path+"/color") checkHexColor(input.color,path+"/color")
} }
//ticket explaination & max tickets warning
checkType(input.enableTicketExplaination,"boolean",path+"/enableTicketExplaination")
checkType(input.enableMaxTicketsWarning,"boolean",path+"/enableMaxTicketsWarning")
//OPTIONS!!! //OPTIONS!!!
var counter = 0 if (checkType(input.options,"array",path+"/options")){
input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}}) var counter = 0
input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}})
if (counter == input.options.length){ if (counter == input.options.length){
createWarn("'"+path+"/options' | insert the option ids here!") createWarn("'"+path+"/options' | insert the option ids here!")
}else{
input.options.forEach((option,index) => {
if (!configParser.optionExists(option)){
createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!")
}
})
}
}
//other
//ticket explaination & max tickets warning
if (typeof input.other != "object"){
createError("'"+path+"/other' | this object doesn't exist!")
}else{ }else{
input.options.forEach((option,index) => { checkType(input.other.enableTicketExplaination,"boolean",path+"/other/enableTicketExplaination")
if (!configParser.optionExists(option)){ checkType(input.other.enableMaxTicketsWarning,"boolean",path+"/other/enableMaxTicketsWarning")
createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!")
} //customDropdownPlaceholder
}) if (typeof input.other.customDropdownPlaceholder != "object"){
createError("'"+path+"/other/customDropdownPlaceholder' | this object doesn't exist!")
}else{
checkType(input.other.customDropdownPlaceholder.enable,"boolean",path+"/other/customDropdownPlaceholder/enable")
checkType(input.other.customDropdownPlaceholder.text,"string",path+"/other/customDropdownPlaceholder/text")
if (input.other.customDropdownPlaceholder.enable && input.other.customDropdownPlaceholder.text.length < 1){createError("'"+path+"/other/customDropdownPlaceholder/text' | there is no placeholder text!")}
}
//customCategoryText
if (typeof input.other.customCategoryText != "object"){
createError("'"+path+"/other/customCategoryText' | this object doesn't exist!")
}else{
checkType(input.other.customCategoryText.enable,"boolean",path+"/other/customCategoryText/enable")
checkType(input.other.customCategoryText.text,"string",path+"/other/customCategoryText/text")
if (input.other.customCategoryText.enable && input.other.customCategoryText.text.length < 1){createError("'"+path+"/other/customCategoryText/text' | there is no category text!")}
}
//embedTitleURL
if (typeof input.other.embedTitleURL != "object"){
createError("'"+path+"/other/embedTitleURL' | this object doesn't exist!")
}else{
checkType(input.other.embedTitleURL.enable,"boolean",path+"/other/embedTitleURL/enable")
checkType(input.other.embedTitleURL.url,"string",path+"/other/embedTitleURL/text")
if (input.other.embedTitleURL.enable && input.other.embedTitleURL.url.length < 1){createError("'"+path+"/other/embedTitleURL/url' | there is no url!")}
}
} }
} }
@@ -333,29 +408,29 @@ exports.checker = async () => {
//--------------------------| //--------------------------|
//--------------------------| //--------------------------|
var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","credits","status","system","options","messages"] var configArray = ["color","serverId","token","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")
} }
}) })
checkHexColor(config.main_color,"main_color") checkHexColor(config.color,"main_color")
checkDiscord("serverid",config.server_id,"server_id") checkDiscord("serverid",config.serverId,"server_id")
if (!require("./api/api.json").disable.checkerjs.token) checkToken(config.auth_token) if (!require("./api/api.json").disable.checkerjs.token && !config.token.fromENV) checkToken(config.token.value)
checkDiscordArray("roleid",config.main_adminroles,"main_adminroles") checkType(config.adminRoles,"array","/main_adminroles")
checkDiscordArray("roleid",config.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") && !lf.startsWith("turkish") && !lf.startsWith("polish")){
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){
@@ -370,30 +445,28 @@ exports.checker = async () => {
//system: //system:
if (config.system.ticket_channel){ //max tickets
if (config.system.ticket_channel.length < 16 || config.system.ticket_channel.length > 20 || !/^\d+$/.test(config.system.ticket_channel)){ checkType(config.system.maxAmountOfTickets,"number","system/maxAmountOfTickets")
createError("'system/ticket_channel' | this channel id is invalid")
} //enableDMmessages
}else createWarn("'"+path+"' | you have no ticket channel selected!") checkType(config.system.dmMessages,"boolean","system/dmMessages")
checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets")
checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages") //memberRole
checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess") checkType(config.system.memberRole,"string","system/memberRole")
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.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
checkDiscord("roleid",config.system.member_role,"system/member_role") checkDiscord("roleid",config.system.memberRole,"system/memberRole")
}else{ }else{
createWarn("'system/member_role' | You don't have a member role, but it's recommended!") createWarn("'system/memberRole' | 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
@@ -407,29 +480,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===========================")
@@ -438,6 +488,9 @@ exports.checker = async () => {
const splitw = w.split("'") const splitw = w.split("'")
if (splitw.length > 1){ if (splitw.length > 1){
var splitstring = chalk.yellow(splitw[0])+chalk.blue("'"+splitw[1]+"'")+chalk.yellow(splitw[2]) var splitstring = chalk.yellow(splitw[0])+chalk.blue("'"+splitw[1]+"'")+chalk.yellow(splitw[2])
if (splitw[3]){splitstring = splitstring+chalk.yellow(splitw[3])}
if (splitw[4]){splitstring = splitstring+chalk.yellow(splitw[4])}
if (splitw[5]){splitstring = splitstring+chalk.yellow(splitw[5])}
}else {var splitstring = chalk.yellow(splitw[0])} }else {var splitstring = chalk.yellow(splitw[0])}
console.log(splitstring) console.log(splitstring)
}) })
@@ -0,0 +1,82 @@
const fs = require("fs")
const location = "./storage/database.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
* @returns {[{key:String,value:String}]|false}
*/
exports.getCategory = (category) => {
const currentData = getData()
const result = currentData.filter((v) => v.category == category)
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
}
@@ -37,3 +37,7 @@ exports.delete = (category,id) => {
ls.removeItem(category+"--"+id) ls.removeItem(category+"--"+id)
return true return true
} }
this.set("category","key","value")
this.get("category","key",)
this.delete("category","key")
+12 -6
View File
@@ -1,11 +1,17 @@
//Do not change this without knowing what you are doing!! /**
const databaseFile = "local" ==================================================================
//Do not change this without knowing what you are doing!! ALL DATABASE FILES NEED TO EXPORT THE FOLLOWING FUNCTIONS:
- get(category:String,key:String) => String (value)
- set(category:String,key:String,value:String) => Boolean (success)
- delete(category:String,key:String) => Boolean (success)
- getCategory(category:String) => Array[{key:String,value:String}] (key,value)
==================================================================
*/
try { try {
var db = require("./dynamicfiles/local") var db = require("./dynamicfiles/database")
}catch{ }catch(err){
console.log(err)
console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)") console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)")
process.exit(1) process.exit(1)
} }
+19 -4
View File
@@ -48,12 +48,13 @@ exports.serverError = (message) => {
return x return x
} }
/**@param {String[]} list */ /**@param {String[]} list @param {String|undefined} message */
exports.invalidIdChooseFromList = (list) => { exports.invalidIdChooseFromList = (list,message) => {
const beforemsg = message ? message+"\n\n" : ""
var x = new embed() var x = new embed()
.setColor(c.Red) .setColor(c.Red)
.setTitle(":x: "+l.errors.chooseFromListTitle) .setTitle(":x: "+l.errors.chooseFromListTitle)
.setDescription(l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`") .setDescription(beforemsg+l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
return x return x
} }
@@ -66,7 +67,7 @@ exports.notInATicket = new embed()
/**@param {String} message @param {String} title */ /**@param {String} message @param {String} title */
exports.success = (title,message) => { exports.success = (title,message) => {
var x = new embed() var x = new embed()
.setColor(config.main_color) .setColor(config.color)
.setTitle(":white_check_mark: "+title) .setTitle(":white_check_mark: "+title)
.setDescription(message) .setDescription(message)
@@ -93,10 +94,24 @@ exports.custom = (title,message,emoji,color) => {
return x return x
} }
exports.clearDebugFile = () => {
const fs = require("fs")
if (!fs.existsSync("./openticketdebug.txt")) return
const content = fs.readFileSync("./openticketdebug.txt").toString().split("\n")
if (content.length < 5000) return
for (let i = 0; i < 4000; i++) {
content.shift()
}
const newContent = "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="+content.join("\n")
fs.writeFileSync("./openticketdebug.txt",newContent)
}
const normalLog = (debugString) => { const normalLog = (debugString) => {
const fs = require("fs") const fs = require("fs")
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n==========================" const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
fs.writeFileSync("./openticketdebug.txt",content+"\nSYSTEM: "+debugString) fs.writeFileSync("./openticketdebug.txt",content+"\nSYSTEM: "+debugString)
this.clearDebugFile()
} }
/** /**
+16 -6
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -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("✔")
+65 -1
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -15,6 +15,13 @@ const bs = discord.ButtonStyle
exports.firstmsgRowNormal = new arb() exports.firstmsgRowNormal = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(false)
.setStyle(bs.Success)
.setLabel("Claim Ticket")
)
.addComponents( .addComponents(
new button() new button()
.setCustomId("OTcloseTicket") .setCustomId("OTcloseTicket")
@@ -33,6 +40,63 @@ exports.firstmsgRowNormal = new arb()
) )
exports.firstmsgRowDisabled = new arb() exports.firstmsgRowDisabled = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(false)
.setStyle(bs.Success)
.setLabel("Claim Ticket")
)
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(true)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
exports.firstmsgRowNormalNoClaim = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel("Claim Ticket")
)
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(false)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(false)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
exports.firstmsgRowDisabledNoClaim = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel("Claim Ticket")
)
.addComponents( .addComponents(
new button() new button()
.setCustomId("OTcloseTicket") .setCustomId("OTcloseTicket")
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
+23 -18
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
/** /**
* *
@@ -53,6 +53,21 @@ exports.closeEmbed = (closer,description) => {
return embd return embd
} }
/**
*
* @param {discord.User} closer
* @param {Number} time
* @returns {discord.EmbedBuilder}
*/
exports.autocloseSignalEmbed = (closer,time) => {
const embd = new embed()
.setTitle("⏰ This ticket got closed by Autoclose!")
.setColor(mc)
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
.setDescription("This ticket has been inactive for `"+time+"h`!")
return embd
}
/** /**
* *
* @param {discord.User} deleter * @param {discord.User} deleter
@@ -117,23 +132,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()})
}
} }
@@ -0,0 +1,51 @@
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 permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
//CLAIM
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTclaimTicket") return
try {
interaction.deferUpdate()
}catch{}
interaction.channel.messages.fetchPinned().then(msglist => {
/**@type {discord.Message} */
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
const hiddendata = hdraw.hiddenData
const ticketId = hiddendata.data.find(d => d.key == "type").value
hiddendata.data.push({key:"claimedby",value:interaction.user.id})
storage.set("claimData",interaction.channel.id,interaction.user.id)
const newEmbed = new embed(firstmsg.embeds[0].data)
.setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()})
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
if (!firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
}else if (firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
}
})
})
}
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -22,7 +22,9 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTcloseTicketTrue") return if (interaction.customId != "OTcloseTicketTrue") return
interaction.deferUpdate() try {
interaction.deferUpdate()
} catch{}
if (closeTicketButtonChecker == true) return if (closeTicketButtonChecker == true) return
closeTicketButtonChecker = true closeTicketButtonChecker = true
@@ -39,8 +41,17 @@ module.exports = () => {
return return
} }
} }
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
const claimdata = storage.get("claimData",interaction.channel.id)
if (claimdata && claimdata != "false"){
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim]})
}else{
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled]})
}
}else{
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
}
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
/** /**
* @type {String} * @type {String}
@@ -55,7 +66,7 @@ module.exports = () => {
}) })
interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true) await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",false,true)
closeTicketButtonChecker = false closeTicketButtonChecker = false
}) })
} }
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -93,7 +93,7 @@ module.exports = () => {
}) })
//interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]}) //interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",reason,true) await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",reason,true)
closeTicketButtonChecker = false closeTicketButtonChecker = false
}) })
} }
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -50,9 +50,9 @@ 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 require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true) await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketActions/ticketCloser").closeManager(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").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker1 = false deleteTicketButtonChecker1 = false
}) })
} }
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -1,6 +1,5 @@
module.exports = () => { module.exports = () => {
require("./firstmsg")() require("./firstmsg")()
require("./sendTranscript")()
require("./verifyBars")() require("./verifyBars")()
//accepted //accepted
@@ -8,4 +7,5 @@ module.exports = () => {
require("./accepted/reopening")() require("./accepted/reopening")()
require("./accepted/deleting")() require("./accepted/deleting")()
require("./accepted/closingReason")() require("./accepted/closingReason")()
require("./accepted/claiming")()
} }
@@ -1,44 +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
interaction.deferUpdate()
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{}
})
}
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const storage = bot.storage const storage = bot.storage
const hiddendata = bot.hiddenData const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder const embed = discord.EmbedBuilder
const mc = config.main_color const mc = config.color
const button = discord.ButtonBuilder const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder const arb = discord.ActionRowBuilder
@@ -20,7 +20,9 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTcloseTicket") return if (interaction.customId != "OTcloseTicket") return
interaction.deferUpdate() try {
interaction.deferUpdate()
} catch{}
interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]}) interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]})
}) })
@@ -28,8 +30,20 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTcloseTicketFalse") return if (interaction.customId != "OTcloseTicketFalse") return
interaction.deferUpdate() try {
interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) interaction.deferUpdate()
} catch{}
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
const claimdata = storage.get("claimData",interaction.channel.id)
if (claimdata && claimdata != "false"){
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim]})
}else{
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal]})
}
}else{
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
}
}) })
//DELETE //DELETE
@@ -37,7 +51,9 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicket") return if (interaction.customId != "OTdeleteTicket") return
interaction.deferUpdate() try {
interaction.deferUpdate()
} catch{}
interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]}) interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]})
}) })
@@ -45,8 +61,20 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicketFalse") return if (interaction.customId != "OTdeleteTicketFalse") return
interaction.deferUpdate() try {
interaction.message.edit({components:[bot.buttons.close.openRowNormal]}) interaction.deferUpdate()
} catch{}
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
const claimdata = storage.get("claimData",interaction.channel.id)
if (claimdata && claimdata != "false"){
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim]})
}else{
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal]})
}
}else{
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
}
}) })
//DELETE NO TRANSCRIPT //DELETE NO TRANSCRIPT
@@ -54,7 +82,9 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicket1") return if (interaction.customId != "OTdeleteTicket1") return
interaction.deferUpdate() try {
interaction.deferUpdate()
} catch{}
interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]}) interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]})
}) })
@@ -62,7 +92,9 @@ module.exports = () => {
if (!interaction.isButton()) return if (!interaction.isButton()) return
if (interaction.customId != "OTdeleteTicketFalse1") return if (interaction.customId != "OTdeleteTicketFalse1") return
interaction.deferUpdate() try {
interaction.deferUpdate()
} catch{}
interaction.message.edit({components:[bot.buttons.close.closeCommandRow]}) interaction.message.edit({components:[bot.buttons.close.closeCommandRow]})
}) })
} }
+13 -16
View File
@@ -1,33 +1,30 @@
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)
index.actionRecorder.push({
category:"ot.managers.language",
file:"./core/languageManager.js",
time:new Date().getTime(),
type:"language.success"
})
} }
if (!localLanguage){ if (!localLanguage){
@@ -38,5 +35,5 @@ if (!localLanguage){
runError() runError()
}else{ }else{
exports.language = localLanguage exports.language = localLanguage
successLog(config.languagefile) successLog(config.languageFile)
} }
+7
View File
@@ -0,0 +1,7 @@
██████╗ ██████╗ ███████╗███╗ ██╗ ████████╗██╗ ██████╗██╗ ██╗███████╗████████╗
██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ╚══██╔══╝██║██╔════╝██║ ██╔╝██╔════╝╚══██╔══╝
██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ ██║██║ █████╔╝ █████╗ ██║
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
+72 -43
View File
@@ -12,64 +12,93 @@ module.exports = async () => {
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",(interaction) => {
if (!interaction.isButton()) return if (!interaction.isButton() && !interaction.isStringSelectMenu()) return
if (!interaction.customId.startsWith("newR")) return if (interaction.isButton() && !interaction.customId.startsWith("newR")) return
if (interaction.isStringSelectMenu() && !(interaction.customId == "OTdropdownMenu")) return
interaction.deferUpdate() bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.interactionCreated"
})
if (interaction.customId.startsWith("newR")){
const optionid = interaction.customId.split("newR")[1]
if (!optionid){
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]})
return
}
const optionidRaw = interaction.isStringSelectMenu() ? interaction.values[0] : interaction.customId
if (!optionidRaw.includes("newR")) return
const optionid = optionidRaw.split("newR")[1]
if (!optionid){
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]})
return
}else{
try { try {
interaction.deferUpdate()
} catch{}
}
const option = require("./utils/getButton").getOption(optionid) try {
/**@type {"add"|"remove"|"add&remove"} */
const mode = option.mode
const user = interaction.member
if (mode == "add"){ const option = require("./utils/getButton").getOption(optionid)
option.roles.forEach((role) => { /**@type {"add"|"remove"|"add&remove"} */
const mode = option.mode
const user = interaction.member
if (mode == "add"){
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.type.add"
})
option.roles.forEach((role) => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
})
}else if (mode == "remove"){
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.type.remove"
})
option.roles.forEach((role) => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
})
}else if (mode == "add&remove"){
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.type.add&remove"
})
option.roles.forEach((role) => {
if (!interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role) interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role) const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("add","add",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}) }else {
}else if (mode == "remove"){
option.roles.forEach((role) => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role) interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}]) log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role) const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("remove","remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date()) APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}) }
})
}else if (mode == "add&remove"){
option.roles.forEach((role) => {
if (interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("add","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}else {
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
const apirole = interaction.guild.roles.cache.find(r => r.id == role)
APIEvents.onReactionRole("remove","add&remove",apirole,interaction.user,interaction.channel,interaction.guild,new Date())
}
})
}
}catch{
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]})
} }
}catch{
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]})
} }
}) })
} }
+87
View File
@@ -0,0 +1,87 @@
const discord = require("discord.js")
const bot = require("../../index")
const client = require("../../index").client
const config = bot.config
const configParser = require("../utils/configParser")
const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType
module.exports = async () => {
const sid = config.serverId
const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */
var choices = []
ids.forEach((id) => {
const option = configParser.getTicketById(id)
if (option){
choices.push({name:option.name,value:option.id})
}
})
/**@type {[{name:String,value:String}]} */
var msgchoices = []
config.messages.forEach((msg) => {
msgchoices.push({name:msg.id,value:msg.id})
})
//slashtranslation
const ST = require("../../language/slashcmds/slash.json").data
//create a ticket (/new or /ticket)
client.application.commands.create({
name:"ticket",
description:"Create a ticket!",
descriptionLocalizations:ST.newticket,
defaultPermission:true,
type:act.ChatInput,
options:[
{
type:acot.String,
name:"type",
description:"The type of ticket.",
required:true,
choices:choices
}
]
},sid)
client.application.commands.create({
name:"new",
description:"Create a ticket!",
defaultPermission:true,
type:act.ChatInput,
descriptionLocalizations:ST.newticket,
options:[
{
type:acot.String,
name:"type",
description:"The type of ticket.",
required:true,
choices:choices
}
]
},sid)
//msg
client.application.commands.create({
name:"message",
description:"Create a ticket message.",
defaultPermission:true,
descriptionLocalizations:ST.message,
type:act.ChatInput,
options:[
{
type:acot.String,
name:"id",
description:"The message id.",
required:true,
choices:msgchoices,
max_length:30
}
]
},sid)
}
+36 -11
View File
@@ -7,9 +7,10 @@ const configParser = require("../utils/configParser")
const act = discord.ApplicationCommandType const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType const acot = discord.ApplicationCommandOptionType
module.exports = async () => { /**@param {Boolean|undefined} invisible*/
module.exports = async (invisible) => {
const chalk = (await import("chalk")).default const chalk = (await import("chalk")).default
const sid = config.server_id const sid = config.serverId
const ids = configParser.getTicketValuesArray("id") const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */ /**@type {[{name:String,value:String}]} */
@@ -30,15 +31,20 @@ module.exports = async () => {
var readystats = 0 var readystats = 0
//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(() => { if (!invisible){
process.stdout.cursorTo(0) setInterval(() => {
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 12")+" commands ready! (this can take up to 40 seconds)") process.stdout.cursorTo(0)
if (readystats >= 12){ process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 13")+" commands ready! (this can take up to 40 seconds)")
console.log(chalk.green("\nready!")) if (readystats >= 13){
console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!")) console.log(chalk.green("\nready!"))
process.exit(1) console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!"))
} process.exit(1)
},100) }
},100)
}
const fs = require("fs")
fs.writeFileSync("./storage/slashcmdEnabled.txt",require("../../package.json").version)
//slashtranslation //slashtranslation
const ST = require("../../language/slashcmds/slash.json").data const ST = require("../../language/slashcmds/slash.json").data
@@ -243,4 +249,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++
})
} }
+79
View File
@@ -0,0 +1,79 @@
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 (process.argv.some((v) => v == "--noslash")) console.log(chalk.blue("[FLAGS] => slash commands disabled")); isFlag = true
if (process.argv.some((v) => v == "--localstatus")) console.log(chalk.blue("[FLAGS] => using local livestatus.json")); isFlag = true
if (process.argv.some((v) => v == "--noerrorupload")) console.log(chalk.blue("[FLAGS] => not uploading errors to liveStatus")); 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(updatingslash))
}
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("LIVESTATUS:")))
await require("./utils/liveStatus").run(plugins)
console.log("\n"+chalk.bold(chalk.underline("LOGS:")))
}
+48
View File
@@ -0,0 +1,48 @@
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
module.exports = () => {
setInterval(async () => {
const tickets = storage.getCategory("autocloseTickets")
if (!tickets) return
tickets.forEach(async (t) => {
if (t.value == "false" || t.value == 0 || typeof t.value != "number") return
const channel = await client.channels.fetch(t.key,{cache:true})
if (!channel || !channel.isTextBased()) return
const message = (await channel.messages.fetch({limit:10})).first()
if (!message) return
const secondsSLM = Math.round((new Date().getTime() - message.createdTimestamp)/1000)
const hoursSLM = secondsSLM/3600
if (hoursSLM > t.value){
/**@type {discord.Guild|false} */
const guild = client.guilds.cache.find((g) => g.id == channel.guild.id)
if (!guild) return
const clientMember = guild.members.cache.find((m) => m.id == client.user.id)
if (!clientMember) return
var name = channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("./ticketCloser").closeManager(clientMember,channel,prefix,"close","OTautoclose",true)
storage.delete("autocloseTickets",channel.id)
channel.send({embeds:[bot.embeds.commands.autocloseSignalEmbed(client.user,t.value)],components:[bot.buttons.close.closeCommandRow]})
}
})
},2000)
}
+56 -131
View File
@@ -18,11 +18,10 @@ const pendingDelete = []
* @param {Boolean} nomessage * @param {Boolean} nomessage
* @param {String} reason only when closing, not when deleting! * @param {String} reason only when closing, not when deleting!
*/ */
exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => { exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
const guild = channel.guild const guild = channel.guild
const user = member.user const user = member.user
const chalk = await (await import("chalk")).default const chalk = await (await import("chalk")).default
const channelmessages = await channel.messages.fetch()
const newReason = reason ? reason : l.messages.none const newReason = reason ? reason : l.messages.none
@@ -31,15 +30,12 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
//FIX CHANNEL COULD BE CLOSED AFTER DELETE: //FIX CHANNEL COULD BE CLOSED AFTER DELETE:
if (pendingDelete.includes(channel.id)) return false if (pendingDelete.includes(channel.id)) return false
//remove ot bot from transcript
channelmessages.sweep((msgSweep) => {return msgSweep.author.id == client.user.id})
/**@type {String}*/ /**@type {String}*/
const channelname = channel.name const channelname = channel.name
const ticketOpenerChannelName = channelname.split(prefix)[1] const ticketOpenerChannelName = channelname.split(prefix)[1]
//get user that opened the ticket //get user that opened the ticket
var getuserID = storage.get("userTicketStorage",channel.id) var getuserID = storage.get("userFromChannel",channel.id)
try { try {
var ticketOpener = client.users.cache.find(u => u.id === getuserID) var ticketOpener = client.users.cache.find(u => u.id === getuserID)
var isDatabaseError = false var isDatabaseError = false
@@ -53,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
@@ -70,7 +66,11 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
pendingDelete.push(channel.id) pendingDelete.push(channel.id)
if (!isDatabaseError) storage.set("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1) if (!isDatabaseError) storage.set("amountOfUserTickets",getuserID,Number(storage.get("amountOfUserTickets",getuserID)) - 1)
storage.delete("userFromChannel",channel.id)
storage.delete("claimData",channel.id)
storage.delete("autocloseTickets",channel.id)
if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0)
//getID & send DM & send api event //getID & send DM & send api event
await channel.messages.fetchPinned().then(async msglist => { await channel.messages.fetchPinned().then(async msglist => {
@@ -92,12 +92,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"){
@@ -129,7 +123,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
}) })
//add main adminroles //add main adminroles
config.main_adminroles.forEach((role,index) => { config.adminRoles.forEach((role,index) => {
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -144,10 +138,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)
@@ -169,7 +174,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
*/ */
const ticketadmin = ticketData.adminroles const ticketadmin = ticketData.adminroles
ticketadmin.forEach((role,index) => { ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){ if (!config.adminRoles.includes(role)){
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -191,37 +196,11 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
if (!nomessage){ if (!nomessage){
//message //message
var closeButtonRow = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTdeleteTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTsendTranscript")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Secondary)
.setLabel(l.buttons.sendTranscript)
.setEmoji("📄")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTreopenTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Success)
.setLabel(l.buttons.reopen)
.setEmoji("✔")
)
const embed = new discord.EmbedBuilder() const embed = new discord.EmbedBuilder()
.setColor(config.main_color) .setColor(config.color)
.setTitle(":lock: "+l.messages.closedTitle+" :lock:") .setTitle(":lock: "+l.commands.closeTitle+" :lock:")
.setDescription(l.messages.closedDescription) .setDescription(l.messages.closedDescription)
channel.send({embeds:[embed],components:[closeButtonRow]}) channel.send({embeds:[embed],components:[bot.buttons.close.closeCommandRow]})
} }
log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}]) log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
@@ -241,105 +220,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
} }
if (enableTranscript == true && mode != "deletenotranscript"){ const transcriptHandler = async () => {
if (!bot.tsconfig.sendTranscripts.enableChannel && !bot.tsconfig.sendTranscripts.enableDM) return false
const transcriptReason = (mode == "close") ? "**"+l.messages.reason+":** "+newReason : "**"+l.messages.reason+":** "+l.messages.none const APIEvents = require("../api/modules/events")
const closedByPrefix = (mode.startsWith("delete")) ? l.messages.deletedby : l.messages.closedby const messages = await getmessages(channel,5000)
await require("../transcriptSystem/manager")(messages,guild,channel,user,reason)
if (config.system.enable_transcript || config.system.enable_DM_transcript){ 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 () => {
if (deleteRequired){ if (deleteRequired){
//const timer = () => {return new Promise((resolve,reject) => {
// setTimeout(() => {resolve(true)},7000)
//})}
//await timer()
setTimeout(async () => {
pendingDelete.shift() pendingDelete.shift()
await channel.delete() await channel.delete()
},6000) }
} }
if (mode == "delete" || mode == "deletenotranscript") await transcriptHandler()
deleteHandler()
} }
+58 -41
View File
@@ -11,9 +11,11 @@ const storage = bot.storage
module.exports = () => { module.exports = () => {
//dropdown placeholder //dropdown placeholder
client.on("interactionCreate",(interaction) => { client.on("interactionCreate",(interaction) => {
if (!interaction.isSelectMenu()) return if (!interaction.isStringSelectMenu()) return
if (interaction.customId != "OTdropdownMenu") return if (interaction.customId != "OTdropdownMenu") return
if (interaction.values.includes("OTChooseTicket")) interaction.deferUpdate() if (interaction.values.includes("OTChooseTicket")){
interaction.deferUpdate()
}
}) })
@@ -26,7 +28,7 @@ module.exports = () => {
var customId = "OTnewT"+interaction.options.getString("type") var customId = "OTnewT"+interaction.options.getString("type")
}else if (interaction.isButton()){ }else if (interaction.isButton()){
var customId = interaction.customId var customId = interaction.customId
}else if (interaction.isSelectMenu() && (interaction.customId == "OTdropdownMenu")){ }else if (interaction.isStringSelectMenu() && (interaction.customId == "OTdropdownMenu")){
var customId = interaction.values[0] var customId = interaction.values[0]
}else return }else return
@@ -50,25 +52,21 @@ module.exports = () => {
if (currentTicketOptions == false) return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]}) if (currentTicketOptions == false) return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]})
if (interaction.isButton()){ if (interaction.isButton()){
interaction.deferUpdate() try {
if (config.system.answerInEphemeralOnOpen) await interaction.deferReply({ephemeral:true})
} catch{}
}else if (interaction.isChatInputCommand()){ }else if (interaction.isChatInputCommand()){
interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)]}) await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
}else if (interaction.isSelectMenu()){ }else if (interaction.isStringSelectMenu()){
await interaction.deferUpdate() try {
await interaction.deferUpdate()
} catch{}
} }
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("amountOfUserTickets",interaction.member.id) == null || storage.get("amountOfUserTickets",interaction.member.id) == "false"|| Number(storage.get("amountOfUserTickets",interaction.member.id)) < config.system.maxAmountOfTickets){
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("amountOfUserTickets",interaction.member.id,Number(storage.get("amountOfUserTickets",interaction.member.id))+1)
var ticketNumber = interaction.member.user.username var ticketNumber = interaction.member.user.username
//set ticketName //set ticketName
@@ -86,19 +84,12 @@ module.exports = () => {
const pfb = discord.PermissionFlagsBits const pfb = discord.PermissionFlagsBits
const guild = client.guilds.cache.find(g => g.id == interaction.guild.id) const guild = client.guilds.cache.find(g => g.id == interaction.guild.id)
//set everyone allowed //set @everyone no ticket access
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({ permissionsArray.push({
id:interaction.guild.roles.everyone, id:interaction.guild.roles.everyone,
type:"role", type:"role",
allow:everyoneAllowPerms, allow:[],
deny:everyoneDenyPerms deny:[pfb.ViewChannel]
}) })
//add the user that created the ticket //add the user that created the ticket
@@ -109,7 +100,7 @@ module.exports = () => {
}) })
//add main adminroles //add main adminroles
config.main_adminroles.forEach((role,index) => { config.adminRoles.forEach((role,index) => {
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -130,7 +121,7 @@ module.exports = () => {
*/ */
const ticketadmin = currentTicketOptions.adminroles const ticketadmin = currentTicketOptions.adminroles
ticketadmin.forEach((role,index) => { ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){ if (!config.adminRoles.includes(role)){
try { try {
const adminrole = guild.roles.cache.find(r => r.id == role) const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return if (!adminrole) return
@@ -147,17 +138,18 @@ module.exports = () => {
}) })
//add member role //add 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.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
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.memberRole)
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/memberRole")
} }
} }
@@ -170,15 +162,21 @@ module.exports = () => {
permissionOverwrites:permissionsArray permissionOverwrites:permissionsArray
}).then((ticketChannel) => { }).then((ticketChannel) => {
storage.set("userTicketStorage",ticketChannel.id,interaction.member.id) storage.set("userFromChannel",ticketChannel.id,interaction.member.id)
if (currentTicketOptions.autoclose.enable) storage.set("autocloseTickets",ticketChannel.id,currentTicketOptions.autoclose.inactiveHours)
const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}]) const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
var ticketEmbed = new discord.EmbedBuilder() var ticketEmbed = new discord.EmbedBuilder()
//.setAuthor({name:interaction.user.id}) //.setAuthor({name:interaction.user.id})
.setColor(config.main_color) .setColor(config.color)
.setTitle(currentTicketOptions.name) .setTitle(currentTicketOptions.name)
//.setFooter({text:"Ticket Type: "+currentTicketOptions.id}) //.setFooter({text:"Ticket Type: "+currentTicketOptions.id})
if (currentTicketOptions.autoclose.enable){
const footerText = l.commands.autocloseTitle.replace("{0}",currentTicketOptions.autoclose.inactiveHours+"h")
ticketEmbed.setFooter({text:footerText})
}
if (currentTicketOptions.ticketmessage.length > 0){ if (currentTicketOptions.ticketmessage.length > 0){
ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata) ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata)
}else{ }else{
@@ -186,6 +184,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",
@@ -198,10 +197,28 @@ 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(l.commands.goToTicket)
.setURL(ticketChannel.url)
])
try{
if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.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 {
if (config.system.enable_DM_Messages){ if (config.system.dmMessages){
interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]}) interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]})
} }
} }
+3 -10
View File
@@ -19,19 +19,12 @@ const reopenTicket = (guild,channel,user) => {
var permissionsArray = [] var permissionsArray = []
//set everyone allowed //set @everyone no ticket access
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
permissionsArray.push({ permissionsArray.push({
id:guild.roles.everyone, id:guild.roles.everyone,
type:"role", type:"role",
allow:everyoneAllowPerms, allow:[],
deny:everyoneDenyPerms deny:[pfb.ViewChannel]
}) })
channel.permissionOverwrites.cache.forEach((p) => { channel.permissionOverwrites.cache.forEach((p) => {
-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.3.0",
"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.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.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)
}
+60
View File
@@ -0,0 +1,60 @@
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)
//empty message handling
if (msg.content){
var content = msg.content
}else if (msg.embeds.length > 0 && msg.attachments.length > 0){
var content = "*this message only has embeds & files*"
}else if (msg.embeds.length > 0){
var content = "*this message only has embeds*"
}else if (msg.attachments.length > 0){
var content = "*this message only has files*"
}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
}
+6 -5
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}, autoclose:{enable:Boolean,inactiveHours:Number} }} 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 */
@@ -16,10 +16,13 @@ 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[], enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean}} 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}, autoclose:{enable:Boolean,inactiveHours:Number}}} 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 */
/** /**
* *
+6 -24
View File
@@ -32,6 +32,12 @@ exports.getOption = getOption
* @returns {discord.ButtonBuilder|false} * @returns {discord.ButtonBuilder|false}
*/ */
exports.getButton = (id) => { exports.getButton = (id) => {
bot.actionRecorder.push({
category:"ot.managers.utils",
file:"./core/utils/getButton.js",
time:new Date().getTime(),
type:"getbutton"
})
const option = getOption(id) const option = getOption(id)
if (!option) return false if (!option) return false
if (option.type == "ticket"){ if (option.type == "ticket"){
@@ -68,27 +74,3 @@ exports.getButton = (id) => {
return button return button
} }
exports.rawButtonData = class {
constructor() {
this.id = ""
this.name = ""
this.description = ""
this.icon = ""
this.label = ""
this.type = ""
this.color = ""
this.enableDmOnOpen = true
this.url = ""
this.roles = ["",""]
this.mode = ""
this.adminroles = ["",""]
this.channelprefix = ""
this.category = ""
this.message = ""
this.ticketmessage = ""
}
}
+31 -7
View File
@@ -7,26 +7,34 @@ const configParser = require("./configParser")
/** /**
* *
* @param {String[]} ids * @param {String[]} ids
* @returns {discord.SelectMenuBuilder|false} * @param {String|undefined|false} placeholder
* @returns {discord.StringSelectMenuBuilder|false}
*/ */
exports.getDropdown = (ids) => { exports.getDropdown = (ids,placeholder) => {
const dropdown = new discord.SelectMenuBuilder() bot.actionRecorder.push({
category:"ot.managers.utils",
file:"./core/utils/getDropdown.js",
time:new Date().getTime(),
type:"getdropdown"
})
const dropdown = new discord.StringSelectMenuBuilder()
.setCustomId("OTdropdownMenu") .setCustomId("OTdropdownMenu")
.setDisabled(false) .setDisabled(false)
.setMaxValues(1) .setMaxValues(1)
.setMinValues(1) .setMinValues(1)
.setPlaceholder(l.messages.chooseATicket) .setPlaceholder(placeholder || l.messages.chooseATicket)
.addOptions( .addOptions(
new discord.SelectMenuOptionBuilder() new discord.StringSelectMenuBuilder()
.setDefault(true) .setDefault(true)
.setLabel(l.messages.chooseATicket) .setLabel(placeholder || l.messages.chooseATicket)
.setValue("OTChooseTicket") .setValue("OTChooseTicket")
) )
ids.forEach((id) => { ids.forEach((id) => {
const option = configParser.getTicketById(id,true) const option = configParser.getTicketById(id,true)
const roleoption = configParser.getRoleById(id,true)
if (option){ if (option){
const selectComponent = new discord.SelectMenuOptionBuilder() const selectComponent = new discord.StringSelectMenuOptionBuilder()
.setDefault(false) .setDefault(false)
.setValue("OTnewT"+option.id) .setValue("OTnewT"+option.id)
@@ -35,10 +43,26 @@ exports.getDropdown = (ids) => {
}else{ }else{
if (option.label) selectComponent.setLabel(option.label) if (option.label) selectComponent.setLabel(option.label)
if (option.icon) selectComponent.setEmoji(option.icon) if (option.icon) selectComponent.setEmoji(option.icon)
if (option.description) selectComponent.setDescription(option.description)
}
dropdown.addOptions(selectComponent)
}else if (roleoption){
const selectComponent = new discord.StringSelectMenuOptionBuilder()
.setDefault(false)
.setValue("OTnewR"+roleoption.id)
if (!roleoption.label && !roleoption.icon){
selectComponent.setLabel("OT ERROR: no description/emoji")
}else{
if (roleoption.label) selectComponent.setLabel(roleoption.label)
if (roleoption.icon) selectComponent.setEmoji(roleoption.icon)
} }
dropdown.addOptions(selectComponent) dropdown.addOptions(selectComponent)
} }
}) })
+21 -8
View File
@@ -14,12 +14,18 @@ const l = bot.language
exports.createEmbed = (id) => { exports.createEmbed = (id) => {
bot.actionRecorder.push({
category:"ot.managers.utils",
file:"./core/utils/getEmbed.js",
time:new Date().getTime(),
type:"getembed"
})
//----------------------------------- //-----------------------------------
//general importing //general importing
const data = require("./configParser").getConfigMessage(id) const data = require("./configParser").getConfigMessage(id)
/**@type {discord.ButtonBuilder[]}*/ /**@type {discord.ButtonBuilder[]}*/
var buttons = [] var buttons = []
/**@type {getButton.rawButtonData[]} */ /**@type {import('./configParser').OTAllOptions[]} */
var buttonData = [] var buttonData = []
data.options.forEach((option) => { data.options.forEach((option) => {
@@ -35,17 +41,23 @@ 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)
}else{ }else{
embed.setColor(config.main_color) embed.setColor(config.color)
} }
if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL.url)
var description = data.description var description = data.description
if (data.enableTicketExplaination){ if (data.other.enableTicketExplaination){
description = description+"\n\n__"+l.messages.chooseCategory+"__\n" const chooseCategoryMSG = data.other.customCategoryText.enable ? data.other.customCategoryText.text : l.messages.chooseATicket
description = description+"\n\n__"+chooseCategoryMSG+"__\n"
var ticketExplainations = [] var ticketExplainations = []
buttonData.forEach((button) => { buttonData.forEach((button) => {
@@ -56,8 +68,8 @@ exports.createEmbed = (id) => {
description = description+ticketExplainations.join("\n\n") description = description+ticketExplainations.join("\n\n")
} }
if (data.enableMaxTicketsWarning){ if (data.other.enableMaxTicketsWarning){
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.max_allowed_tickets) description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.maxAmountOfTickets)
} }
if (description) embed.setDescription(description) if (description) embed.setDescription(description)
@@ -92,7 +104,8 @@ exports.createEmbed = (id) => {
//create the component IF DROPDOWN is true //create the component IF DROPDOWN is true
}else{ }else{
const ids = data.options const ids = data.options
const dropdown = require("./getDropdown").getDropdown(ids) const customPlaceholder = data.other.customDropdownPlaceholder.enable ? data.other.customDropdownPlaceholder.text : false
const dropdown = require("./getDropdown").getDropdown(ids,customPlaceholder)
var componentRows = [ var componentRows = [
new discord.ActionRowBuilder() new discord.ActionRowBuilder()
.setComponents(dropdown) .setComponents(dropdown)
+184 -3
View File
@@ -3,13 +3,194 @@ const bot = require('../../index')
const client = bot.client const client = bot.client
const config = bot.config const config = bot.config
const log = bot.errorLog.log const log = bot.errorLog.log
const axios = require("axios").default
const fs = require("fs")
const loadChalk = async () => { const loadChalk = async () => {
return await (await import("chalk")).default return await (await import("chalk")).default
} }
module.exports = async () => { //OTLiveStatus
const chalk = await loadChalk() /**@typedef {[{style:[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}],active:{versions:String[],languages:String[],usingPlugins:["yes"|"no"|"both"],usingSlashCommands:["yes"|"no"|"both"],transcripts:["html"|"text"|"both"]}}]} OTLiveStatus */
//LIVESTATUS SOON //OTLiveStatusError
/**@typedef {{bot:{id:String,pfp:String,name:String}, openticket:{version:String,language:String, slashcmds:Boolean,transcripts:false|"text"|"html",config:{system:{},options:{},messages:{},transcripts:{}},plugins:String[],pluginload:{success:Number,error:Number,total:Number}}, details:{actions:[{type:String,category:String,file:String,time:Number}],errortime:Number}, error:String}} OTLiveStatusError */
/**@type {[{type:String, category:String, file:String, time:Number}]} */
exports.actionRecorder = []
//================================================================
//=========================FUNCTIONS==============================
//================================================================
const getSlashEnabled = () => {
if (!fs.existsSync("./storage/slashcmdEnabled.txt")) return false
if (fs.readFileSync("./storage/slashcmdEnabled.txt").toString() == require("../../package.json").version){
return true
}else return false
}
/**
* @param {Boolean} [local=false]
* @returns {Promise<OTLiveStatus|false>}
*/
const getLivestatus = (local) => {
return new Promise((resolve,reject) => {
if (local){
try {
const livestatus = require("../../livestatus.json")
if (!livestatus) return resolve(false)
resolve(livestatus)
}catch{
return resolve(false)
}
}else{
try {
axios.get("https://livestatus.dj-dj.be/openticket.json").then((res) => {
const livestatus = res.data
if (!Array.isArray(livestatus)) return resolve(false)
if (!livestatus) return resolve(false)
resolve(livestatus)
})
}catch{
return resolve(false)
}
}
})
}
var globalPluginData = {total:0,error:0,success:0}
//announcer
/**@param {{total:Number,error:Number,success:Number}} pluginData*/
exports.run = async (pluginData) => {
const chalk = await loadChalk()
globalPluginData = pluginData
const res = await getLivestatus(process.argv.some((v) => v == "--localstatus"))
if (!res) return false
if (res.length == 0) return
/**@type {[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}]} */
const activeStyles = []
res.forEach((announcement) => {
const a = announcement.active
const isLanguage = a.languages.includes(config.languageFile) || a.languages.includes("all")
const isVersion = a.versions.includes(require("../../package.json").version)
var tsenabled = (bot.tsconfig.sendTranscripts.enableChannel || bot.tsconfig.sendTranscripts.enableDM)
var tsmode = bot.tsconfig.sendTranscripts.useHTMLtranscripts ? "html" : "text"
const isTranscript = (a.transcripts.includes("html") && tsmode == "html" && tsenabled) || (a.transcripts.includes("text") && tsmode == "text" && tsenabled) || (a.transcripts.includes("both") && tsenabled)
const isPlugins = (a.usingPlugins.includes("yes") && pluginData.total > 0) || (a.usingPlugins.includes("no") && pluginData.total == 0) || (a.usingPlugins.includes("both"))
const isSlashCMD = (a.usingSlashCommands.includes("yes") && getSlashEnabled()) || (a.usingSlashCommands.includes("no") && !getSlashEnabled()) || (a.usingSlashCommands.includes("both"))
if (!isLanguage || !isVersion || !isTranscript || !isPlugins || !isSlashCMD) return
announcement.style.forEach((s) => activeStyles.push(s))
})
const final = []
activeStyles.forEach((style) => {
const dc = style.descriptionColor
const tempd = style.description.split("\n")
const tc = style.titleColor
const t = "["+style.title+"]"
const tempd2 = []
tempd.forEach((tmpd,i) => {
if (i > 0){
var newtext = tmpd
var i2 = 0
while(i2 < t.length+1){
newtext = " "+newtext
i2++
}
tempd2.push(newtext)
}else{
tempd2.push(tmpd)
}
})
const d = tempd2.join("\n")
var fd = d
if (dc == "normal" || dc == "white") fd = chalk.white(d)
if (dc == "red") fd = chalk.red(d)
if (dc == "yellow") fd = chalk.yellow(d)
if (dc == "green") fd = chalk.green(d)
if (dc == "blue") fd = chalk.blue(d)
if (dc == "gray") fd = chalk.gray(d)
if (dc == "magenta") fd = chalk.magenta(d)
if (dc == "cyan") fd = chalk.cyan(d)
var ft = t
if (tc == "normal" || tc == "white") ft = chalk.white(t)
if (tc == "red") ft = chalk.red(t)
if (tc == "yellow") ft = chalk.yellow(t)
if (tc == "green") ft = chalk.green(t)
if (tc == "blue") ft = chalk.blue(t)
if (tc == "gray") ft = chalk.gray(t)
if (tc == "magenta") ft = chalk.magenta(t)
if (tc == "cyan") ft = chalk.cyan(t)
final.push(ft+" "+fd)
})
console.log(final.join("\n\n"))
}
/**@param {OTLiveStatusError} options @returns {Promise<Boolean>} */
const uploadLiveStatus = (options) => {
return new Promise((resolve,reject) => {
if (process.argv.some((v) => v == "--noerrorupload")) return resolve(true)
try {
var data = encodeURIComponent(JSON.stringify(options))
axios.get("https://livestatus.dj-dj.be/openticket?auth=openticketLIVESTATUS1234&data="+data).then((res) => {
if (res.status == 200) resolve(true)
else resolve(false)
})
}catch{
resolve(false)
}
})
}
/**@param {String} err @returns {Promise<Boolean>}*/
exports.liveStatusUploadManager = async (err) => {
return new Promise(async (resolve) => {
if (process.argv.some((v) => v == "--noerrorupload")) return resolve(true)
else{
var tsenabled = (bot.tsconfig.sendTranscripts.enableChannel || bot.tsconfig.sendTranscripts.enableDM)
var tsmode = bot.tsconfig.sendTranscripts.useHTMLtranscripts ? "html" : "text"
const transcriptMode = tsenabled ? tsmode : false
const slashMode = getSlashEnabled()
try {
resolve(await uploadLiveStatus({
bot:{
id:client.user.id,
name:client.user.tag,
pfp:client.user.displayAvatarURL()
},
error:err,
openticket:{
config:{
messages:config.messages,
options:config.options,
transcripts:bot.tsconfig,
system:config.system
},
language:config.languageFile,
version:require("../../package.json").version,
slashcmds:slashMode,
transcripts:transcriptMode,
plugins:fs.readdirSync("./plugins"),
pluginload:globalPluginData
},
details:{
errortime:new Date().getTime(),
actions:this.actionRecorder
}
}))
}catch{resolve(false)}
}
})
} }
+43 -1
View File
@@ -13,8 +13,14 @@ const storage = bot.storage
* @returns {Boolean} has permissions? * @returns {Boolean} has permissions?
*/ */
exports.command = (memberid,guildid) => { exports.command = (memberid,guildid) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"command"
})
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid) const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){ if (config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
return false return false
}else {return true} }else {return true}
} }
@@ -25,6 +31,12 @@ exports.command = (memberid,guildid) => {
* @returns {Boolean} * @returns {Boolean}
*/ */
exports.sendUserNoPerms = (user) => { exports.sendUserNoPerms = (user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendusernoperms"
})
try { try {
user.send({embeds:[bot.errorLog.noPermsMessage(user)]}) user.send({embeds:[bot.errorLog.noPermsMessage(user)]})
return true return true
@@ -39,6 +51,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean} * @returns {Boolean}
*/ */
exports.sendUserNoTicket = (user) => { exports.sendUserNoTicket = (user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendusernoticket"
})
try { try {
user.send({embeds:[bot.errorLog.notInATicket]}) user.send({embeds:[bot.errorLog.notInATicket]})
return true return true
@@ -53,6 +71,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean} * @returns {Boolean}
*/ */
exports.sendUserNoDelete = (user) => { exports.sendUserNoDelete = (user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendusernodelete"
})
try { try {
user.send({embeds:[bot.errorLog.noPermsDelete(user)]}) user.send({embeds:[bot.errorLog.noPermsDelete(user)]})
return true return true
@@ -68,6 +92,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean} * @returns {Boolean}
*/ */
exports.sendChannelNoPerms = (channel,user) => { exports.sendChannelNoPerms = (channel,user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendchannelnoperms"
})
try { try {
channel.send({embeds:[bot.errorLog.noPermsMessage(user)]}) channel.send({embeds:[bot.errorLog.noPermsMessage(user)]})
return true return true
@@ -83,6 +113,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean} * @returns {Boolean}
*/ */
exports.sendChannelNoTicket = (channel,user) => { exports.sendChannelNoTicket = (channel,user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendchannelnoticket"
})
try { try {
channel.send({embeds:[bot.errorLog.notInATicket]}) channel.send({embeds:[bot.errorLog.notInATicket]})
return true return true
@@ -98,6 +134,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean} * @returns {Boolean}
*/ */
exports.sendChannelNoDelete = (channel,user) => { exports.sendChannelNoDelete = (channel,user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendchannelnodelete"
})
try { try {
channel.send({embeds:[bot.errorLog.noPermsDelete(user)]}) channel.send({embeds:[bot.errorLog.noPermsDelete(user)]})
return true return true
+224 -82
View File
@@ -1,35 +1,61 @@
// __________ __________ ___________ ____ ____ /**
// / ____ \ / ______ \ / | | \ | | ____ _____ ______ _ _ _______ _____ _____ _ ________ _______
// | / \ | | | | | | |_______| | \ | | / __ \| __ \| ____| \ | | |__ __|_ _/ ____| |/ / ____|__ __|
// | | | | | |____| | | | | |\ \ | | | | | | |__) | |__ | \| | | | | || | | ' /| |__ | |
// | | | | | ________/ | |______ | | \ \ | | | | | | ___/| __| | . ` | | | | || | | < | __| | |
// | | | | | | | _____| | | \ \ | | | |__| | | | |____| |\ | | | _| || |____| . \| |____ | |
// | | | | | | | | | | \ \ | | \____/|_| |______|_| \_| |_| |_____\_____|_|\_\______| |_|
// | | | | | | | |________ | | \ \| |
// | \____/ | | | | | | | \ | 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.3.0 - © 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')
const {GatewayIntentBits,Partials} = discord const {GatewayIntentBits,Partials} = discord
const APIBase = require("./core/api/modules/base") const client = new discord.Client({
if (APIBase.embeddedMode){ intents:[
var tempClient = APIBase.clientLocation GatewayIntentBits.DirectMessages,
}else{ GatewayIntentBits.GuildInvites,
var tempClient = new discord.Client({ GatewayIntentBits.GuildMembers,
intents:[ GatewayIntentBits.GuildMessages,
GatewayIntentBits.DirectMessages, GatewayIntentBits.Guilds,
GatewayIntentBits.GuildInvites, GatewayIntentBits.MessageContent
GatewayIntentBits.GuildMembers, ],
GatewayIntentBits.GuildMessages, partials:[Partials.Channel,Partials.Message]
GatewayIntentBits.Guilds, })
GatewayIntentBits.MessageContent
],
partials:[Partials.Channel,Partials.Message]
})
}
/**@type {discord.Client} */
const client = tempClient
exports.client = client exports.client = client
client.setMaxListeners(50) client.setMaxListeners(50)
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client")
@@ -39,48 +65,38 @@ 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
const config = tempconfig
exports.config = config
const tsconfig = isDevConfig ? require("./devtsconfig.json") : require("./transcriptconfig.json")
exports.tsconfig = tsconfig
const language = require("./core/languageManager").language 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
exports.config = config
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")
exports.errorLog = require("./core/errorLogSystem") exports.errorLog = require("./core/errorLogSystem")
const log = this.errorLog.log
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM")
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs") if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs")
this.errorLog.log("debug","loaded new logs") this.errorLog.log("debug","loaded new logs")
exports.actionRecorder = require("./core/utils/liveStatus").actionRecorder
exports.hiddenData = require("./core/utils/hiddendata") exports.hiddenData = require("./core/utils/hiddendata")
this.errorLog.log("debug","loaded hiddendataTM") this.errorLog.log("debug","loaded hiddendataTM")
@@ -96,6 +112,12 @@ this.errorLog.log("debug","loaded buttons & embeds")
client.on('ready',async () => { client.on('ready',async () => {
this.errorLog.log("debug","client logged in") this.errorLog.log("debug","client logged in")
this.actionRecorder.push({
category:"ot.managers.djs",
file:"index.js",
time:new Date().getTime(),
type:"client.loggedin.success"
})
var statusSet = false var statusSet = false
const setStatus = (type,text) => { const setStatus = (type,text) => {
if (statusSet == true) return if (statusSet == true) return
@@ -107,79 +129,147 @@ 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")
this.actionRecorder.push({
category:"ot.managers.djs",
file:"index.js",
time:new Date().getTime(),
type:"client.setstatus.success"
})
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!")) this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startscreen.success"
})
if (!process.argv[2] || (process.argv[2] && !process.argv[2].startsWith("slash"))){
//normal start
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")()
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)
} }
log("system","bot logged in!") this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startmode.normal"
})
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch() var updatingSlash = false
return if (fs.existsSync("./storage/slashcmdEnabled.txt")){
} /**@type {"true"|"false"|String} */
const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString()
if (data === require("./package.json").version){
require("./core/slashSystem/autoSlashUpdate")()
updatingSlash = true
if (process.argv[2] == "d"){ }else if ((data != require("./package.json").version) && (data != "false")){
if (config.status.enabled){ require("./core/slashSystem/slashEnable")(true)
setStatus(config.status.type,config.status.text) updatingSlash = true
}
}else{
if (process.argv.some((v) => v == "--noslash")){
fs.writeFileSync("./storage/slashcmdEnabled.txt","false")
}else{
fs.writeFileSync("./storage/slashcmdEnabled.txt",require("./package.json").version)
require("./core/slashSystem/slashEnable")(true)
updatingSlash = true
}
} }
} this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"slashcmd.autoupdate.success"
})
if (!process.argv[2].startsWith("slash")){ try {
console.log(chalk.red("WELCOME TO OPEN TICKET!")) await client.guilds.cache.find((g) => g.id == config.serverId).members.fetch()
this.errorLog.log("debug","loaded console interface") }catch{
log("info","open ticket ready",[{key:"version",value:require("./package.json").version},{key:"language",value:config.languagefile}]) this.errorLog.log("info","tried to cache user information, failed!")
require("./core/utils/liveStatus")()
console.log(chalk.blue("\n\nlogs:")+"\n============")
if (config.status.enabled){
setStatus(config.status.type,config.status.text)
} }
require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,false)
log("system","bot logged in!")
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
}else{ }else{
console.log(chalk.red("STARTING IN ")+chalk.blue("SLASH MODE")+chalk.red("...")) //slash command activation using node index.js slash (enable|disable)
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"))
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startmode.slash.enable"
})
require("./core/slashSystem/slashEnable")() require("./core/slashSystem/slashEnable")()
}else if (process.argv[3] == "disable"){ }else if (process.argv[3] == "disable"){
console.log(chalk.green("switching to slashDisable.js")) console.log(chalk.green("switching to slashDisable.js"))
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startmode.slash.disable"
})
require("./core/slashSystem/slashDisable")() require("./core/slashSystem/slashDisable")()
}else{ }else{
console.log(chalk.red("Internal Error: unknown slash mode!")) console.log(chalk.bgRed("[SLASH CMD MANAGER]: unknown slash command action!"))
process.exit(1) process.exit(1)
} }
} }
//load plugins //load plugins
this.actionRecorder.push({
category:"ot.managers.plugins",
file:"./core/api/pluginlauncher.js",
time:new Date().getTime(),
type:"plugins.loading"
})
require("./core/api/pluginlauncher")() require("./core/api/pluginlauncher")()
this.actionRecorder.push({
category:"ot.managers.plugins",
file:"./core/api/pluginlauncher.js",
time:new Date().getTime(),
type:"plugins.success"
})
this.errorLog.log("debug","loading plugins") this.errorLog.log("debug","loading plugins")
}) })
if (!require("./core/api/api.json").disable.checkerjs.all) require("./core/checker").checker() if (!require("./core/api/api.json").disable.checkerjs.all){
this.actionRecorder.push({
category:"ot.managers.main",
file:"./core/checker.js",
time:new Date().getTime(),
type:"checker.loading"
})
require("./core/checker").checker()
this.errorLog.log("debug","loading checker.js") this.errorLog.log("debug","loading checker.js")
this.errorLog.log("debug","checking config...") this.errorLog.log("debug","checking config...")
this.actionRecorder.push({
category:"ot.managers.main",
file:"./core/checker.js",
time:new Date().getTime(),
type:"checker.success"
})
}
if (process.argv[2] && process.argv[2].startsWith("slash")){ if (process.argv[2] && process.argv[2].startsWith("slash")){
//do nothing //do nothing
}else{ }else{
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"commands.loading"
})
this.errorLog.log("debug","LOADING COMMANDS") this.errorLog.log("debug","LOADING COMMANDS")
//commands //commands
require('./commands/ticket')() require('./commands/ticket')()
@@ -192,34 +282,75 @@ 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.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"commands.success"
})
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"core.loading"
})
this.errorLog.log("debug","LOADING CORE") this.errorLog.log("debug","LOADING CORE")
//core //core
require('./core/ticketActions/ticketOpener')() require('./core/ticketActions/ticketOpener')()
require("./core/reactionRoles")() require("./core/reactionRoles")()
require("./core/ticketActions/ticketAutoclose")()
this.errorLog.log("debug","LOADING INTERACTION HANDLERS") this.errorLog.log("debug","LOADING INTERACTION HANDLERS")
//InteractionHandlers //InteractionHandlers
require("./core/interactionHandlers/handlers/handlers")() require("./core/interactionHandlers/handlers/handlers")()
//require("./test")() this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"core.success"
})
} }
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"api.loading"
})
this.errorLog.log("debug","loading api") this.errorLog.log("debug","loading api")
const APIEvents = require("./core/api/modules/events") const APIEvents = require("./core/api/modules/events")
const APIConfig = require("./core/api/api.json") const APIConfig = require("./core/api/api.json")
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"api.success"
})
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"debugsystem.loading"
})
const debugLog = (debugString) => { const debugLog = (debugString) => {
if (!APIConfig.disable.debug.all && !APIConfig.disable.debug.debuglogs){ if (!APIConfig.disable.debug.all && !APIConfig.disable.debug.debuglogs){
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n==========================" const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString) fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString)
} }
this.errorLog.clearDebugFile()
} }
const errorLog = (errorString,stack) => { const errorLog = (errorString,stack) => {
if (!APIConfig.disable.debug.all){ if (!APIConfig.disable.debug.all){
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n==========================" const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack) fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack)
} }
this.errorLog.clearDebugFile()
} }
this.errorLog.log("debug","OT error system loaded successfully") this.errorLog.log("debug","OT error system loaded successfully")
@@ -237,7 +368,18 @@ process.on("uncaughtException",async (error,origin) => {
errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack) errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack)
APIEvents.onError(error.name+": "+error.message,new Date()) APIEvents.onError(error.name+": "+error.message,new Date())
//TEMPORARY INTEGRATION FOR LIVESTATUS ERROR UPLOADER:
await require("./core/utils/liveStatus").liveStatusUploadManager(error.name+": "+error.message+" | origin: "+origin+"\n"+error.stack)
}) })
if (!APIBase.embeddedMode) client.login(config.auth_token) this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"debugsystem.success"
})
const token = config.token.fromENV ? process.env.TOKEN : config.token.value
client.login(token)
this.errorLog.log("debug","login with token") this.errorLog.log("debug","login with token")
+87 -72
View File
@@ -1,83 +1,98 @@
{ {
"errors": { "errors": {
"missingArgsTitle": "قيمة غير صالحة!", "missingArgsTitle": "قيمة غير صالحة!",
"missingArgsDescription": "قيمة مفقودة", "missingArgsDescription": "قيمة مفقودة",
"noPermsTitle": "ليس لديك برمشنات !", "noPermsTitle": "ليس لديك برمشنات !",
"noPermsDescription": "أنت بحاجة الى برمشن `ADMINISTRATOR` او أن تكون في قائمة المسموح بهم!", "noPermsDescription": "أنت بحاجة الى برمشن `ADMINISTRATOR` او أن تكون في قائمة المسموح بهم!",
"noPermsDelete": "فقط الإداريين يمكنهم حذف التكت!", "noPermsDelete": "فقط الإداريين يمكنهم حذف التكت!",
"chooseFromListTitle": "Invalid ID", "chooseFromListTitle": "Invalid ID",
"chooseFromListDescription": "قم بأختيار أحد من الأيديات من الأسفل:", "chooseFromListDescription": "قم بأختيار أحد من الأيديات من الأسفل:",
"boterror": "خلل في البوت !", "boterror": "خلل في البوت !",
"notInTicketTitle": "انت لست في تكت!", "notInTicketTitle": "انت لست في تكت!",
"notInTicketDescription": "هذا الأمر لا يعمل خارج التكت!", "notInTicketDescription": "هذا الأمر لا يعمل خارج التكت!",
"ticketDoesntExist": "هذا التكت لم يعد فعال!", "ticketDoesntExist": "هذا التكت لم يعد فعال!",
"roleDoesntExist": "خطاً ,لم تعد الرتبة موجوده!", "roleDoesntExist": "خطاً ,لم تعد الرتبة موجوده!",
"anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!", "anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!",
"maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!", "maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!",
"maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!", "maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!",
"somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!", "somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!"
"somethingWentWrongTranscript": "هناك خطاً في محاولة طبع التكت!**\nأعد المحاولة لاحقاً!" },
}, "commands": {
"commands": { "userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!",
"userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!", "userRemovedTitle": "تم أزالة {0} من المستخدمين من التكت!",
"userRemovedTitle": "تم أزالة {0} من المستخدمين من التكت!", "renameTitle": "تم تغيير أسم التكت الى {0}!",
"renameTitle": "تم تغيير أسم التكت الى {0}!", "closeTitle": "تم أغلاق التكت!",
"closeTitle": "تم أغلاق التكت!", "deleteTitle": " جاري حذف التكت...",
"deleteTitle": " جاري حذف التكت...", "reopenTitle": "إعادة فتح التكت!",
"reopenTitle": "إعادة فتح التكت!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!", "claimTitle":"This ticket is now claimed to {0}",
"maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_" "unclaimTitle":"This ticket isn't claimed anymore!",
}, "changeTitle":"Changed ticket type to {0}!",
"helpMenu": {
"title": "الأوامر المتاحة:",
"header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n",
"header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n",
"msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)", "statsTitle":"Here are the stats for {0}!",
"renameCmd": "إعادة تسمية التكت. (بدون مسافات)", "autocloseTitle":"This ticket will be closed automatically after {0}!",
"closeCmd": "أغلاق التكت.", "autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"deleteCmd": "حذف التكت.", "autocloseWarn":"This only affects inactive tickets!",
"addCmd": "إضافة مستخدم الى التكت.",
"removeCmd": "إزالة مستخدم من التكت.",
"reopenCmd": "إعادة فتح تكت بعد إغلاقة."
},
"buttons": {
"close": "إغلاق التكت",
"delete": "حذف التكت",
"reopen": "إعادة فتح التكت",
"sendTranscript": "طبع التكت",
"closeWithReason":"close with reason"
},
"messages": {
"reopenTitle": "تم إعادة فتح التكت بنجاح!",
"reopenDescription": "لا تتردد في فتح التكت مرة أخرى , حظاً موفقاً!",
"closedTitle": "تم إغلاق التكت!",
"closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التكت او إعادة فتحة مجدداً!*",
"createdTitle": "تم إنشاء تكت!",
"createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!",
"newTicketDmTitle": "تكت جديد!", "goToTicket":"go to ticket",
"closedTicketDmTitle": "تم إغلاق التكت!", "ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!",
"deletedTicketDmTitle": "تم حذف التكت!", "maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_"
"closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري", },
"deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!", "helpMenu": {
"reopenTicketDmTitle": "تم إعادة فتح تذكرتك!", "title": "الأوامر المتاحة:",
"reopenTicketDmDescription": "تم إعادة فتح التكت!", "header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n",
"newTranscriptTitle": "توجد نسخة تكت جديدة هنا!", "header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n",
"hereIsTheTranscript": "هذا هي النسخة:",
"chooseCategory": "أختر الكتقاجوري:", "msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)",
"gettingdeleted": "يتم حذف التكت...", "renameCmd": "إعادة تسمية التكت. (بدون مسافات)",
"closeCmd": "أغلاق التكت.",
"deleteCmd": "حذف التكت.",
"addCmd": "إضافة مستخدم الى التكت.",
"removeCmd": "إزالة مستخدم من التكت.",
"reopenCmd": "إعادة فتح تكت بعد إغلاقة.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
},
"buttons": {
"close": "إغلاق التكت",
"delete": "حذف التكت",
"reopen": "إعادة فتح التكت",
"closeWithReason":"close with reason"
},
"messages": {
"closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التكت او إعادة فتحة مجدداً!*",
"createdTitle": "تم إنشاء تكت!",
"createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!",
"none": "لا يوجد", "newTicketDmTitle": "تكت جديد!",
"reason": "سبب", "closedTicketDmTitle": "تم إغلاق التكت!",
"deletedTicketDmTitle": "تم حذف التكت!",
"closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري",
"deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!",
"reopenTicketDmTitle": "تم إعادة فتح تذكرتك!",
"reopenTicketDmDescription": "تم إعادة فتح التكت!",
"deletedby":"deleted by", "chooseCategory": "أختر الكتقاجوري:",
"gettingdeleted": "يتم حذف التكت...",
"none": "لا يوجد",
"reason": "سبب",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"deleted by",
"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"
}
} }
+27 -12
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!",
@@ -25,9 +24,17 @@
"closeTitle":"Closed this ticket!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...", "deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Re-Opened this ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"This ticket is claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"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!_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Delete a ticket.", "deleteCmd":"Delete a ticket.",
"addCmd":"Add a user to the ticket.", "addCmd":"Add a user to the ticket.",
"removeCmd":"Remove a user from the ticket.", "removeCmd":"Remove a user from the ticket.",
"reopenCmd":"Re-Open a ticket after it was closed." "reopenCmd":"Re-Open a ticket after it was closed.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"Re-Opened this ticket!",
"reopenDescription":"Feel free to talk again!",
"closedTitle":"Closed this ticket!",
"closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*", "closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*",
"createdTitle":"Ticket Created!", "createdTitle":"Ticket Created!",
"createdDescription":"Your ticket is created, you can detect it by a ping!", "createdDescription":"Your ticket is created, you can detect it by a ping!",
@@ -66,18 +74,25 @@
"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...",
"none":"none", "none":"none",
"reason":"reason", "reason":"reason",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"deleted by", "deletedby":"deleted by",
"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"
} }
} }
+75 -60
View File
@@ -1,83 +1,98 @@
{ {
"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}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Ticket nyní převzal {0}",
"unclaimTitle":"Ticket už není převzaný",
"changeTitle":"Změněn typ ticketu {0}!",
"statsTitle":"Tady je info o ticketu {0}!",
"autocloseTitle":"Tento ticketu bude automaticky uzavřen za {0}!",
"autocloseRejectTitle":"Tento ticketu už nebude automaticky uzavřen!",
"autocloseWarn":"Toto zavře pouze neaktivní tickety!",
"goToTicket":"běž do ticketu",
"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.",
"changeCmd":"Změnit typ ticketu.",
"claimCmd":"Převzi ticket.",
"unclaimCmd":"Uvolnit ticket.",
"statsCmd":"Zobrazit info o ticketu.",
"autocloseCmd":"Nastavit automatické uzavření ticketu"
}, },
"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!", "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!*",
"reopenDescription":"Cítím se skvěle že si můžeme zase povídat!", "createdTitle":"Ticket otevřen!",
"closedTitle":"Zavřený ticket!", "createdDescription":"Tvůj ticket je vytvořem, můžeš si ho všimnout pomocí pingu!",
"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!*",
"createdTitle":"Ticket vytvořen!",
"createdDescription":"Váš tiket je vytvořen, můžete ho zjistit 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",
"createdat":"otevřeno v",
"openedby":"otevřel",
"deletedby":"smazano uzivatelem",
"closedby":"zavreno uzivatelem",
"deletedby":"deleted by", "modalreason":"Jakž byl důvod k zavření toho ticketu?",
"closedby":"closed by", "chooseATicket": "Vyber ticket"
"modalreason":"What is the reason for closing this ticket?", },
"chooseATicket": "Choose a 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!"
} }
} }
+98
View File
@@ -0,0 +1,98 @@
{
"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 bliver nu håndteret af {0}",
"unclaimTitle": "Denne ticket bliver ikke håndteret længere!",
"changeTitle": "Ændrede ticket-type til {0}!",
"statsTitle": "Her er statestikerne til {0}!",
"autocloseTitle": "Denne ticket lukker automatisk om {0}!",
"autocloseRejectTitle": "Denne ticket lukker ikke længere automatisk!",
"autocloseWarn": "Dette har kun effekt på inaktive tickets!",
"goToTicket": "gå til ticket",
"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.",
"changeCmd": "Skift ticket type.",
"claimCmd": "Håndter en ticket.",
"unclaimCmd": "Afhåndter en ticket.",
"statsCmd": "Se ticket statestiker.",
"autocloseCmd": "Angiv tiden til automatisk at lukke en ticket"
},
"buttons": {
"close": "Luk Ticket",
"delete": "Slet Ticket",
"reopen": "Genåben Ticket",
"closeWithReason": "Luk med grundlag"
},
"messages": {
"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",
"createdat": "lavet af",
"openedby": "åbnet af",
"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"
}
}
+27 -12
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,9 +24,17 @@
"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}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Dit ticket is geclaimed door {0}",
"unclaimTitle":"Dit ticket is niet meer geclaimed!",
"changeTitle":"Ticket type veranderd naar {0}!",
"statsTitle":"Hier zijn de stats voor {0}!",
"autocloseTitle":"Dit ticket wordt automatisch gesloten na {0}!",
"autocloseRejectTitle":"Dit ticket wordt niet langer automatisch gesloten!",
"autocloseWarn":"Dit geldt alleen voor inactieve tickets!",
"goToTicket":"ga naar ticket",
"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!_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Verijder een ticket.", "deleteCmd":"Verijder een ticket.",
"addCmd":"Voeg een user aan een ticket.", "addCmd":"Voeg een user aan een ticket.",
"removeCmd":"Verwijder een user van een ticket.", "removeCmd":"Verwijder een user van een ticket.",
"reopenCmd":"Heropen een ticket nadat het gesloten is." "reopenCmd":"Heropen een ticket nadat het gesloten is.",
"changeCmd":"Verander ticket type.",
"claimCmd":"Claim een ticket.",
"unclaimCmd":"Unclaim een ticket.",
"statsCmd":"Bekijk ticket stats.",
"autocloseCmd":"Zet een timer om het ticket automatisch te sluiten"
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"Ticket heropend!",
"reopenDescription":"Voel vrij om weer te praten!",
"closedTitle":"Ticket gesloten!",
"closedDescription":"Alleen admins kunnen nog praten.\n\n*Klik op de knoppen hieronder voor meer acties!*", "closedDescription":"Alleen admins kunnen nog praten.\n\n*Klik op de knoppen hieronder voor meer acties!*",
"createdTitle":"Ticket Aangemaakt!", "createdTitle":"Ticket Aangemaakt!",
"createdDescription":"U ticket is gemaakt, je kan het detecteren bij een ping!", "createdDescription":"U ticket is gemaakt, je kan het detecteren bij een ping!",
@@ -66,18 +74,25 @@
"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...",
"none":"geen", "none":"geen",
"reason":"reden", "reason":"reden",
"createdat":"gecreëerd op",
"openedby":"geopend door",
"deletedby":"verwijderd door", "deletedby":"verwijderd door",
"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"
} }
} }
+27 -12
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!",
@@ -25,9 +24,17 @@
"closeTitle":"Closed this ticket!", "closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...", "deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Re-Opened this ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"This ticket is claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"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!_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Delete a ticket.", "deleteCmd":"Delete a ticket.",
"addCmd":"Add a user to the ticket.", "addCmd":"Add a user to the ticket.",
"removeCmd":"Remove a user from the ticket.", "removeCmd":"Remove a user from the ticket.",
"reopenCmd":"Re-Open a ticket after it was closed." "reopenCmd":"Re-Open a ticket after it was closed.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"Re-Opened this ticket!",
"reopenDescription":"Feel free to talk again!",
"closedTitle":"Closed this ticket!",
"closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*", "closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*",
"createdTitle":"Ticket Created!", "createdTitle":"Ticket Created!",
"createdDescription":"Your ticket is created, you can detect it by a ping!", "createdDescription":"Your ticket is created, you can detect it by a ping!",
@@ -66,18 +74,25 @@
"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...",
"none":"none", "none":"none",
"reason":"reason", "reason":"reason",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"deleted by", "deletedby":"deleted by",
"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"
} }
} }
+27 -12
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!",
@@ -25,9 +24,17 @@
"closeTitle":"Fermé ce ticket!", "closeTitle":"Fermé ce ticket!",
"deleteTitle":"Suppression de ce ticket...", "deleteTitle":"Suppression de ce ticket...",
"reopenTitle":"A rouvert ce ticket!", "reopenTitle":"A rouvert ce ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Ce ticket est maintenant réclamé à {0}",
"unclaimTitle":"Ce ticket n'est pas réclamé!",
"changeTitle":"Modification du type de ticket en {0}!",
"statsTitle":"Voici les statistiques pour {0}!",
"autocloseTitle":"Ce ticket sera automatiquement clôturé après {0}!",
"autocloseRejectTitle":"Ce ticket ne sera plus clôturé automatiquement!",
"autocloseWarn":"Cela n'affecte que les tickets inactifs!",
"goToTicket":"Aller au ticket",
"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 !_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Supprimer un billet.", "deleteCmd":"Supprimer un billet.",
"addCmd":"Ajouter un utilisateur au ticket.", "addCmd":"Ajouter un utilisateur au ticket.",
"removeCmd":"Supprimer un utilisateur du ticket.", "removeCmd":"Supprimer un utilisateur du ticket.",
"reopenCmd":"Rouvrir un ticket après sa clôture." "reopenCmd":"Rouvrir un ticket après sa clôture.",
"changeCmd":"Changer le type de ticket.",
"claimCmd":"Réclamer un billet",
"unclaimCmd":"Annuler la réclamation d'un ticket.",
"statsCmd":"Afficher les statistiques des tickets.",
"autocloseCmd":"Définir une minuterie pour fermer automatiquement le ticket"
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"A rouvert ce ticket!",
"reopenDescription":"N'hésitez pas à reparler!",
"closedTitle":"Fermé ce ticket!",
"closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*", "closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*",
"createdTitle":"Ticket créé !", "createdTitle":"Ticket créé !",
"createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !", "createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !",
@@ -66,18 +74,25 @@
"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...",
"none":"rien", "none":"rien",
"reason":"raison", "reason":"raison",
"createdat":"Créé à",
"openedby":"Ouvert par",
"deletedby":"supprimé par", "deletedby":"supprimé par",
"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"
} }
} }
+49 -34
View File
@@ -3,36 +3,43 @@
"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":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!", "noPermsDescription":"Du benötigst die `ADMINISTRATOR` Rechte oder die erlaubte Rolle",
"noPermsDelete":"Only admins can delete a ticket!", "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":"Added {0} to this ticket!", "userAddedTitle":"User geaddet!",
"userRemovedTitle":"Removed {0} from this ticket!", "userRemovedTitle":"User entfernt!",
"renameTitle":"Changed the name to {0}!", "renameTitle":"Der Name wurde geändert!",
"closeTitle":"Closed this ticket!", "closeTitle":"Dieses Ticket schließen!",
"deleteTitle":"Deleting this ticket...", "deleteTitle":"Löschen Sie dieses Ticket!",
"reopenTitle":"Re-Opened this ticket!", "reopenTitle":"Öffne dieses Ticket erneut!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"ticketWarning":"The embed is in the message below!", "claimTitle":"Dieses Ticket wurde beansprucht von {0}",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_" "unclaimTitle":"Dieses Ticket wird nichtmehr beansprucht.",
"changeTitle":"Ticket Typ wurde geändert zu {0}!",
"statsTitle":"Hier sind die Stats für {0}!",
"autocloseTitle":"Dieses Ticket wird automatisch geschlossen in {0}!",
"autocloseRejectTitle":"Dieses Ticket wird nichtmehr automatisch geschlossen",
"autocloseWarn":"Dies betrifft nur inaktive Tickets!",
"goToTicket":"Geh zu deinem Ticket",
"ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!",
"maxTicketWarning":"**Warnung:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_"
}, },
"helpMenu":{ "helpMenu":{
"title":"Available Commands:", "title":"Hilfe Menu:",
"header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n", "header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n",
"header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n", "header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n",
@@ -42,19 +49,20 @@
"deleteCmd":"Ein Ticket löschen.", "deleteCmd":"Ein Ticket löschen.",
"addCmd":"Fügen Sie dem Ticket einen Benutzer hinzu.", "addCmd":"Fügen Sie dem Ticket einen Benutzer hinzu.",
"removeCmd":"Entfernen eines Benutzers aus dem Ticket.", "removeCmd":"Entfernen eines Benutzers aus dem Ticket.",
"reopenCmd":"Öffnen Sie ein Ticket erneut, nachdem es geschlossen wurde." "reopenCmd":"Öffnen Sie ein Ticket erneut, nachdem es geschlossen wurde.",
"changeCmd":"Ticket Typ ändern",
"claimCmd":"Ticket beanspruchen",
"unclaimCmd":"Ticket nicht mehr beanspruchen.",
"statsCmd":"Ticket Stats",
"autocloseCmd":"Timer wurde gesetzt auf automatisches schließen des Tickets"
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"Dieses Ticket wiedereröffnet!",
"reopenDescription":"Sie können gerne weiterreden!",
"closedTitle":"Dieses Ticket geschlossen!",
"closedDescription":"Nur Admins können jetzt in diesem Ticket sprechen!\n\n*Klicken Sie auf die Schaltfläche unten, um dieses Ticket zu löschen oder erneut zu öffnen!*", "closedDescription":"Nur Admins können jetzt in diesem Ticket sprechen!\n\n*Klicken Sie auf die Schaltfläche unten, um dieses Ticket zu löschen oder erneut zu öffnen!*",
"createdTitle":"Ticket erstellt!", "createdTitle":"Ticket erstellt!",
"createdDescription":"Ihr Ticket ist erstellt, Sie können es durch einen Ping erkennen!", "createdDescription":"Ihr Ticket ist erstellt, Sie können es durch einen Ping erkennen!",
@@ -64,20 +72,27 @@
"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!",
"reopenTicketDmTitle":"Ticket neu Eröffnen!", "newTranscriptTitle":"Eine neue Transcript finden Sie hier!",
"reopenTicketDmDescription":"Dein Ticket ist Neu eröffnet!", "hereIsTheTranscript":"Hier ist das Transcript:",
"newTranscriptTitle":"Eine neue Transscript finden Sie hier!",
"hereIsTheTranscript":"Hier ist das Transscript:",
"chooseCategory":"Wähle eine Kategorie:", "chooseCategory":"Wähle eine Kategorie:",
"gettingdeleted":"Ticket wird gelöscht...", "gettingdeleted":"Ticket wird gelöscht...",
"none":"none", "none":"none",
"reason":"reason", "reason":"Grund",
"createdat":"Erstellt um",
"openedby":"Geöffnet um",
"deletedby":"Gelöscht von", "deletedby":"Gelöscht von",
"closedby":"Geschlossen von", "closedby":"Geschlossen von",
"modalreason":"Was ist der Grund für das schließen des Tickets?",
"chooseATicket": "Wähle ein Ticket" "modalreason":"Was ist der Grund?",
"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"
} }
} }
+58 -43
View File
@@ -1,61 +1,69 @@
{ {
"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}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Questo ticket adesso è gestito da {0}",
"unclaimTitle":"Questo ticket non è più gestito!",
"changeTitle":"Ticket cambiato in {0}!",
"statsTitle":"Queste sono le stats per {0}!",
"autocloseTitle":"Questo ticket sarà eliminato direttamente dopo {0}!",
"autocloseRejectTitle":"Questo ticket non sarà più chiuso automaticamente!",
"autocloseWarn":"Questo vale solo per i ticket inattivi!",
"goToTicket":"vai al ticket",
"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.",
"changeCmd":"Cambia tipo di ticket.",
"claimCmd":"Gestisci un ticket.",
"unclaimCmd":"Lascia la gestione del ticket.",
"statsCmd":"Vedi le statistiche dei ticket.",
"autocloseCmd":"Imposta il timer dell'autochiusura dei ticket"
}, },
"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!", "closedDescription":"Solo gli amministratori possono parlare in questo ticket ora!\n\n*Clicca sul pulsante sotto per eliminare o ri-aprire questo ticket!*",
"reopenDescription":"Sentiti libero di parlare di nuovo!",
"closedTitle":"Chiudo questo ticket!",
"closedDescription":"Solo gli amministratori possono parlare in questo ticket ora!\n\n*Clicca sul bottone sotto per chiudere o riaprire 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,21 +71,28 @@
"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...",
"none":"nessuno", "none":"nessuno",
"reason":"motivo", "reason":"motivo",
"createdat":"creato il",
"openedby":"aperto da",
"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"
} }
} }
+98
View File
@@ -0,0 +1,98 @@
{
"errors":{
"missingArgsTitle":"Nieprawidłowe argumenty!",
"missingArgsDescription":"Brakujący argument",
"noPermsTitle":"Brak permisji!",
"noPermsDescription":"Musisz mieć uprawnienia `ADMINISTRATOR` lub być na liście dozwolonych ról!",
"noPermsDelete":"Tylko administratorzy mogą usunąć zgłoszenie!",
"chooseFromListTitle":"Błędne ID",
"chooseFromListDescription":"Wybierz jeden z poniższych identyfikatorów:",
"boterror":"Błąd bota!",
"notInTicketTitle":"Nie jesteś w tickecie!",
"notInTicketDescription":"To polecenie nie działa poza ticketami!",
"ticketDoesntExist":"Ten ticket już nie istnieje!",
"roleDoesntExist":"Ta rola już nie istnieje!",
"anotherOption":"Ta opcja nie jest ticketem, ale innym typem!",
"maxAmountTitle":"Maksymalna liczba osiągnięta!",
"maxAmountDescription":"Osiągnąłeś maksymalną dozwoloną liczbę ticketów!\nWięc nie możesz stworzyć nowego!",
"somethingWentWrong":"**Coś poszło nie tak!**\nSpróbuj ponownie innym razem!"
},
"commands":{
"userAddedTitle":"Dodano {0} do tego ticketa!",
"userRemovedTitle":"Usunięto {0} z tego ticketa!",
"renameTitle":"Zmieniono nazwę na {0}!",
"closeTitle":"Zamknięto ten ticket!",
"deleteTitle":"Usuwanie tego zgłoszenia..",
"reopenTitle":"Ponownie otwarto ten ticket!",
"claimTitle":"Ten ticket został odebrany przez {0}",
"unclaimTitle":"Nie można już odebrać tego biletu!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Oto statystyki dotyczące {0}!",
"autocloseTitle":"Ten ticket zostanie automatycznie zamknięty po {0}!",
"autocloseRejectTitle":"Ten ticket nie będzie już automatycznie zamykany!",
"autocloseWarn":"Dotyczy to tylko nieaktywnych biletów!",
"goToTicket":"Przejdź do ticketa",
"ticketWarning":"Osadzenie znajduje się w wiadomości poniżej!",
"maxTicketWarning":"**Ostrzeżenie:** _Możesz utworzyć tylko {0} bilet(ów) na raz!_"
},
"helpMenu":{
"title":"Dostępne polecenia:",
"header1":"**Przejdź do {0}, aby utworzyć zgłoszenie!**\n\n",
"header2":"**Uruchom polecenie `/new` lub `/ticket`, aby utworzyć zgłoszenie!**\n\n",
"msgCmd":"Odradzaj osadzanie za pomocą przycisków. (tylko administratorzy)",
"renameCmd":"Zmień nazwę zgłoszenia. (bez spacji)",
"closeCmd":"Zamknij ticket.",
"deleteCmd":"Skasuj ticket.",
"addCmd":"Dodaj użytkownika do zgłoszenia.",
"removeCmd":"Usuń użytkownika ze zgłoszenia.",
"reopenCmd":"Otwórz ponownie ticket po jego zamknięciu.",
"changeCmd":"Zmień typ ticketa.",
"claimCmd":"Odbierz ticket.",
"unclaimCmd":"Zrezygnuj z ticketa.",
"statsCmd":"Pokaż statystyki zgłoszenia.",
"autocloseCmd":"Ustaw timer, aby automatycznie zamykał ticket."
},
"buttons":{
"close":"Zamknij",
"delete":"Skasuj",
"reopen":"Otworz ponownie",
"closeWithReason":"Zamknij z powodem"
},
"messages":{
"closedDescription":"Tylko admini mogą teraz rozmawiać w tym zgłoszeniu!\n\n*Kliknij przycisk poniżej, aby usunąć lub ponownie otworzyć ten ticket!*",
"createdTitle":"Ticket Created!",
"createdDescription":"Twój ticket został utworzony, możesz go wykryć za pomocą pingu!",
"newTicketDmTitle":"Nowy Ticket!",
"closedTicketDmTitle":"Ticket Zamknięty!",
"deletedTicketDmTitle":"Ticket Skasowany!",
"closedTicketDmDescription":"Twój ticket jest zamknięty!",
"deletedTicketDmDescription":"Twój ticket został skasowany!",
"reopenTicketDmTitle":"Ticket otwarty!",
"reopenTicketDmDescription":"Twój ticket został ponownie otwarty!",
"chooseCategory":"Wybierz kategorię:",
"gettingdeleted":"Ticket jest usuwany..",
"none":"brak",
"reason":"powód",
"createdat":"utworzony",
"openedby":"otwarte przez",
"deletedby":"skasowane przez",
"closedby":"zamknięte przez",
"modalreason":"Jaki jest powód zamknięcia tego zgłoszenia?",
"chooseATicket": "Wybierz zgłoszenie"
},
"transcripts":{
"title":"Transkrypcja",
"processed":"Ta transkrypcja jest przetwarzana",
"wait":"Proszę czekać!",
"estimated":"Szacowany czas",
"available":"Transkrypcja jest dostępna tutaj"
}
}
+33 -18
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!",
@@ -25,9 +24,17 @@
"closeTitle":"Fechado este ticket!", "closeTitle":"Fechado este ticket!",
"deleteTitle":"Excluindo este ticket...", "deleteTitle":"Excluindo este ticket...",
"reopenTitle":"Reabriu este ticket!", "reopenTitle":"Reabriu este ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Esse ticket foi reinvidicado {0}",
"unclaimTitle":"Esse ticket não foi reinvidicado!",
"changeTitle":"Tipo de ticket alterado para {0}!",
"statsTitle":"Aqui estão as estatísticas para {0}!",
"autocloseTitle":"Este ticket vai fechar altomaticamente após {0}!",
"autocloseRejectTitle":"Este ticket não será mais fechado automaticamente!",
"autocloseWarn":"Isso apenas afeta tickets inativos!",
"goToTicket":"ir para ticket",
"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!!_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Excluir um ticket.", "deleteCmd":"Excluir um ticket.",
"addCmd":"Adicionar um usuário ao ticket.", "addCmd":"Adicionar um usuário ao ticket.",
"removeCmd":"Remover um usuário do ticket.", "removeCmd":"Remover um usuário do ticket.",
"reopenCmd":"Reabra um ticket depois que ele foi fechado." "reopenCmd":"Reabra um ticket depois que ele foi fechado.",
"changeCmd":"Mudar tipo de ticket",
"claimCmd":"Resgatar Ticket",
"unclaimCmd":"Desresgatar Ticket",
"statsCmd":"Olhar status do ticket",
"autocloseCmd":"Definir tempo para fechar ticket automaticamente."
}, },
"buttons":{ "buttons":{
"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!",
"reopenDescription":"Sinta-se à vontade para falar novamente!",
"closedTitle":"Fechado este ticket!",
"closedDescription":"Somente administradores podem falar neste ticket agora!\n\n*Clique no botão abaixo para excluir ou reabrir este ticket!*", "closedDescription":"Somente administradores podem falar neste ticket agora!\n\n*Clique no botão abaixo para excluir ou reabrir este ticket!*",
"createdTitle":"Ticket criado!", "createdTitle":"Ticket criado!",
"createdDescription":"Seu ticket foi criado, você pode detectá-lo com um ping!", "createdDescription":"Seu ticket foi criado, você pode detectá-lo com um ping!",
@@ -66,18 +74,25 @@
"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",
"createdat":"Criado por:",
"openedby":"Aberto por:",
"deletedby":"deletado por",
"closedby":"fechado por",
"deletedby":"deleted by", "modalreason":"Qual o motivo de fechar o ticket?",
"closedby":"closed by", "chooseATicket": "Fechar Ticket"
"modalreason":"What is the reason for closing this ticket?", },
"chooseATicket": "Choose a 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"
} }
} }
+27 -12
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!",
@@ -25,9 +24,17 @@
"closeTitle":"Ticket inchis!", "closeTitle":"Ticket inchis!",
"deleteTitle":"Se sterge ticket-ul...", "deleteTitle":"Se sterge ticket-ul...",
"reopenTitle":"Ticket Re-deschis!", "reopenTitle":"Ticket Re-deschis!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Acest ticket a primit claim de la {0}",
"unclaimTitle":"Acest ticket nu mai este detinut!",
"changeTitle":"A fost schimbat tipul ticket-ului la {0}!",
"statsTitle":"Acestea sunt informatiile pentru {0}!",
"autocloseTitle":"Acest ticket va fi inchis automat dupa {0}!",
"autocloseRejectTitle":"Acest ticket nu va mai fi inchis automat!",
"autocloseWarn":"Aceasta optiune afecteaza numai ticketele inactive!",
"goToTicket":"Mergi la ticket",
"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!_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Sterge un ticket.", "deleteCmd":"Sterge un ticket.",
"addCmd":"Adauga un utilizator in ticket.", "addCmd":"Adauga un utilizator in ticket.",
"removeCmd":"Sterge un utilizator din ticket.", "removeCmd":"Sterge un utilizator din ticket.",
"reopenCmd":"Re-deschide un ticket dupa ce a fost deschis." "reopenCmd":"Re-deschide un ticket dupa ce a fost deschis.",
"changeCmd":"Schimba categoria ticket-ului.",
"claimCmd":"Revendica un ticket",
"unclaimCmd":"Anuleaza revendicarea unui ticket.",
"statsCmd":"Afiseasa informatiile ticket-ului.",
"autocloseCmd":"Seteaza un cronometru pentru inchiderea ticket-ului."
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"Ticket Re-deschis!",
"reopenDescription":"Poti vorbi din nou!",
"closedTitle":"Ticket inchis!",
"closedDescription":"Doar adminii pot vorbi in acest ticket acum!\n\n*Apasa pe butonul de mai jos pentru a re-deschide ori sterge ticket-ul!*", "closedDescription":"Doar adminii pot vorbi in acest ticket acum!\n\n*Apasa pe butonul de mai jos pentru a re-deschide ori sterge ticket-ul!*",
"createdTitle":"Ticket Creat!", "createdTitle":"Ticket Creat!",
"createdDescription":"Ticket-ul tau a fost creat, poti sa il vezi in canalul pe care ai fost mentionat!", "createdDescription":"Ticket-ul tau a fost creat, poti sa il vezi in canalul pe care ai fost mentionat!",
@@ -66,18 +74,25 @@
"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...",
"none":"niciunul", "none":"niciunul",
"reason":"Motiv", "reason":"Motiv",
"createdat":"Creat la",
"openedby":"Deschis de",
"deletedby":"Sters de", "deletedby":"Sters de",
"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"
} }
} }
+98
View File
@@ -0,0 +1,98 @@
{
"errors":{
"missingArgsTitle":"Неверные аргументы!",
"missingArgsDescription":"Отсутствует аргумент",
"noPermsTitle":"Недостаточно прав!",
"noPermsDescription":"Вы должны иметь права `ADMINISTRATOR` или быть в списке разрешённых ролей!",
"noPermsDelete":"Только админы могут удалить тикет!",
"chooseFromListTitle":"Неверный ID",
"chooseFromListDescription":"Выберите один из id ниже:",
"boterror":"Ошибка бота!",
"notInTicketTitle":"Вы не в тикете!",
"notInTicketDescription":"Эта команда не работает вне тикетов!",
"ticketDoesntExist":"Этого тикета больше не существует!",
"roleDoesntExist":"Этой роли больше не существует!",
"anotherOption":"Эта опция не является тикетом, а представляет собой другой тип!",
"maxAmountTitle":"Максимальное количество достигнуто!",
"maxAmountDescription":"Вы достигли максимальное количество разрешённых тикетов!\nТеперь вы не можете создать ещё один!",
"somethingWentWrong":"**Что-то пошло не так!**\nПожайлуста, попробуйте в другой раз!"
},
"commands":{
"userAddedTitle":"Добавлено {0} в этот тикет!",
"userRemovedTitle":"Удалено {0} из этого тикета!",
"renameTitle":"Изменено имя на {0}!",
"closeTitle":"Закрыл этот тикет!",
"deleteTitle":"Удаляем этот тикет...",
"reopenTitle":"Открываем заново этот тикет!",
"claimTitle":"Этот тикет теперь взят {0}",
"unclaimTitle":"Этот тикет никем не взят!",
"changeTitle":"Изменён тип тикета на {0}!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"ticketWarning":"embed ниже сообщения!",
"maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_"
},
"helpMenu":{
"title":"Доступные команды:",
"header1":"**Перейдите в {0}, чтобы создать тикет!**\n\n",
"header2":"**Выполните команду `/new` или `/ticket` для создания тикета!**\n\n",
"msgCmd":"Создать embed с кнопками. (только админам)",
"renameCmd":"Переименовать тикет. (без пробелов)",
"closeCmd":"Закрыть тикет.",
"deleteCmd":"Удалить тикет.",
"addCmd":"Добавить пользователя в тикет.",
"removeCmd":"Удалить пользователя из тикета.",
"reopenCmd":"Открыть заново тикет после того, как он был закрыт.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
},
"buttons":{
"close":"Закрыть тикет",
"delete":"Удалить тикет",
"reopen":"Открыть заново тикет",
"closeWithReason":"закрыть с причиной"
},
"messages":{
"closedDescription":"Только админы теперь могут писать в этом тикете!\n\n*Нажмите на кнопку ниже, чтобы удалить или заново окрыть тикет!*",
"createdTitle":"Тикет создан!",
"createdDescription":"Ваш тикет создан, вы можете обнаружить его по пингу!",
"newTicketDmTitle":"Новый тикет!",
"closedTicketDmTitle":"Тикет закрыт!",
"deletedTicketDmTitle":"Тикет удалён!",
"closedTicketDmDescription":"Ваш тикет закрыт!",
"deletedTicketDmDescription":"Ваш тикет удалён!",
"reopenTicketDmTitle":"Тикет открыт заново!",
"reopenTicketDmDescription":"Ваш тикет открыт заново!",
"chooseCategory":"выберите категорию:",
"gettingdeleted":"Тикет будет удалён...",
"none":"отсутствует",
"reason":"причина",
"createdat":"created at",
"openedby":"opened by",
"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":"Изменить тип тикета"
} }
} }
} }
+27 -12
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,9 +24,17 @@
"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}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"claimTitle":"Este ticket fué reclamado por {0}",
"unclaimTitle":"¡Este ticket se encuentra desatendido!",
"changeTitle":"¡Cambiado el tipo de ticket a {0}!",
"statsTitle":"¡Aquí están las estadísticas para {0}!",
"autocloseTitle":"¡Este ticket será cerrado después de {0}!",
"autocloseRejectTitle":"¡Cierre automático del ticket desactivado!",
"autocloseWarn":"¡Esto solo afecta tickets inactivos!",
"goToTicket":"ir al ticket",
"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!_"
}, },
@@ -42,19 +49,20 @@
"deleteCmd":"Eliminar un ticket.", "deleteCmd":"Eliminar un ticket.",
"addCmd":"Agregar un usuario al ticket.", "addCmd":"Agregar un usuario al ticket.",
"removeCmd":"Eliminar un usuario del ticket.", "removeCmd":"Eliminar un usuario del ticket.",
"reopenCmd":"Re-Abre un ticket después de que este se vea cerrado." "reopenCmd":"Re-Abre un ticket después de que este se vea cerrado.",
"changeCmd":"Cambia el tipo de ticket.",
"claimCmd":"Reclama un ticket.",
"unclaimCmd":"Desatiende un ticket.",
"statsCmd":"Mira las estadísticas de los tickets.",
"autocloseCmd":"Establece un temporizador para cerrar el ticket."
}, },
"buttons":{ "buttons":{
"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":{
"reopenTitle":"¡Ticket Re-Abierto!",
"reopenDescription":"¡Siéntete libre de hablar de nuevo!",
"closedTitle":"¡Ticket cerrado!",
"closedDescription":"¡Solo admins pueden hablar ahora en este ticket!\n\n*¡Presiona en el botón de abajo para eliminar o re-abrir el ticket!*", "closedDescription":"¡Solo admins pueden hablar ahora en este ticket!\n\n*¡Presiona en el botón de abajo para eliminar o re-abrir el ticket!*",
"createdTitle":"¡Ticket creado!", "createdTitle":"¡Ticket creado!",
"createdDescription":"¡Ticket creado, también te he mencionado en él!", "createdDescription":"¡Ticket creado, también te he mencionado en él!",
@@ -66,18 +74,25 @@
"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...",
"none":"Ninguna.", "none":"Ninguna.",
"reason":"Razón", "reason":"Razón",
"createdat":"creado el",
"openedby":"abierto por",
"deletedby":"eliminado por", "deletedby":"eliminado por",
"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í"
} }
} }
+98
View File
@@ -0,0 +1,98 @@
{
"errors":{
"missingArgsTitle":"Geçersiz argümanlar!",
"missingArgsDescription":"Eksik argüman!",
"noPermsTitle":"Bunun için yetkin yok!",
"noPermsDescription":"Bunu yapmak için 'ADMİNİSTRAR'rolüne ihtiyacınız var, veya izin verilen roller listesinde olun!",
"noPermsDelete":"Sadece adminler bileti silebilir!",
"chooseFromListTitle":"Geçersiz Kimlik",
"chooseFromListDescription":"Aşağıdaki kimliklerden birini seçin:",
"boterror":"Bot Hatası!",
"notInTicketTitle":"Bir biletin yok!",
"notInTicketDescription":"Bu komut bilet dışında kullanılamaz!",
"ticketDoesntExist":"Bu bilet artık yok!",
"roleDoesntExist":"Bu rol artık yok!",
"anotherOption":"Bu seçenek bir bilet değil, başka bir türdür!",
"maxAmountTitle":"Ulaşabileceğin maksimum tutara ulaştın!",
"maxAmountDescription":"İzin verilen maksimum bilet sayısına ulaştınız!\nHhayır yeni bir tane oluşturamazsın!",
"somethingWentWrong":"**Bir şeyler ters gitti!**\n lütfen başka bir zaman tekrar deneyin!"
},
"commands":{
"userAddedTitle":"Bilete {0} adlı kullanıcı eklendi!",
"userRemovedTitle":"Biletten {0} adlı kullanıcı çıkarıldı !",
"renameTitle":"Bilet ismi {0} olarak değştirildi!",
"closeTitle":"Bilet Kapatıldı!",
"deleteTitle":"Bilet siliniyor...",
"reopenTitle":"Bilet Yeniden Açıldı!",
"claimTitle":"Bu bilet artık talep edildi. {0}",
"unclaimTitle":"Tu bilet artık talep edilmiyor!",
"changeTitle":"Bu bilet türü {0} olarak değiştirildi!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"ticketWarning":"Gömme aşağıdaki mesajda yer almaktadır!",
"maxTicketWarning":"**Uyarı:** _You can only create {0} ticket(s) at a time!_"
},
"helpMenu":{
"title":"Kullanılabilir Komutlar:",
"header1":"**Bilet oluşturmak için {0} kanalını kullan!**\n\n",
"header2":"**Bilet oluşturmak için `/new` veya `/ticket' komutunu çalıştırın!**\n\n",
"msgCmd":"Gömülü bilet mesajı gönderir. (sadece yöneticiler)",
"renameCmd":"Bilet adını değiştirir. (boşluk olmadan)",
"closeCmd":"Bileti kapatır.",
"deleteCmd":"Bileti siler.",
"addCmd":"Bilete kullanıcı ekler.",
"removeCmd":"Biletten kullanıcı çıkarır.",
"reopenCmd":"Bilet kapandıktan sonra tekrar açar.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
},
"buttons":{
"close":"Bileti Kapat",
"delete":"Bileti Sil",
"reopen":"Bileti Yeniden Aç",
"closeWithReason":"Bu bileti neden kapatıyorsun ?"
},
"messages":{
"closedDescription":"Bu bilette artık sadece yöneticiler konuşabilir!\n\n* Bu bileti silmek veya yeniden açmak için aşağıdaki butona tıklayın!*",
"createdTitle":"Talep Oluşturuldu!",
"createdDescription":"Your ticket is created, you can detect it by a ping!",
"newTicketDmTitle":"Yeni Bilet!",
"closedTicketDmTitle":"Bilet Kapatıldı!",
"deletedTicketDmTitle":"Bilet Silindi!",
"closedTicketDmDescription":"Senin biletin kapatıldı!",
"deletedTicketDmDescription":"Senin biletin silindi!",
"reopenTicketDmTitle":"Bilet yeniden açıldı!",
"reopenTicketDmDescription":"Senin biletin yeniden açıldı!",
"chooseCategory":"Bir kategori seç:",
"gettingdeleted":"Bu bilet siliniyor...",
"none":"yok",
"reason":"sebep",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"Silen kişi",
"closedby":"Kapatan kişi",
"modalreason":"Bu biletin kapanmasının sebebi nedir?",
"chooseATicket": "Bir bilet seçin"
},
"transcripts":{
"title":"Transkript",
"processed":"Bu transkript işleniyor",
"wait":"Lütfen Bekleyiniz!",
"estimated":"Tahmini Süre",
"available":"Transkript burada mevcuttur"
}
}
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

+4 -6
View File
@@ -1,11 +1,11 @@
{ {
"name": "open-ticket", "name": "open-ticket",
"version": "3.0.0", "version": "3.3.0",
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.", "description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"start": "node index.js", "start": "node index.js",
"test": "node index.js d", "test": "node index.js --devconfig",
"slashEnable": "node index.js slash enable", "slashEnable": "node index.js slash enable",
"slashDisable": "node index.js slash disable", "slashDisable": "node index.js slash disable",
"cleardata": "node ./core/dynamicdatabase/cleardata.js" "cleardata": "node ./core/dynamicdatabase/cleardata.js"
@@ -15,10 +15,8 @@
"dependencies": { "dependencies": {
"axios": "^0.27.2", "axios": "^0.27.2",
"chalk": "^5.0.1", "chalk": "^5.0.1",
"discord.js": "^14.0.2", "discord.js": "^14.8.0",
"express": "^4.17.1", "node": "^16.10.0"
"node": "^16.10.0",
"node-localstorage": "^2.2.1"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
BIN
View File
Binary file not shown.
+3
View File
@@ -0,0 +1,3 @@
This file is only here to make sure that this directory exists!
I don't have any other use :)
+18
View File
@@ -0,0 +1,18 @@
{
"sendTranscripts":{
"enableChannel":false,
"enableDM":false,
"channel":"transcript channel id",
"useHTMLtranscripts":true
},
"style":{
"titleColor":"#F8BA00",
"background":{
"enableCustomBackground":false,
"backgroundModus":"color OR image",
"backgroundData":"#abc123 OR https://www.example.com/image.png"
}
}
}