Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3b99e656e | ||
|
|
07e2a68d06 | ||
|
|
795ca4f981 | ||
|
|
5231129278 | ||
|
|
f62bc7adf9 | ||
|
|
5de6b1e906 | ||
|
|
62413505d6 | ||
|
|
20b617f6eb | ||
|
|
94510bbfb0 | ||
|
|
d51511fdb5 | ||
|
|
3447a37603 | ||
|
|
4b17aa640f | ||
|
|
3b7674f1a5 | ||
|
|
7de9339da3 | ||
|
|
e2e1e19bc8 | ||
|
|
5f19adf561 | ||
|
|
1bb70745ea | ||
|
|
589bbe5cd5 | ||
|
|
447fddea56 | ||
|
|
bf7a003799 | ||
|
|
6115ab1cc8 | ||
|
|
c2307fd1ed | ||
|
|
2a3850c3cc | ||
|
|
688c40ce7b | ||
|
|
dee2a21be9 | ||
|
|
d7ae040d60 | ||
|
|
7b6202985a | ||
|
|
a2f2c601a5 | ||
|
|
b27016df2e | ||
|
|
6341f2f71b | ||
|
|
56a5b9c7d0 | ||
|
|
f608cb71ce | ||
|
|
7c7c325307 | ||
|
|
832021d72a | ||
|
|
030554a7f5 | ||
|
|
ada5ea0c5d | ||
|
|
fb6b891835 | ||
|
|
739ad81f3f | ||
|
|
a6f67a9452 | ||
|
|
56a6540663 | ||
|
|
5f8812d261 | ||
|
|
7a3dcf4c42 | ||
|
|
7cebd4dd6a | ||
|
|
27912a0c37 | ||
|
|
67871d885a | ||
|
|
1bd0d013ed | ||
|
|
a074a17519 | ||
|
|
67af96ef5c | ||
|
|
a041f28cf7 | ||
|
|
a8c9c2ea8d |
+43
-3
@@ -1,3 +1,43 @@
|
||||
# comming soon
|
||||
For now on, you can create a ticket in our server:
|
||||
https://discord.dj-dj.be
|
||||
# Contributing
|
||||
## Translation
|
||||
### Step 1: checking
|
||||
1. [Check if the language isn't already in open ticket!](/language/)
|
||||
2. Check if the current translation is up-to-date!
|
||||
3. Can you edit/write JSON?
|
||||
|
||||
If there is translation missing & you can write json, then go to the next step!
|
||||
|
||||
### Step 2: translating
|
||||
**RULES:**
|
||||
- Always upload or create a pull request to the [__`dev` branch!__](https://github.com/DJj123dj/open-ticket/tree/dev)
|
||||
- Don't change anything else, except the translation you are adding!
|
||||
- Translations are checked before uploading, so don't write things that aren't specified in the json file
|
||||
- Always start translating from `english.json` or `custom.json`! Never from another language.
|
||||
|
||||
If you translate, you need to change 2 files! The first one is required, the other 2 are optional & will be added by us if you don't do it!
|
||||
1. add `yourlanguage.json` to the `/language/` directory
|
||||
2. add your username to the `_CREDITS` part of `yourlanguage.json`!
|
||||
3. add your discord username in the translator table in `README.md`
|
||||
|
||||
### Step 3: waiting
|
||||
Translations will always be added in the **next version** of Open Ticket! They will never be added to the `main` branch directly without anything else! This means that it can take some time before your translation is in the official version!
|
||||
|
||||
## Writing plugins
|
||||
We are going to create an official repository for plugins soon!
|
||||
But don't worry! You can already write some plugins!
|
||||
|
||||
**RULES:**
|
||||
- Always specify the versions that the plugin is compatible with!
|
||||
- If extra npm dependencies are needed, then they also need to be specified!
|
||||
- If there are errors while you write a plugin/edit the code in some way. Then we can't help you with fixing the bug. We only fix bugs that are part of the original unedited version of Open Ticket!
|
||||
|
||||
## Other versions of contributing
|
||||
If you want to contribute in another way, feel free to join [our discord server](https://discord.dj-dj.be) & talk about how you are going to do it. We will always help you further!
|
||||
|
||||
<br>
|
||||
CONTRIBUTING GUIDELINES - Last updated: 23/3/2023<br>
|
||||
© DJdj Development<br><br>
|
||||
Website: https://www.dj-dj.be <br>
|
||||
Discord: https://discord.dj-dj.be <br>
|
||||
Email: support@dj-dj.be <br>
|
||||
Open Ticket website: https://openticket.dj-dj.be
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve Open Ticket
|
||||
about: Report bugs to help us improve open ticket!
|
||||
title: "[BUG] your bug"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
assignees: DJj123dj
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
name: Plugin
|
||||
about: Show your open ticket plugins here!
|
||||
about: Show your plugin to the developers from open ticket!
|
||||
title: "[PLUGIN] your plugin"
|
||||
labels: plugin
|
||||
assignees: ''
|
||||
assignees: DJj123dj
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
We only support Open Ticket versions listed below! With support, we mean bugs, errors & helping you further!
|
||||
|
||||
✅ Supported
|
||||
🟧 Partially Supported
|
||||
❌ Not Supported
|
||||
|
||||
| Version | Supported |
|
||||
|-----------|-------------------|
|
||||
| 3.5.0 | ✅ |
|
||||
| 3.4.4 | ✅ |
|
||||
| 3.4.3 | 🟧 |
|
||||
| 3.4.2 | 🟧 |
|
||||
| < 3.4.2 | ❌ |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
You can report Vulnerabilities, Errors & Bugs using one of the methods below:
|
||||
- Create an issue on github
|
||||
- Create a ticket in our [discord server](https://discord.dj-dj.be)
|
||||
- Report the bug in DM on discord (djj123dj)
|
||||
- Email [support@dj-dj.be](mailto:support@dj-dj.be)
|
||||
|
||||
While reporting your problem, please be clear about what the problem is.
|
||||
We would like to know the issue in as much detail as possible.
|
||||
If possible, try to provide screenshots!
|
||||
The `openticketdebug.txt` file would also be handy to upload!<br>
|
||||
**Always specify the version of open ticket that you are working with and if you have modified it or not!**
|
||||
|
||||
## Contributing
|
||||
Visit [Contributing.md](/.github/CONTRIBUTING.md) for rules about translating & adding features!
|
||||
|
||||
<br>
|
||||
SECURITY POLICY - Last updated: 14/12/2023<br>
|
||||
© DJdj Development<br><br>
|
||||
Website: https://www.dj-dj.be <br>
|
||||
Discord: https://discord.dj-dj.be <br>
|
||||
Email: support@dj-dj.be <br>
|
||||
Open Ticket website: https://openticket.dj-dj.be
|
||||
@@ -13,6 +13,7 @@ storage/dynamicDB/
|
||||
storage/slashcmdEnabled.txt
|
||||
storage/database.json
|
||||
storage/tsdatabase.json
|
||||
storage/stats.json
|
||||
storage/.DS_Store
|
||||
.vscode/
|
||||
livestatus.json
|
||||
|
||||
@@ -1,69 +1,84 @@
|
||||
<img src="https://www.dj-dj.be/wp-content/uploads/2023/02/open-ticket-cropped.png" alt="Open Ticket" width="600px">
|
||||
# Coming Soon: OPEN TICKET v4.0 🎉
|
||||
Open Ticket v4 will be the first fully rewritten version of Open Ticket!
|
||||
There will be massive improvements for more stability & features! But the best part of all is that the API will be 50x more advanced than the current API! This way, you can write every plugin you ever imagined!
|
||||
<hr>
|
||||
|
||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v3.3.1) []() [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [](https://docs.openticket.dj-dj.be)
|
||||
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket" width="600px">
|
||||
|
||||
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v3.5.0) []() [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [](https://docs.openticket.dj-dj.be)
|
||||
|
||||
### Open Ticket
|
||||
Open Ticket is of the most customisable discord ticket bots of all time!
|
||||
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!
|
||||
Open Ticket is the most customisable discord ticket bot that you will ever find! There are more than 150 options to customise in the config! This includes html transcripts, unlimited amount of tickets, custom embeds & more! Did you know that even the html transcripts are highly customisable? Don't wait and check it out! If you're having trouble setting the bot up, feel free to join our support server and we will help you further!
|
||||
|
||||
Take a look at all the features and discover the possibilities!
|
||||
### [Documentation](https://docs.openticket.dj-dj.be/quick-start)
|
||||
### [Visit the Documentation!](https://docs.openticket.dj-dj.be/quick-start)
|
||||
|
||||
## Features
|
||||
- **🎉 NEW! html transcripts!**
|
||||
- **🎉 advanced html transcripts!**
|
||||
- 🔒 close, ❌ delete & ✅ re-open tickets
|
||||
- 🇬🇧 translation in 14 different languages
|
||||
- 🇬🇧 translation in 19 different languages
|
||||
- 📄 very advanced customisation
|
||||
- 🆗 buttons or 🔽 dropdowns!
|
||||
- 🆒 plugins
|
||||
- ∞ unlimited tickets & unlimited messages
|
||||
- ➕➖ add/remove users from a ticket
|
||||
- 📊 ticket, user & global staticstics
|
||||
- /slash & text commands
|
||||
|
||||
<details>
|
||||
<summary><b>Click here for even more features!</b></summary>
|
||||
<summary><b>But wait, there are even more features! Click here to discover!</b></summary>
|
||||
|
||||
|
||||
- very customisable
|
||||
- fully customisable embeds & buttons
|
||||
- close tickets with reason
|
||||
- also includes reaction roles!
|
||||
- reaction roles (or verification system)
|
||||
- discord interaction buttons
|
||||
- discord.js 14
|
||||
- discord.js v14
|
||||
</details>
|
||||
|
||||
## preview
|
||||
Images coming soon<br>
|
||||
You can already see some images at our [documentation!](https://docs.openticket.dj-dj.be)
|
||||
<img src="https://apis.dj-dj.be/cdn/openticket/message_buttons.png" alt="Message with buttons" width="350px">
|
||||
<img src="https://apis.dj-dj.be/cdn/openticket/message_dropdown.png" alt="Message with dropdown" width="350px">
|
||||
<br>
|
||||
<img src="https://apis.dj-dj.be/cdn/openticket/firstmsg.png" alt="Ticket start message" width="350px">
|
||||
<img src="https://apis.dj-dj.be/cdn/openticket/command_close.png" alt="Ticket start message" width="350px">
|
||||
|
||||
|
||||
## credits
|
||||
DJdj Development Team
|
||||
|Main Developer|Developer|Support Team|Designer|
|
||||
|--------------|---------|-----------|---------|
|
||||
|DJj123dj |Sanke |DJ-Lite |vuur_draak|
|
||||
### Developer Team
|
||||
|Role |User (discord name)|
|
||||
|-----------------|-------------------|
|
||||
|Lead Developer |djj123dj |
|
||||
|Developer |sankedev |
|
||||
|Support Team |lover_catss |
|
||||
|Designer |vuur_draak |
|
||||
|
||||
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 |
|
||||
|Slovenian |n1kkec#5341 |
|
||||
### Translators
|
||||
|Language |Maintainer (discord name) |Status |
|
||||
|-------------------|--------------------------|--------------------------------|
|
||||
|English |djj123dj |🟢 Up To Date |
|
||||
|Dutch |djj123dj |🟢 Up To Date |
|
||||
|French |sankedev |🟢 Up To Date |
|
||||
|Romanian |sankedev |🟢 Up To Date |
|
||||
|Spanish |redactado & josuens |🟢 Up To Date |
|
||||
|German |david.3 |🟢 Up To Date |
|
||||
|Italian |maurizio26 |🟢 Up To Date |
|
||||
|Czech |spyeye_ |🟢 Up To Date |
|
||||
|Arabic |Sarcastic#9318 |🔴 Outdated |
|
||||
|Danish |.the_gamer |🟢 Up To Date |
|
||||
|Portuguese |quiradon |🔴 Outdated |
|
||||
|Russian |apexo & ander |🟢 Up To Date |
|
||||
|Ukrainian |ander |🟢 Up To Date |
|
||||
|Turkish |Hydra#0009 |🔴 Outdated |
|
||||
|Polish |mkevas |🟢 Up To Date |
|
||||
|Slovenian |n1kkec |🔴 Outdated |
|
||||
|Thai |modshd |🟢 Up To Date |
|
||||
|Norwegian |noonenook |🟢 Up To Date |
|
||||
|Greek |stefanos__. |🔴 Outdated |
|
||||
|
||||
## links
|
||||
current version: _v3.3.1_
|
||||
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
|
||||
current version: _v3.5.0_
|
||||
</br>changelog: [click here](https://otgithub.dj-dj.be/releases)
|
||||
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
|
||||
|
||||
© 2023 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
|
||||
|
||||
+18
-25
@@ -18,30 +18,27 @@ module.exports = () => {
|
||||
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"add <user>`")]})
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
|
||||
msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
|
||||
|
||||
var loguser = msg.mentions.users.first()
|
||||
log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}])
|
||||
log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}])
|
||||
log("command","someone used the 'add' command",[{key:"user",value:msg.author.username}])
|
||||
log("system","user added to ticket",[{key:"user",value:msg.author.username},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.username}])
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
||||
|
||||
APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
APIEvents.onCommand("add",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => {
|
||||
@@ -50,32 +47,28 @@ module.exports = () => {
|
||||
const user = interaction.options.getUser("user")
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
return
|
||||
}
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
|
||||
interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
|
||||
|
||||
var loguser = user
|
||||
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}])
|
||||
log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}])
|
||||
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.username}])
|
||||
log("system","user added to ticket",[{key:"user",value:interaction.user.username},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.username}])
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
||||
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
|
||||
})
|
||||
|
||||
APIEvents.onCommand("add",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
|
||||
})
|
||||
}
|
||||
+49
-40
@@ -12,30 +12,36 @@ const DISABLE = require("../core/api/api.json").disable
|
||||
module.exports = () => {
|
||||
bot.errorLog.log("debug","COMMANDS: loaded change.js")
|
||||
|
||||
if (!DISABLE.commands.text.change) client.on("messageCreate",msg => {
|
||||
if (!DISABLE.commands.text.change) client.on("messageCreate", async msg => {
|
||||
if (!msg.content.startsWith(config.prefix+"change")) return
|
||||
if (!msg.channel.isTextBased()) return
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
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))
|
||||
config.options.forEach((o) => {
|
||||
if (o.type == "ticket") 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)
|
||||
const newTicket = require("../core/utils/configParser").getTicketById(newtype,true)
|
||||
if (!newTicket) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
|
||||
|
||||
/**@type {discord.PermissionOverwriteManager} */
|
||||
const prePermsManager = msg.channel.permissionOverwrites
|
||||
const prePerms = prePermsManager.cache
|
||||
|
||||
/**@type {String} */
|
||||
var chName = msg.channel.name
|
||||
const splitted = chName.split("-")
|
||||
@@ -47,35 +53,46 @@ module.exports = () => {
|
||||
if (parent && parent.type == discord.ChannelType.GuildCategory) msg.channel.setParent(parent)
|
||||
}
|
||||
|
||||
msg.channel.setName(newTicket.channelprefix+name)
|
||||
prePermsManager.set(prePerms)
|
||||
msg.channel.setName(newTicket.channelprefix+name).catch(() => {
|
||||
msg.channel.send({embeds:[bot.errorLog.failedRenameChannel]})
|
||||
})
|
||||
|
||||
hiddendata.find((value,index) => {
|
||||
if (value.key == "type"){
|
||||
hiddendata[index] = {key:"type",value:newtype}
|
||||
}
|
||||
})
|
||||
|
||||
msg.channel.send({embeds:[bot.embeds.commands.changeEmbed(msg.author,newtype)]})
|
||||
|
||||
log("command","someone used the 'change' command",[{key:"user",value:msg.author.tag}])
|
||||
log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
|
||||
APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
log("command","someone used the 'change' command",[{key:"user",value:msg.author.username}])
|
||||
log("system","ticket type changed",[{key:"user",value:msg.author.username},{key:"ticket",value:name},{key:"newtype",value:newtype}])
|
||||
APIEvents.onCommand("change",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),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.channel.isTextBased()) return
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
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))
|
||||
config.options.forEach((o) => {
|
||||
if (o.type == "ticket") list.push(o.id)
|
||||
})
|
||||
|
||||
var newtype = interaction.options.getString("type",true)
|
||||
const newTicket = require("../core/utils/configParser").getTicketById(newtype,true)
|
||||
@@ -97,29 +114,21 @@ module.exports = () => {
|
||||
if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent)
|
||||
}
|
||||
|
||||
await prePermsManager.set(prePerms)
|
||||
interaction.channel.setName(newTicket.channelprefix+name)
|
||||
prePermsManager.set(prePerms)
|
||||
interaction.channel.setName(newTicket.channelprefix+name).catch(() => {
|
||||
interaction.channel.send({embeds:[bot.errorLog.failedRenameChannel]})
|
||||
})
|
||||
|
||||
var newHiddendata = hiddendata.data
|
||||
newHiddendata.find((value,index) => {
|
||||
hiddendata.find((value,index) => {
|
||||
if (value.key == "type"){
|
||||
newHiddendata[index] = {key:"type",value:newtype}
|
||||
hiddendata[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())
|
||||
})
|
||||
log("command","someone used the 'change' command",[{key:"user",value:interaction.user.username}])
|
||||
log("system","ticket type changed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newtype",value:newtype}])
|
||||
APIEvents.onCommand("change",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+35
-34
@@ -14,48 +14,49 @@ const DISABLE = require("../core/api/api.json").disable
|
||||
module.exports = () => {
|
||||
bot.errorLog.log("debug","COMMANDS: loaded claim.js")
|
||||
|
||||
if (!DISABLE.commands.text.claim) client.on("messageCreate",msg => {
|
||||
if (!DISABLE.commands.text.claim) client.on("messageCreate", async msg => {
|
||||
if (!msg.content.startsWith(config.prefix+"claim")) return
|
||||
var user = msg.mentions.users.first()
|
||||
|
||||
const claimingUser = user ? user : msg.author
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
/**@type {discord.Message} */
|
||||
hiddendata.push({key:"claimedby",value:claimingUser.id})
|
||||
bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata)
|
||||
storage.set("claimData",msg.channel.id,claimingUser.id)
|
||||
|
||||
await msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const 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))
|
||||
.setFooter({text:"claimed by: "+msg.author.username,iconURL:msg.author.displayAvatarURL()})
|
||||
|
||||
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
|
||||
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
|
||||
}else{
|
||||
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
|
||||
}
|
||||
})
|
||||
|
||||
msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]})
|
||||
|
||||
log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}])
|
||||
log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}])
|
||||
log("command","someone used the 'claim' command",[{key:"user",value:msg.author.username}])
|
||||
log("system","user claimed to ticket",[{key:"user",value:msg.author.username},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.username}])
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
||||
APIEvents.onCommand("claim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
APIEvents.onCommand("claim",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => {
|
||||
@@ -64,43 +65,43 @@ module.exports = () => {
|
||||
const user = interaction.options.getUser("user",false) ? interaction.options.getUser("user",true) : interaction.user
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
|
||||
return
|
||||
return interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
|
||||
}
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
/**@type {discord.Message} */
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
|
||||
const hiddendata = hdraw.hiddenData
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
hiddendata.push({key:"claimedby",value:user.id})
|
||||
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
|
||||
storage.set("claimData",interaction.channel.id,user.id)
|
||||
|
||||
hiddendata.data.push({key:"claimedby",value:interaction.user.id})
|
||||
storage.set("claimData",interaction.channel.id,interaction.user.id)
|
||||
await interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
|
||||
const newEmbed = new embed(firstmsg.embeds[0].data)
|
||||
.setFooter({text:"claimed by: "+user.tag,iconURL:user.displayAvatarURL()})
|
||||
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
|
||||
.setFooter({text:"claimed by: "+user.username,iconURL:user.displayAvatarURL()})
|
||||
|
||||
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
|
||||
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
|
||||
}else{
|
||||
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
|
||||
}
|
||||
})
|
||||
|
||||
interaction.editReply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]})
|
||||
|
||||
log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.tag}])
|
||||
log("system","user claimed to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:user.tag}])
|
||||
log("command","someone used the 'claim' command",[{key:"user",value:interaction.user.username}])
|
||||
log("system","user claimed to ticket",[{key:"user",value:interaction.user.username},{key:"ticket",value:interaction.channel.name},{key:"claimed_user",value:user.username}])
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
APIEvents.onTicketClaim(interaction.user,user,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
||||
APIEvents.onCommand("claim",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
APIEvents.onCommand("claim",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+10
-19
@@ -24,13 +24,11 @@ module.exports = () => {
|
||||
}
|
||||
const reason = tempreason
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
||||
if (hiddendata.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
||||
|
||||
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
|
||||
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
|
||||
@@ -46,14 +44,11 @@ module.exports = () => {
|
||||
|
||||
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.username}])
|
||||
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
|
||||
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.close) client.on("interactionCreate",async(interaction) => {
|
||||
if (!interaction.isChatInputCommand()) return
|
||||
if (interaction.commandName != "close") return
|
||||
@@ -64,13 +59,11 @@ module.exports = () => {
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
||||
if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
||||
|
||||
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
|
||||
interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
|
||||
@@ -86,9 +79,7 @@ module.exports = () => {
|
||||
|
||||
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.username}])
|
||||
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
|
||||
})
|
||||
})
|
||||
}
|
||||
+16
-22
@@ -16,17 +16,16 @@ module.exports = () => {
|
||||
if (!msg.content.startsWith(config.prefix+"delete")) return
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]})
|
||||
|
||||
var name = msg.channel.name
|
||||
@@ -40,10 +39,8 @@ module.exports = () => {
|
||||
|
||||
require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"delete",false,true)
|
||||
|
||||
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}])
|
||||
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.username}])
|
||||
APIEvents.onCommand("delete",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
|
||||
|
||||
})
|
||||
|
||||
@@ -52,19 +49,18 @@ module.exports = () => {
|
||||
if (interaction.commandName != "delete") return
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]})
|
||||
}
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
||||
|
||||
var name = interaction.channel.name
|
||||
@@ -78,9 +74,7 @@ module.exports = () => {
|
||||
|
||||
require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
|
||||
|
||||
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}])
|
||||
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
|
||||
})
|
||||
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.username}])
|
||||
APIEvents.onCommand("delete",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+6
-5
@@ -21,7 +21,8 @@ module.exports = () => {
|
||||
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 [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([
|
||||
{name:"Autoclose",value:l.helpMenu.autocloseCmd+"\n`"+prefix+"autoclose enable <inactive time>`\n`"+prefix+"autoclose disable`"}
|
||||
{name:"Autoclose",value:l.helpMenu.autocloseCmd+"\n`"+prefix+"autoclose enable <inactive time>`\n`"+prefix+"autoclose disable`"},
|
||||
{name:"Stats",value:"Get statistics from the bot"+"\n`"+prefix+"stats global`\n`"+prefix+"stats ticket`\n`"+prefix+"stats user [user]`"}
|
||||
])
|
||||
|
||||
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
|
||||
@@ -32,15 +33,15 @@ module.exports = () => {
|
||||
|
||||
if (msg.content == config.prefix || msg.content == config.prefix+" " || msg.content == otherprefix){
|
||||
msg.channel.send({embeds:[helpEmbed]})
|
||||
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
|
||||
log("command","someone used the 'help' command",[{key:"user",value:msg.author.username}])
|
||||
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
|
||||
return
|
||||
}
|
||||
|
||||
if (args[1]){
|
||||
if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen")){
|
||||
if (!args[1].startsWith("close") && !args[1].startsWith("delete") && !args[1].startsWith("remove") && !args[1].startsWith("add") && !args[1].startsWith("msg") && !args[1].startsWith("remove") && !args[1].startsWith("rename") && !args[1].startsWith("reopen") && !args[1].startsWith("change") && !args[1].startsWith("claim") && !args[1].startsWith("unclaim") && !args[1].startsWith("stats")){
|
||||
msg.channel.send({embeds:[helpEmbed]})
|
||||
log("command","someone used the 'help' command",[{key:"user",value:msg.author.tag}])
|
||||
log("command","someone used the 'help' command",[{key:"user",value:msg.author.username}])
|
||||
APIEvents.onCommand("help",true,msg.author,msg.channel,msg.guild,new Date())
|
||||
}
|
||||
}
|
||||
@@ -51,7 +52,7 @@ module.exports = () => {
|
||||
if (interaction.commandName != "help") return
|
||||
|
||||
interaction.reply({embeds:[helpEmbed]})
|
||||
log("command","someone used the 'help' command",[{key:"user",value:interaction.user.tag}])
|
||||
log("command","someone used the 'help' command",[{key:"user",value:interaction.user.username}])
|
||||
APIEvents.onCommand("help",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+18
-23
@@ -18,30 +18,27 @@ module.exports = () => {
|
||||
if (!user) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<user>`:\n`"+config.prefix+"remove <user>`")]})
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
msg.channel.permissionOverwrites.delete(user.id)
|
||||
msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
|
||||
|
||||
var loguser = msg.mentions.users.first()
|
||||
|
||||
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}])
|
||||
log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}])
|
||||
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.username}])
|
||||
log("system","user removed from ticket",[{key:"user",value:msg.author.username},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.username}])
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
||||
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
APIEvents.onCommand("remove",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => {
|
||||
@@ -50,30 +47,28 @@ module.exports = () => {
|
||||
const user = interaction.options.getUser("user")
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
return
|
||||
}
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
await interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
interaction.channel.permissionOverwrites.delete(user.id)
|
||||
interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
|
||||
|
||||
var loguser = user
|
||||
|
||||
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}])
|
||||
log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}])
|
||||
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.username}])
|
||||
log("system","user removed from ticket",[{key:"user",value:interaction.user.username},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.username}])
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
APIEvents.onTicketRemove(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
||||
APIEvents.onCommand("remove",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
APIEvents.onCommand("remove",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+18
-25
@@ -16,17 +16,16 @@ module.exports = () => {
|
||||
if (!msg.content.startsWith(config.prefix+"rename")) return
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
var newname = msg.content.split(config.prefix+"rename")[1].substring(1)
|
||||
|
||||
if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<name>`:\n`"+config.prefix+"rename <name>`")]})
|
||||
@@ -41,16 +40,12 @@ module.exports = () => {
|
||||
})
|
||||
|
||||
if (!prefix) prefix = "noprefix-"
|
||||
|
||||
msg.channel.setName(prefix+newname)
|
||||
msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]})
|
||||
|
||||
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}])
|
||||
log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
|
||||
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
|
||||
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.username}])
|
||||
log("system","ticket renamed",[{key:"user",value:msg.author.username},{key:"ticket",value:name},{key:"newname",value:newname}])
|
||||
APIEvents.onCommand("rename",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => {
|
||||
@@ -58,19 +53,18 @@ module.exports = () => {
|
||||
if (interaction.commandName != "rename") return
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
return
|
||||
}
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
var newname = interaction.options.getString("name")
|
||||
var name = interaction.channel.name
|
||||
var prefix = ""
|
||||
@@ -86,10 +80,9 @@ module.exports = () => {
|
||||
interaction.channel.setName(prefix+newname)
|
||||
interaction.editReply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]})
|
||||
|
||||
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}])
|
||||
log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
|
||||
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.username}])
|
||||
log("system","ticket renamed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newname",value:newname}])
|
||||
|
||||
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
APIEvents.onCommand("rename",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+10
-19
@@ -15,46 +15,37 @@ module.exports = () => {
|
||||
if (!DISABLE.commands.text.reopen) client.on("messageCreate",msg => {
|
||||
if (!msg.content.startsWith(config.prefix+"reopen")) return
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
||||
if (hiddendata.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
||||
|
||||
msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]})
|
||||
|
||||
require("../core/ticketActions/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author)
|
||||
|
||||
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}])
|
||||
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.username}])
|
||||
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.reopen) client.on("interactionCreate",async (interaction) => {
|
||||
if (!interaction.isChatInputCommand()) return
|
||||
if (interaction.commandName != "reopen") return
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(async msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
||||
if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
||||
|
||||
await interaction.editReply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
|
||||
|
||||
require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
||||
|
||||
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}])
|
||||
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.username}])
|
||||
APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
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 stats.js")
|
||||
|
||||
if (!DISABLE.commands.text.stats) client.on("messageCreate",async (msg) => {
|
||||
if (!msg.content.startsWith(config.prefix+"stats global") && !msg.content.startsWith(config.prefix+"stats ticket") && !msg.content.startsWith(config.prefix+"stats user")) return
|
||||
if (!msg.guild) return
|
||||
|
||||
/**@type {"global"|"ticket"|"user"} */
|
||||
const mode = msg.content.split(config.prefix+"stats ")[1]
|
||||
|
||||
if (mode == "global"){
|
||||
//send global stats
|
||||
msg.channel.send({embeds:[await bot.statsManager.createGlobalStatsEmbed()]})
|
||||
|
||||
}else if (mode == "user"){
|
||||
//send user stats
|
||||
const mention = msg.mentions.users.first()
|
||||
if (mention){
|
||||
//get user from mention
|
||||
if (!bot.statsManager.existStats("user","TICKETS_CREATED",mention.id)){
|
||||
msg.channel.send({embeds:[bot.errorLog.serverError(l.stats.errorUserNotFound)]})
|
||||
return
|
||||
}
|
||||
msg.channel.send({embeds:[await bot.statsManager.createUserStatsEmbed(msg.guild,mention,msg.channel.id)]})
|
||||
}else{
|
||||
//use author as user
|
||||
if (!bot.statsManager.existStats("user","TICKETS_CREATED",msg.author.id)){
|
||||
msg.channel.send({embeds:[bot.errorLog.serverError(l.stats.errorUserNotFound)]})
|
||||
return
|
||||
}
|
||||
msg.channel.send({embeds:[await bot.statsManager.createUserStatsEmbed(msg.guild,msg.author,msg.channel.id)]})
|
||||
}
|
||||
|
||||
}else if (mode == "ticket"){
|
||||
//send ticket stats
|
||||
if (!bot.statsManager.existStats("ticket","STATUS",msg.channel.id)){
|
||||
msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
return
|
||||
}
|
||||
msg.channel.send({embeds:[await bot.statsManager.createTicketStatsEmbed(msg.guild,msg.channel.id)]})
|
||||
}
|
||||
|
||||
log("command","someone used the 'stats' command",[{key:"user",value:msg.author.username},{key:"mode",value:mode}])
|
||||
APIEvents.onCommand("stats",true,msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
|
||||
if (!DISABLE.commands.slash.stats) client.on("interactionCreate",async (interaction) => {
|
||||
if (!interaction.isChatInputCommand()) return
|
||||
if (interaction.commandName != "stats") return
|
||||
if (!interaction.guild) return
|
||||
|
||||
/**@type {"global"|"ticket"|"user"} */
|
||||
const mode = interaction.options.getSubcommand(true)
|
||||
|
||||
await interaction.deferReply()
|
||||
|
||||
if (mode == "global"){
|
||||
//send global stats
|
||||
interaction.editReply({embeds:[await bot.statsManager.createGlobalStatsEmbed()]})
|
||||
|
||||
}else if (mode == "user"){
|
||||
//send user stats
|
||||
const mention = interaction.options.getUser("user",false)
|
||||
if (mention){
|
||||
//get user from mention
|
||||
if (!bot.statsManager.existStats("user","TICKETS_CREATED",mention.id)){
|
||||
interaction.editReply({embeds:[bot.errorLog.serverError(l.stats.errorUserNotFound)]})
|
||||
return
|
||||
}
|
||||
interaction.editReply({embeds:[await bot.statsManager.createUserStatsEmbed(interaction.guild,mention,interaction.channel.id)]})
|
||||
}else{
|
||||
//use author as user
|
||||
if (!bot.statsManager.existStats("user","TICKETS_CREATED",interaction.user.id)){
|
||||
interaction.editReply({embeds:[bot.errorLog.serverError(l.stats.errorUserNotFound)]})
|
||||
return
|
||||
}
|
||||
interaction.editReply({embeds:[await bot.statsManager.createUserStatsEmbed(interaction.guild,interaction.user,interaction.channel.id)]})
|
||||
}
|
||||
|
||||
}else if (mode == "ticket"){
|
||||
//send ticket stats
|
||||
if (!bot.statsManager.existStats("ticket","STATUS",interaction.channel.id)){
|
||||
interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
return
|
||||
}
|
||||
interaction.editReply({embeds:[await bot.statsManager.createTicketStatsEmbed(interaction.guild,interaction.channel.id)]})
|
||||
}
|
||||
|
||||
log("command","someone used the 'stats' command",[{key:"user",value:interaction.user.username},{key:"mode",value:mode}])
|
||||
APIEvents.onCommand("stats",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
}
|
||||
+6
-6
@@ -23,7 +23,7 @@ module.exports = () => {
|
||||
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
if (!permsChecker.global(msg.author.id,msg.guild.id)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
@@ -38,8 +38,8 @@ module.exports = () => {
|
||||
|
||||
msg.channel.send({embeds:[embed],components:componentRows})
|
||||
|
||||
log("command","someone used the 'message' command",[{key:"user",value:msg.author.tag},{key:"id",value:id}])
|
||||
APIEvents.onCommand("message",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
log("command","someone used the 'message' command",[{key:"user",value:msg.author.username},{key:"id",value:id}])
|
||||
APIEvents.onCommand("message",permsChecker.global(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||
}
|
||||
})
|
||||
|
||||
@@ -48,7 +48,7 @@ module.exports = () => {
|
||||
if (interaction.commandName != "message") return
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
if (!permsChecker.global(interaction.user.id,interaction.guild.id)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
return
|
||||
}
|
||||
@@ -62,9 +62,9 @@ module.exports = () => {
|
||||
interaction.reply({content:l.commands.ticketWarning})
|
||||
interaction.channel.send({embeds:[embed],components:componentRows})
|
||||
|
||||
log("command","someone used the 'message' command",[{key:"user",value:interaction.user.tag},{key:"id",value:id}])
|
||||
log("command","someone used the 'message' command",[{key:"user",value:interaction.user.username},{key:"id",value:id}])
|
||||
|
||||
APIEvents.onCommand("message",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
APIEvents.onCommand("message",permsChecker.global(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
|
||||
})
|
||||
}
|
||||
+25
-22
@@ -18,7 +18,12 @@ module.exports = () => {
|
||||
if (!msg.content.startsWith(config.prefix+"unclaim")) return
|
||||
|
||||
if (!msg.guild) return
|
||||
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(msg.author.id,msg.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(msg.author)
|
||||
return
|
||||
}
|
||||
@@ -26,19 +31,16 @@ module.exports = () => {
|
||||
const unclaimuser = storage.get("claimData",msg.channel.id)
|
||||
if (!unclaimuser || unclaimuser == "false") return msg.channel.send({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
|
||||
|
||||
hiddendata.push({key:"claimedby",value:"false"})
|
||||
bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata)
|
||||
storage.set("claimData",msg.channel.id,"false")
|
||||
|
||||
msg.channel.messages.fetchPinned().then(msglist => {
|
||||
/**@type {discord.Message} */
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
|
||||
const hiddendata = hdraw.hiddenData
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
hiddendata.data.push({key:"claimedby",value:"false"})
|
||||
storage.set("claimData",interaction.channel.id,"false")
|
||||
|
||||
const newEmbed = new embed(firstmsg.embeds[0].data)
|
||||
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
if (ticketData && ticketData.autoclose.enable){
|
||||
@@ -56,12 +58,12 @@ module.exports = () => {
|
||||
|
||||
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}])
|
||||
log("command","someone used the 'unclaim' command",[{key:"user",value:msg.author.username}])
|
||||
log("system","user unclaimed from ticket",[{key:"user",value:msg.author.username},{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())
|
||||
APIEvents.onCommand("unclaim",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
|
||||
})
|
||||
})
|
||||
|
||||
@@ -70,7 +72,12 @@ module.exports = () => {
|
||||
if (interaction.commandName != "unclaim") return
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
|
||||
return
|
||||
@@ -81,20 +88,16 @@ module.exports = () => {
|
||||
const unclaimuser = storage.get("claimData",interaction.channel.id)
|
||||
if (!unclaimuser || unclaimuser == "false") return interaction.editReply({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
|
||||
|
||||
hiddendata.push({key:"claimedby",value:"false"})
|
||||
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
|
||||
storage.set("claimData",interaction.channel.id,"false")
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
/**@type {discord.Message} */
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
|
||||
const hiddendata = hdraw.hiddenData
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
hiddendata.data.push({key:"claimedby",value:"false"})
|
||||
storage.set("claimData",interaction.channel.id,"false")
|
||||
|
||||
const newEmbed = new embed(firstmsg.embeds[0].data)
|
||||
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
|
||||
|
||||
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||
if (ticketData && ticketData.autoclose.enable){
|
||||
@@ -112,11 +115,11 @@ module.exports = () => {
|
||||
|
||||
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}])
|
||||
log("command","someone used the 'unclaim' command",[{key:"user",value:interaction.user.username}])
|
||||
log("system","user unclaimed from ticket",[{key:"user",value:interaction.user.username},{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())
|
||||
APIEvents.onCommand("unclaim",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||
})
|
||||
})
|
||||
}
|
||||
+18
-2
@@ -40,8 +40,9 @@
|
||||
|
||||
"color":"gray",
|
||||
"adminroles":["role id"],
|
||||
"readonlyAdminroles":["role id"],
|
||||
"channelprefix":"question-",
|
||||
"category":"category id",
|
||||
"category":"category id (or leave empty)",
|
||||
"message":"You created a ticket!",
|
||||
"enableDmOnOpen":true,
|
||||
"ticketmessage":"The staff will help you soon!\n\n*Click on the button below to close the ticket!*",
|
||||
@@ -63,6 +64,15 @@
|
||||
"autoclose":{
|
||||
"enable":false,
|
||||
"inactiveHours":24
|
||||
},
|
||||
|
||||
"ping":{
|
||||
"@here":true,
|
||||
"@everyone":false,
|
||||
"custom":{
|
||||
"enable":false,
|
||||
"roleId":"012345678910"
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
@@ -101,11 +111,17 @@
|
||||
"dropdown":false,
|
||||
|
||||
"enableFooter":false,
|
||||
"footer":"Open Ticket v3.3.1 - I'm a footer!",
|
||||
"footer":"Open Ticket v3.5.0 - I'm a footer!",
|
||||
|
||||
"enableFooterImage":false,
|
||||
"footerImage":"https://www.example.com/catmemes/cat.png",
|
||||
|
||||
"enableThumbnail":false,
|
||||
"thumbnail":"https://www.example.com/catmemes/cat.png",
|
||||
|
||||
"enableImage":false,
|
||||
"image":"https://www.example.com/catmemes/cat.png",
|
||||
|
||||
"enableCustomColor":false,
|
||||
"color":"#ffffff",
|
||||
|
||||
|
||||
+4
-2
@@ -30,7 +30,8 @@
|
||||
"rename":false,
|
||||
"claim":false,
|
||||
"unclaim":false,
|
||||
"change":false
|
||||
"change":false,
|
||||
"stats":false
|
||||
},
|
||||
"slash":{
|
||||
"help":false,
|
||||
@@ -44,7 +45,8 @@
|
||||
"rename":false,
|
||||
"claim":false,
|
||||
"unclaim":false,
|
||||
"change":false
|
||||
"change":false,
|
||||
"stats":false
|
||||
}
|
||||
},
|
||||
"checkerjs":{
|
||||
|
||||
@@ -229,7 +229,7 @@ exports.onTranscriptCreation = (messages,channel,guild,date) => {
|
||||
|
||||
}
|
||||
|
||||
/**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"|"claim"|"unclaim"|"change"} OTCommandType */
|
||||
/**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"|"claim"|"unclaim"|"change"|"stats"} OTCommandType */
|
||||
|
||||
/**
|
||||
*
|
||||
|
||||
@@ -3,6 +3,9 @@ const bot = require("../../index")
|
||||
const log = bot.errorLog.log
|
||||
|
||||
module.exports = () => {
|
||||
const args = process.argv
|
||||
const debugMode = args.includes("--debug")
|
||||
|
||||
const files = fs.readdirSync("./plugins")
|
||||
const api = require("./api.json")
|
||||
var totalcount = 0
|
||||
@@ -11,27 +14,30 @@ module.exports = () => {
|
||||
files.forEach((file) => {
|
||||
if (file.endsWith(".plugin.js")){
|
||||
try {
|
||||
require("../../plugins/"+file)()
|
||||
require("../../plugins/" + file)()
|
||||
|
||||
successcount++
|
||||
totalcount++
|
||||
}catch(err){
|
||||
/**@type {Error} */
|
||||
const theError = err
|
||||
if (api.enableAPIdebug){
|
||||
if (api.enableAPIdebug || debugMode) {
|
||||
console.error(theError)
|
||||
}
|
||||
|
||||
try {
|
||||
const data = fs.readFileSync("./apiDebug.txt")
|
||||
const data = fs.readFileSync("./openticketdebug.txt")
|
||||
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")
|
||||
}
|
||||
fs.writeFileSync("./openticketdebug.txt", newData + "\nPLUGIN "+file+" ERROR: " + theError.name + ": " + theError.message + "\n" + theError.stack + "\n\n")
|
||||
} catch {
|
||||
fs.writeFileSync("./openticketdebug.txt", "\nPLUGIN "+file+" ERROR: " + theError.name + ": " + theError.message + "\n" + theError.stack + "\n\n")
|
||||
}
|
||||
|
||||
failcount++
|
||||
totalcount++
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
require("../startscreen").headerDataPlugins({total:totalcount,success:successcount,error:failcount})
|
||||
require("../startscreen").headerDataPlugins({ total: totalcount, success: successcount, error: failcount })
|
||||
}
|
||||
+3
-3
@@ -179,7 +179,7 @@ exports.checker = async () => {
|
||||
checkType(option.description,"string",path+"/description")
|
||||
|
||||
//icon
|
||||
const emojiRegex = /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/gi;
|
||||
const emojiRegex = /(?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])|(?:<a?:[^:]*:[0-9]+>)/gi
|
||||
if (option.icon.length > 0){
|
||||
|
||||
const isEmoji = emojiRegex.test(option.icon)
|
||||
@@ -427,14 +427,14 @@ exports.checker = async () => {
|
||||
checkType(config.languageFile,"string","languagefile")
|
||||
const lf = config.languageFile
|
||||
|
||||
if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish") && !lf.startsWith("slovenian")){
|
||||
if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish") && !lf.startsWith("slovenian") && !lf.startsWith("thai") && !lf.startsWith("norwegian") && !lf.startsWith("greek") && !lf.startsWith("ukrainian") && !lf.startsWith("hungarian") && !lf.startsWith("indonesian")){
|
||||
createError("'languagefile' | invalid language, more info in the wiki")
|
||||
}
|
||||
|
||||
//status:
|
||||
checkType(config.status.enabled,"boolean","status/enabled")
|
||||
if (config.status.enabled){
|
||||
if (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING"){
|
||||
if (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING" && config.status.type != "CUSTOM"){
|
||||
createError("'status/type' | not a valid status type! (LISTENING,WATCHING,PLAYING)")
|
||||
}
|
||||
if (config.status.text.length < 1){
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
const fs = require("fs")
|
||||
const location = "./storage/stats.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"))
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {String} category
|
||||
* @param {String} key
|
||||
* @param {String|Boolean|Number} value
|
||||
* @returns {Boolean} exists?
|
||||
*/
|
||||
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|Boolean|Number|undefined}
|
||||
*/
|
||||
exports.get = (category,key) => {
|
||||
const currentData = getData()
|
||||
const result = currentData.find((d) => (d.category == category) && (d.key == key))
|
||||
return (result) ? result.value : undefined
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {String} category
|
||||
* @returns {[{key:String,value:String|Boolean|Number}]|false}
|
||||
*/
|
||||
exports.getCategory = (category) => {
|
||||
const currentData = getData()
|
||||
const result = currentData.filter((v) => v.category == category)
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {String} category
|
||||
* @param {String} key
|
||||
* @returns {Boolean} exists?
|
||||
*/
|
||||
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
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
const localstorage = require("node-localstorage")
|
||||
|
||||
const ls = new localstorage.LocalStorage("./storage/dynamicDB")
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} category
|
||||
* @param {String} id
|
||||
* @param {String} value
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
exports.set = (category,id,value) => {
|
||||
ls.setItem(category+"--"+id,value.toString())
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} category
|
||||
* @param {String} id
|
||||
* @returns {String|false}
|
||||
*/
|
||||
exports.get = (category,id) => {
|
||||
const result = ls.getItem(category+"--"+id)
|
||||
if (!result) return false
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} category
|
||||
* @param {String} id
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
exports.delete = (category,id) => {
|
||||
ls.removeItem(category+"--"+id)
|
||||
return true
|
||||
}
|
||||
|
||||
this.set("category","key","value")
|
||||
this.get("category","key",)
|
||||
this.delete("category","key")
|
||||
@@ -9,11 +9,15 @@ ALL DATABASE FILES NEED TO EXPORT THE FOLLOWING FUNCTIONS:
|
||||
*/
|
||||
|
||||
try {
|
||||
var db = require("./dynamicfiles/database")
|
||||
var main = require("./databases/main")
|
||||
var stats = require("./databases/stats")
|
||||
}catch(err){
|
||||
console.log(err)
|
||||
console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)")
|
||||
console.log("Unable to find the database handlers!")
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
module.exports = db
|
||||
module.exports = {
|
||||
main,
|
||||
stats
|
||||
}
|
||||
+15
-10
@@ -14,25 +14,25 @@ const c = discord.Colors
|
||||
exports.noPermsMessage = (user) => {
|
||||
return new embed()
|
||||
.setColor(c.Red)
|
||||
.setTitle(":x: "+l.errors.noPermsTitle)
|
||||
.setTitle("❌ "+l.errors.noPermsTitle)
|
||||
.setDescription(l.errors.noPermsDescription)
|
||||
.setFooter({iconURL:user.displayAvatarURL(),text:user.tag})
|
||||
.setFooter({iconURL:user.displayAvatarURL(),text:user.username})
|
||||
}
|
||||
|
||||
/**@param {discord.User} user*/
|
||||
exports.noPermsDelete = (user) => {
|
||||
return new embed()
|
||||
.setColor(c.Red)
|
||||
.setTitle(":x: "+l.errors.noPermsTitle)
|
||||
.setTitle("❌ "+l.errors.noPermsTitle)
|
||||
.setDescription(l.errors.noPermsDelete)
|
||||
.setFooter({iconURL:user.displayAvatarURL(),text:user.tag})
|
||||
.setFooter({iconURL:user.displayAvatarURL(),text:user.username})
|
||||
}
|
||||
|
||||
/**@param {String} message */
|
||||
exports.invalidArgsMessage = (message) => {
|
||||
var x = new embed()
|
||||
.setColor(c.Red)
|
||||
.setTitle(":x: "+l.errors.missingArgsTitle)
|
||||
.setTitle("❌ "+l.errors.missingArgsTitle)
|
||||
.setDescription(message)
|
||||
|
||||
return x
|
||||
@@ -42,7 +42,7 @@ exports.invalidArgsMessage = (message) => {
|
||||
exports.serverError = (message) => {
|
||||
var x = new embed()
|
||||
.setColor(c.Orange)
|
||||
.setTitle(":warning: "+l.errors.boterror)
|
||||
.setTitle("⚠️ "+l.errors.boterror)
|
||||
.setDescription(message)
|
||||
|
||||
return x
|
||||
@@ -53,14 +53,19 @@ exports.invalidIdChooseFromList = (list,message) => {
|
||||
const beforemsg = message ? message+"\n\n" : ""
|
||||
var x = new embed()
|
||||
.setColor(c.Red)
|
||||
.setTitle(":x: "+l.errors.chooseFromListTitle)
|
||||
.setTitle("❌ "+l.errors.chooseFromListTitle)
|
||||
.setDescription(beforemsg+l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
|
||||
return x
|
||||
}
|
||||
|
||||
exports.failedRenameChannel = new embed()
|
||||
.setColor(c.Red)
|
||||
.setTitle("❌ Failed to rename channel")
|
||||
.setDescription("Discord channels can only be renamed twice every 10 minutes! Open Ticket can't do anything about this error!")
|
||||
|
||||
exports.notInATicket = new embed()
|
||||
.setColor(c.Red)
|
||||
.setTitle(":x: "+l.errors.notInTicketTitle)
|
||||
.setTitle("❌ "+l.errors.notInTicketTitle)
|
||||
.setDescription(l.errors.notInTicketDescription)
|
||||
|
||||
|
||||
@@ -68,7 +73,7 @@ exports.notInATicket = new embed()
|
||||
exports.success = (title,message) => {
|
||||
var x = new embed()
|
||||
.setColor(config.color)
|
||||
.setTitle(":white_check_mark: "+title)
|
||||
.setTitle("✅ "+title)
|
||||
.setDescription(message)
|
||||
|
||||
return x
|
||||
@@ -78,7 +83,7 @@ exports.success = (title,message) => {
|
||||
exports.warning = (title,message) => {
|
||||
var x = new embed()
|
||||
.setColor(c.Orange)
|
||||
.setTitle(":warning: "+title)
|
||||
.setTitle("⚠️ "+title)
|
||||
.setDescription(message)
|
||||
|
||||
return x
|
||||
|
||||
@@ -19,7 +19,7 @@ exports.addEmbed = (addedUser,adder) => {
|
||||
return new embed()
|
||||
.setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username))
|
||||
.setColor(mc)
|
||||
.setFooter({text:adder.tag,iconURL:adder.displayAvatarURL()})
|
||||
.setFooter({text:adder.username,iconURL:adder.displayAvatarURL()})
|
||||
.setThumbnail(addedUser.displayAvatarURL({extension:"png"}))
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ exports.removeEmbed = (removedUser,remover) => {
|
||||
return new embed()
|
||||
.setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username))
|
||||
.setColor(mc)
|
||||
.setFooter({text:remover.tag,iconURL:remover.displayAvatarURL()})
|
||||
.setFooter({text:remover.username,iconURL:remover.displayAvatarURL()})
|
||||
.setThumbnail(removedUser.displayAvatarURL({extension:"png"}))
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ exports.closeEmbed = (closer,description) => {
|
||||
const embd = new embed()
|
||||
.setTitle("🔒 "+l.commands.closeTitle)
|
||||
.setColor(mc)
|
||||
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
|
||||
.setFooter({text:closer.username,iconURL:closer.displayAvatarURL()})
|
||||
|
||||
if (description) embd.setDescription(description)
|
||||
return embd
|
||||
@@ -63,7 +63,7 @@ exports.autocloseSignalEmbed = (closer,time) => {
|
||||
const embd = new embed()
|
||||
.setTitle("⏰ This ticket got closed by Autoclose!")
|
||||
.setColor(mc)
|
||||
.setFooter({text:closer.tag,iconURL:closer.displayAvatarURL()})
|
||||
.setFooter({text:closer.username,iconURL:closer.displayAvatarURL()})
|
||||
.setDescription("This ticket has been inactive for `"+time+"h`!")
|
||||
return embd
|
||||
}
|
||||
@@ -77,7 +77,7 @@ exports.deleteEmbed = (deleter) => {
|
||||
return new embed()
|
||||
.setTitle("❌ "+l.commands.deleteTitle)
|
||||
.setColor(mc)
|
||||
.setFooter({text:deleter.tag,iconURL:deleter.displayAvatarURL()})
|
||||
.setFooter({text:deleter.username,iconURL:deleter.displayAvatarURL()})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -90,7 +90,7 @@ exports.renameEmbed = (renamer,newname) => {
|
||||
return new embed()
|
||||
.setTitle("🔄 "+l.commands.renameTitle.replace("{0}",newname))
|
||||
.setColor(mc)
|
||||
.setFooter({text:renamer.tag,iconURL:renamer.displayAvatarURL()})
|
||||
.setFooter({text:renamer.username,iconURL:renamer.displayAvatarURL()})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -102,7 +102,7 @@ exports.renameEmbed = (renamer,newname) => {
|
||||
return new embed()
|
||||
.setTitle("🔓 "+l.commands.reopenTitle)
|
||||
.setColor(mc)
|
||||
.setFooter({text:reopener.tag,iconURL:reopener.displayAvatarURL()})
|
||||
.setFooter({text:reopener.username,iconURL:reopener.displayAvatarURL()})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -115,7 +115,7 @@ exports.renameEmbed = (renamer,newname) => {
|
||||
return new embed()
|
||||
.setTitle("📌 "+l.commands.claimTitle.replace("{0}",claimer.username))
|
||||
.setColor(mc)
|
||||
.setFooter({text:user.tag,iconURL:user.displayAvatarURL()})
|
||||
.setFooter({text:user.username,iconURL:user.displayAvatarURL()})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -127,7 +127,7 @@ exports.renameEmbed = (renamer,newname) => {
|
||||
return new embed()
|
||||
.setTitle("🆓 "+l.commands.unclaimTitle)
|
||||
.setColor(mc)
|
||||
.setFooter({text:unclaimer.tag,iconURL:unclaimer.displayAvatarURL()})
|
||||
.setFooter({text:unclaimer.username,iconURL:unclaimer.displayAvatarURL()})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -140,5 +140,5 @@ exports.changeEmbed = (changer,newtype) => {
|
||||
return new embed()
|
||||
.setTitle("🔄 "+l.commands.changeTitle.replace("{0}",newtype))
|
||||
.setColor(mc)
|
||||
.setFooter({text:changer.tag,iconURL:changer.displayAvatarURL()})
|
||||
.setFooter({text:changer.username,iconURL:changer.displayAvatarURL()})
|
||||
}
|
||||
@@ -7,7 +7,6 @@ const log = bot.errorLog.log
|
||||
|
||||
const permissionChecker = require("../../../utils/permisssionChecker")
|
||||
const storage = bot.storage
|
||||
const hiddendata = bot.hiddenData
|
||||
const embed = discord.EmbedBuilder
|
||||
const mc = config.color
|
||||
const permsChecker = require("../../../utils/permisssionChecker")
|
||||
@@ -27,31 +26,35 @@ module.exports = () => {
|
||||
}catch{}
|
||||
|
||||
if (!interaction.guild) return
|
||||
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(interaction.user)
|
||||
return
|
||||
}
|
||||
|
||||
hiddendata.push({key:"claimedby",value:interaction.user.id})
|
||||
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
|
||||
storage.set("claimData",interaction.channel.id,interaction.user.id)
|
||||
|
||||
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||
/**@type {discord.Message} */
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||
const hdraw = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
|
||||
const hiddendata = hdraw.hiddenData
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
|
||||
hiddendata.data.push({key:"claimedby",value:interaction.user.id})
|
||||
storage.set("claimData",interaction.channel.id,interaction.user.id)
|
||||
|
||||
const newEmbed = new embed(firstmsg.embeds[0].data)
|
||||
.setFooter({text:"claimed by: "+interaction.user.tag,iconURL:interaction.user.displayAvatarURL()})
|
||||
.setDescription(hdraw.description+bot.hiddenData.writeHiddenData(hiddendata.type,hiddendata.data))
|
||||
.setFooter({text:"claimed by: "+interaction.user.username,iconURL:interaction.user.displayAvatarURL()})
|
||||
|
||||
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
|
||||
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
|
||||
}else{
|
||||
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
|
||||
}
|
||||
|
||||
interaction.channel.send({embeds:[bot.embeds.commands.claimEmbed(interaction.user,interaction.user)]})
|
||||
})
|
||||
})
|
||||
}
|
||||
@@ -23,7 +23,7 @@ module.exports = () => {
|
||||
if (interaction.customId != "OTcloseTicketTrue") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
|
||||
if (closeTicketButtonChecker == true) return
|
||||
@@ -31,8 +31,12 @@ module.exports = () => {
|
||||
|
||||
const firstcomponents = interaction.message.components
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (config.system.closeMode == "adminonly"){
|
||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
if (!permissionChecker.sendUserNoPerms(interaction.user)){
|
||||
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
|
||||
}
|
||||
|
||||
@@ -56,8 +56,12 @@ module.exports = () => {
|
||||
|
||||
const firstcomponents = interaction.message.components
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (config.system.closeMode == "adminonly"){
|
||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
if (!permissionChecker.sendUserNoPerms(interaction.user)){
|
||||
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
|
||||
}
|
||||
|
||||
@@ -22,14 +22,18 @@ module.exports = () => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTdeleteTicketTrue") return
|
||||
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
|
||||
if (deleteTicketButtonChecker == true) return
|
||||
deleteTicketButtonChecker = true
|
||||
|
||||
const firstcomponents = bot.buttons.close.openRowNormal
|
||||
|
||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
||||
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
|
||||
}
|
||||
@@ -62,14 +66,18 @@ module.exports = () => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTdeleteTicketTrue1") return
|
||||
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
|
||||
if (deleteTicketButtonChecker1 == true) return
|
||||
deleteTicketButtonChecker1 = true
|
||||
|
||||
const firstcomponents = bot.buttons.close.closeCommandRow
|
||||
|
||||
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||
if (hiddendata.length < 1) return interaction.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
|
||||
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
|
||||
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
||||
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
|
||||
}
|
||||
|
||||
@@ -17,11 +17,11 @@ const bs = discord.ButtonStyle
|
||||
|
||||
module.exports = () => {
|
||||
//REOPEN
|
||||
client.on("interactionCreate",(interaction) => {
|
||||
client.on("interactionCreate",async (interaction) => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTreopenTicket") return
|
||||
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
interaction.message.edit({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
|
||||
require("../../../ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
||||
})
|
||||
|
||||
@@ -16,22 +16,22 @@ const bs = discord.ButtonStyle
|
||||
|
||||
module.exports = () => {
|
||||
//CLOSE
|
||||
client.on("interactionCreate",interaction => {
|
||||
client.on("interactionCreate",async interaction => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTcloseTicket") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]})
|
||||
|
||||
})
|
||||
client.on("interactionCreate",interaction => {
|
||||
client.on("interactionCreate",async interaction => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTcloseTicketFalse") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
|
||||
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
|
||||
@@ -47,22 +47,22 @@ module.exports = () => {
|
||||
})
|
||||
|
||||
//DELETE
|
||||
client.on("interactionCreate",interaction => {
|
||||
client.on("interactionCreate",async interaction => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTdeleteTicket") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]})
|
||||
|
||||
})
|
||||
client.on("interactionCreate",interaction => {
|
||||
client.on("interactionCreate",async interaction => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTdeleteTicketFalse") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
|
||||
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
|
||||
@@ -78,22 +78,22 @@ module.exports = () => {
|
||||
})
|
||||
|
||||
//DELETE NO TRANSCRIPT
|
||||
client.on("interactionCreate",interaction => {
|
||||
client.on("interactionCreate",async interaction => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTdeleteTicket1") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]})
|
||||
|
||||
})
|
||||
client.on("interactionCreate",interaction => {
|
||||
client.on("interactionCreate",async interaction => {
|
||||
if (!interaction.isButton()) return
|
||||
if (interaction.customId != "OTdeleteTicketFalse1") return
|
||||
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
interaction.message.edit({components:[bot.buttons.close.closeCommandRow]})
|
||||
})
|
||||
|
||||
@@ -11,7 +11,7 @@ const APIEvents = require("./api/modules/events")
|
||||
module.exports = async () => {
|
||||
const chalk = await (await import("chalk")).default
|
||||
|
||||
client.on("interactionCreate",(interaction) => {
|
||||
client.on("interactionCreate",async (interaction) => {
|
||||
if (!interaction.isButton() && !interaction.isStringSelectMenu()) return
|
||||
if (interaction.isButton() && !interaction.customId.startsWith("newR")) return
|
||||
if (interaction.isStringSelectMenu() && !(interaction.customId == "OTdropdownMenu")) return
|
||||
@@ -32,7 +32,7 @@ module.exports = async () => {
|
||||
return
|
||||
}else{
|
||||
try {
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
} catch{}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ module.exports = async () => {
|
||||
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}])
|
||||
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.username},{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())
|
||||
})
|
||||
@@ -68,7 +68,7 @@ module.exports = async () => {
|
||||
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}])
|
||||
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.username},{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())
|
||||
})
|
||||
@@ -84,13 +84,13 @@ module.exports = async () => {
|
||||
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)
|
||||
|
||||
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.username},{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.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.username},{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())
|
||||
}
|
||||
|
||||
@@ -33,9 +33,9 @@ module.exports = async (invisible) => {
|
||||
//process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)")
|
||||
if (!invisible){
|
||||
setInterval(() => {
|
||||
process.stdout.cursorTo(0)
|
||||
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 13")+" commands ready! (this can take up to 40 seconds)")
|
||||
if (readystats >= 13){
|
||||
if (process.stdout && process.stdout.cursorTo) process.stdout.cursorTo(0)
|
||||
process.stdout.write("[status] there are "+chalk.blue(readystats+" out of 14")+" commands ready! (this can take up to 40 seconds)")
|
||||
if (readystats >= 14){
|
||||
console.log(chalk.green("\nready!"))
|
||||
console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!"))
|
||||
process.exit(1)
|
||||
@@ -268,4 +268,38 @@ module.exports = async (invisible) => {
|
||||
readystats++
|
||||
})
|
||||
|
||||
//stats
|
||||
client.application.commands.create({
|
||||
name:"stats",
|
||||
description:"See bot statistics!",
|
||||
defaultPermission:true,
|
||||
type:act.ChatInput,
|
||||
options:[
|
||||
{
|
||||
type:acot.Subcommand,
|
||||
name:"global",
|
||||
description:"See the global bot stats!"
|
||||
},
|
||||
{
|
||||
type:acot.Subcommand,
|
||||
name:"ticket",
|
||||
description:"See the stats of a ticket (use inside of ticket)!"
|
||||
},
|
||||
{
|
||||
type:acot.Subcommand,
|
||||
name:"user",
|
||||
description:"See the stats from a user or yourself!",
|
||||
options:[
|
||||
{
|
||||
type:acot.User,
|
||||
name:"user",
|
||||
required:false,
|
||||
description:"See the stats from a specific user!"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},sid).then(() => {
|
||||
readystats++
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,383 @@
|
||||
const { EmbedBuilder, Guild, TextChannel, Message, User } = 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 permissionChecker = require("./utils/permisssionChecker")
|
||||
|
||||
/**@typedef {"TICKETS_CREATED"|"TICKETS_CLOSED"|"TICKETS_DELETED"|"TICKETS_REOPENED"|"TICKETS_AUTOCLOSED"|"TRANSCRIPTS_CREATED"|"TIME_SINCE_UPDATE"|"LAST_VERSION"} OTGlobalStatsType */
|
||||
/**@typedef {"CREATED_AT"|"CREATED_BY"|"STATUS"} OTTicketStatsType */
|
||||
/**@typedef {"TICKETS_CREATED"|"TICKETS_CLOSED"|"TICKETS_DELETED"|"TICKETS_REOPENED"} OTUserStatsType */
|
||||
/**
|
||||
* @callback OTStatsCallback
|
||||
* @param {Boolean|Number|String|undefined} current
|
||||
* @returns {Boolean|Number|String|undefined}
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @param {OTGlobalStatsType} type
|
||||
* @param {OTStatsCallback} callback
|
||||
*/
|
||||
const updateGlobalStats = (type,callback) => {
|
||||
const currentstat = bot.statsStorage.get("global",type)
|
||||
const newstat = callback(currentstat)
|
||||
if (["string","number","boolean"].includes(typeof newstat)){
|
||||
bot.statsStorage.set("global",type,newstat)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {OTTicketStatsType} type
|
||||
* @param {String} id
|
||||
* @param {OTStatsCallback} callback
|
||||
*/
|
||||
const updateTicketStats = (type,id,callback) => {
|
||||
const currentstat = bot.statsStorage.get("ticket"+id,type)
|
||||
const newstat = callback(currentstat)
|
||||
if (["string","number","boolean"].includes(typeof newstat)){
|
||||
bot.statsStorage.set("ticket"+id,type,newstat)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {OTUserStatsType} type
|
||||
* @param {String} id
|
||||
* @param {OTStatsCallback} callback
|
||||
*/
|
||||
const updateUserStats = (type,id,callback) => {
|
||||
const currentstat = bot.statsStorage.get("user"+id,type)
|
||||
const newstat = callback(currentstat)
|
||||
if (["string","number","boolean"].includes(typeof newstat)){
|
||||
bot.statsStorage.set("user"+id,type,newstat)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {"global"|"ticket"|"user"} scope
|
||||
* @param {OTGlobalStatsType|OTTicketStatsType|OTUserStatsType} type
|
||||
* @param {String} [id]
|
||||
*/
|
||||
const removeStats = (scope,type,id) => {
|
||||
const newScope = (scope == "global") ? scope : scope+id
|
||||
bot.statsStorage.delete(newScope,type)
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {"global"|"ticket"|"user"} scope
|
||||
* @param {OTGlobalStatsType|OTTicketStatsType|OTUserStatsType} type
|
||||
* @param {String} [id]
|
||||
*/
|
||||
const existStats = (scope,type,id) => {
|
||||
const newScope = (scope == "global") ? scope : scope+id
|
||||
return (typeof bot.statsStorage.get(newScope,type) == "undefined") ? false : true
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {"global"|"ticket"|"user"} scope
|
||||
* @param {OTGlobalStatsType|OTTicketStatsType|OTUserStatsType} type
|
||||
* @param {String} [id]
|
||||
*/
|
||||
const getStats = (scope,type,id) => {
|
||||
const newScope = (scope == "global") ? scope : scope+id
|
||||
return bot.statsStorage.get(newScope,type)
|
||||
}
|
||||
|
||||
const startupStatsManager = () => {
|
||||
//UPDATE LAST UPDATE DATE
|
||||
if (!existStats("global","TIME_SINCE_UPDATE")){
|
||||
updateGlobalStats("TIME_SINCE_UPDATE",(current) => {
|
||||
return new Date().getTime()
|
||||
})
|
||||
updateGlobalStats("LAST_VERSION",(current) => {
|
||||
return (require("../package.json")).version
|
||||
})
|
||||
}
|
||||
if ((require("../package.json")).version != getStats("global","LAST_VERSION")){
|
||||
updateGlobalStats("TIME_SINCE_UPDATE",(current) => {
|
||||
return new Date().getTime()
|
||||
})
|
||||
updateGlobalStats("LAST_VERSION",(current) => {
|
||||
return (require("../package.json")).version
|
||||
})
|
||||
}
|
||||
|
||||
//UPDATE THE OTHER STATS
|
||||
if (!existStats("global","TICKETS_CREATED")){
|
||||
updateGlobalStats("TICKETS_CREATED",(current) => {
|
||||
return 0
|
||||
})
|
||||
}
|
||||
if (!existStats("global","TICKETS_CLOSED")){
|
||||
updateGlobalStats("TICKETS_CLOSED",(current) => {
|
||||
return 0
|
||||
})
|
||||
}
|
||||
if (!existStats("global","TICKETS_DELETED")){
|
||||
updateGlobalStats("TICKETS_DELETED",(current) => {
|
||||
return 0
|
||||
})
|
||||
}
|
||||
if (!existStats("global","TICKETS_AUTOCLOSED")){
|
||||
updateGlobalStats("TICKETS_AUTOCLOSED",(current) => {
|
||||
return 0
|
||||
})
|
||||
}
|
||||
if (!existStats("global","TICKETS_REOPENED")){
|
||||
updateGlobalStats("TICKETS_REOPENED",(current) => {
|
||||
return 0
|
||||
})
|
||||
}if (!existStats("global","TRANSCRIPTS_CREATED")){
|
||||
updateGlobalStats("TRANSCRIPTS_CREATED",(current) => {
|
||||
return 0
|
||||
})
|
||||
}
|
||||
|
||||
//HANDLE MEMBER LEAVE (clear the database)
|
||||
client.on("guildMemberRemove",(member) => {
|
||||
if (existStats("user","TICKETS_CREATED",member.id)){
|
||||
removeStats("user","TICKETS_CREATED",member.id)
|
||||
}
|
||||
if (existStats("user","TICKETS_CLOSED",member.id)){
|
||||
removeStats("user","TICKETS_CLOSED",member.id)
|
||||
}
|
||||
if (existStats("user","TICKETS_DELETED",member.id)){
|
||||
removeStats("user","TICKETS_DELETED",member.id)
|
||||
}
|
||||
if (existStats("user","TICKETS_REOPENED",member.id)){
|
||||
removeStats("user","TICKETS_REOPENED",member.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<{startDate:Number, updateDate:Number, version:String, ticketsCreated:Number, ticketsClosed:Number, ticketsDeleted:Number, ticketsReopened:Number, ticketsAutoclosed:Number, transcriptsCreated:Number}>}
|
||||
*/
|
||||
const getGlobalStats = async () => {
|
||||
//live data
|
||||
const startDate = new Date().getTime() - client.uptime
|
||||
const version = (require("../package.json")).version
|
||||
|
||||
//saved data
|
||||
const ticketsCreated = getStats("global","TICKETS_CREATED")
|
||||
const ticketsClosed = getStats("global","TICKETS_CLOSED")
|
||||
const ticketsDeleted = getStats("global","TICKETS_DELETED")
|
||||
const ticketsReopened = getStats("global","TICKETS_REOPENED")
|
||||
const ticketsAutoclosed = getStats("global","TICKETS_AUTOCLOSED")
|
||||
const transcriptsCreated = getStats("global","TRANSCRIPTS_CREATED")
|
||||
const timeSinceUpdate = getStats("global","TIME_SINCE_UPDATE")
|
||||
|
||||
return {
|
||||
startDate,
|
||||
updateDate: (typeof timeSinceUpdate == "undefined") ? new Date().getTime() : timeSinceUpdate,
|
||||
version,
|
||||
|
||||
ticketsCreated: (typeof ticketsCreated == "undefined") ? 0 : ticketsCreated,
|
||||
ticketsClosed: (typeof ticketsClosed == "undefined") ? 0 : ticketsClosed,
|
||||
ticketsDeleted: (typeof ticketsDeleted == "undefined") ? 0 : ticketsDeleted,
|
||||
ticketsReopened: (typeof ticketsReopened == "undefined") ? 0 : ticketsReopened,
|
||||
ticketsAutoclosed: (typeof ticketsAutoclosed == "undefined") ? 0 : ticketsAutoclosed,
|
||||
transcriptsCreated: (typeof transcriptsCreated == "undefined") ? 0 : transcriptsCreated,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {discord.TextChannel} channel
|
||||
* @param {Number} limit
|
||||
* @returns {Promise<Message[]>}
|
||||
*/
|
||||
const getmessages = async (channel,limit) => {
|
||||
const final = []
|
||||
var lastId = ""
|
||||
|
||||
while (true) {
|
||||
const options = {limit:100}
|
||||
if (lastId) options.before = lastId
|
||||
|
||||
const messages = await channel.messages.fetch(options)
|
||||
messages.forEach(msg => {final.push(msg)})
|
||||
lastId = messages.last().id
|
||||
|
||||
if (messages.size != 100 || final >= limit) {
|
||||
break
|
||||
}
|
||||
}
|
||||
return final
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Guild} guild
|
||||
* @param {String} channelid
|
||||
* @returns {Promise<{createdAt:Number, createdBy:String, messageAmount:Number, participants:String[], ticketName:String, status:"open"|"closed"|"reopened"|"autoclosed"}>}
|
||||
*/
|
||||
const getTicketStats = async (guild,channelid) => {
|
||||
//live data
|
||||
/**@type {TextChannel|undefined} */
|
||||
const channel = guild.channels.cache.find((c) => c.id == channelid)
|
||||
const messageAmount = (channel) ? (await getmessages(channel,5000)).length : 0
|
||||
const participants = (channel) ? channel.members.map((m) => m.user.username) : []
|
||||
|
||||
//saved data
|
||||
const createdAt = getStats("ticket","CREATED_AT",channelid)
|
||||
const status = getStats("ticket","STATUS",channelid)
|
||||
|
||||
const TEMPcreatedBy = getStats("ticket","CREATED_BY",channelid)
|
||||
const TEMPcreatedByUser = (TEMPcreatedBy) ? guild.members.cache.find((m) => m.id == TEMPcreatedBy) : undefined
|
||||
const createdBy = (TEMPcreatedByUser) ? TEMPcreatedByUser.user.username : "an unknown person 😄"
|
||||
|
||||
return {
|
||||
createdAt: (typeof createdAt == "undefined") ? new Date().getTime() : createdAt,
|
||||
createdBy: (typeof createdBy == "undefined") ? 0 : createdBy,
|
||||
messageAmount,
|
||||
participants:participants.slice(0,50),
|
||||
ticketName:channel.name,
|
||||
status: (typeof status == "undefined") ? "open" : status
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Guild} guild
|
||||
* @param {User} user
|
||||
* @param {String} [channelid]
|
||||
* @returns {Promise<{ticketsCreated:Number, ticketsClosed:Number, ticketsDeleted:Number, ticketsReopened:Number, role:"globaladmin"|"ticketadmin"|"member", userName:String}>}
|
||||
*/
|
||||
const getUserStats = async (guild,user,channelid) => {
|
||||
//live data
|
||||
const hiddendata = bot.hiddenData.readHiddenData(channelid)
|
||||
const ticketId = (hiddendata.length < 1) ? false : hiddendata.find(d => d.key == "type").value
|
||||
|
||||
const isGlobalAdmin = permissionChecker.global(user.id,guild.id)
|
||||
const isTicketAdmin = (ticketId) ? permissionChecker.ticket(user.id,guild.id,ticketId) : false
|
||||
const role = (isGlobalAdmin) ? "globaladmin" : ((isTicketAdmin) ? "ticketadmin" : "member")
|
||||
|
||||
//saved data
|
||||
const ticketsCreated = getStats("user","TICKETS_CREATED",user.id)
|
||||
const ticketsClosed = getStats("user","TICKETS_CLOSED",user.id)
|
||||
const ticketsDeleted = getStats("user","TICKETS_DELETED",user.id)
|
||||
const ticketsReopened = getStats("user","TICKETS_REOPENED",user.id)
|
||||
|
||||
return {
|
||||
ticketsCreated: (typeof ticketsCreated == "undefined") ? 0 : ticketsCreated,
|
||||
ticketsClosed: (typeof ticketsClosed == "undefined") ? 0 : ticketsClosed,
|
||||
ticketsDeleted: (typeof ticketsDeleted == "undefined") ? 0 : ticketsDeleted,
|
||||
ticketsReopened: (typeof ticketsReopened == "undefined") ? 0 : ticketsReopened,
|
||||
role,
|
||||
userName:user.username
|
||||
}
|
||||
}
|
||||
|
||||
const createGlobalStatsEmbed = async () => {
|
||||
const stats = await getGlobalStats()
|
||||
|
||||
const sentences = [
|
||||
`${l.stats.ticketsCreated}: \`${stats.ticketsCreated}\``,
|
||||
`${l.stats.ticketsClosed}: \`${stats.ticketsClosed}\``,
|
||||
`${l.stats.ticketsDeleted}: \`${stats.ticketsDeleted}\``,
|
||||
`${l.stats.ticketsReopened}: \`${stats.ticketsReopened}\``,
|
||||
`${l.stats.ticketsAutoclosed}: \`${stats.ticketsAutoclosed}\``,
|
||||
|
||||
`${l.stats.startupDate}: <t:${Math.round(stats.startDate/1000)}:f>`,
|
||||
`${l.stats.latestUpdate}: <t:${Math.round(stats.updateDate/1000)}:D>`
|
||||
]
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(config.color)
|
||||
.setTitle(`📊 ${l.stats.globalTitle}!`)
|
||||
.setDescription(sentences.slice(0,5).join("\n"))
|
||||
.addFields({
|
||||
name:`${l.stats.systemTitle}:`,
|
||||
value:sentences.slice(5,7).join("\n")
|
||||
})
|
||||
.setFooter({text:`${l.stats.versionTitle}: v${stats.version}`})
|
||||
return embed
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Guild} guild
|
||||
* @param {String} channelid
|
||||
*/
|
||||
const createTicketStatsEmbed = async (guild,channelid) => {
|
||||
const stats = await getTicketStats(guild,channelid)
|
||||
|
||||
if (stats.status == "open"){
|
||||
var newStatus = `🟢 \`${l.stats.switches.open}\``
|
||||
}else if (stats.status == "reopened"){
|
||||
var newStatus = `🟢 \`${l.stats.switches.reopened}\``
|
||||
}else if (stats.status == "closed"){
|
||||
var newStatus = `🔴 \`${l.stats.switches.closed}\``
|
||||
}else if (stats.status == "autoclosed"){
|
||||
var newStatus = `🔴 \`${l.stats.switches.autoclosed}\``
|
||||
}
|
||||
|
||||
const sentences = [
|
||||
`${l.stats.ticketCreatedOn}: <t:${Math.round(stats.createdAt/1000)}:f>`,
|
||||
`${l.stats.ticketCreatedBy}: \`${stats.createdBy}\``,
|
||||
`${l.stats.messagesSent}: \`${stats.messageAmount}\``,
|
||||
`${l.stats.status}: ${newStatus}`
|
||||
]
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(config.color)
|
||||
.setTitle(`📊 ${l.stats.ticketTitle}`.replace("{0}",`#${stats.ticketName}!`))
|
||||
.setDescription(sentences.join("\n"))
|
||||
.addFields({
|
||||
name:`${l.stats.participants}:`,
|
||||
value:stats.participants.join("\n")
|
||||
})
|
||||
return embed
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Guild} guild
|
||||
* @param {User} user
|
||||
* @param {String} channelid
|
||||
*/
|
||||
const createUserStatsEmbed = async (guild,user,channelid) => {
|
||||
const stats = await getUserStats(guild,user,channelid)
|
||||
|
||||
if (stats.role == "globaladmin"){
|
||||
var newRole = `🟢 \`${l.stats.switches.globalAdmin}\``
|
||||
}else if (stats.role == "ticketadmin"){
|
||||
var newRole = `🟡 \`${l.stats.switches.ticketAdmin}\``
|
||||
}else if (stats.role == "member"){
|
||||
var newRole = `🔴 \`${l.stats.switches.member}\``
|
||||
}
|
||||
|
||||
const sentences = [
|
||||
`${l.stats.role}: ${newRole}`,
|
||||
`${l.stats.ticketsCreated}: \`${stats.ticketsCreated}\``,
|
||||
`${l.stats.ticketsClosed}: \`${stats.ticketsClosed}\``,
|
||||
`${l.stats.ticketsDeleted}: \`${stats.ticketsDeleted}\``,
|
||||
`${l.stats.ticketsReopened}: \`${stats.ticketsReopened}\``
|
||||
]
|
||||
|
||||
const embed = new EmbedBuilder()
|
||||
.setColor(config.color)
|
||||
.setTitle(`📊 ${l.stats.userTitle}`.replace("{0}",`${stats.userName}!`))
|
||||
.setDescription(sentences.join("\n"))
|
||||
return embed
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
updateGlobalStats,
|
||||
updateTicketStats,
|
||||
updateUserStats,
|
||||
|
||||
removeStats,
|
||||
existStats,
|
||||
getStats,
|
||||
|
||||
startupStatsManager,
|
||||
|
||||
getGlobalStats,
|
||||
getTicketStats,
|
||||
getUserStats,
|
||||
createGlobalStatsEmbed,
|
||||
createTicketStatsEmbed,
|
||||
createUserStatsEmbed
|
||||
}
|
||||
@@ -43,6 +43,15 @@ module.exports = () => {
|
||||
require("./ticketCloser").closeManager(clientMember,channel,prefix,"close","OTautoclose",true)
|
||||
storage.delete("autocloseTickets",channel.id)
|
||||
|
||||
//STATS
|
||||
bot.statsManager.updateGlobalStats("TICKETS_AUTOCLOSED",(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateTicketStats("STATUS",channel.id,(current) => {
|
||||
return "autoclosed"
|
||||
})
|
||||
|
||||
channel.send({embeds:[bot.embeds.commands.autocloseSignalEmbed(client.user,t.value)],components:[bot.buttons.close.closeCommandRow]})
|
||||
}
|
||||
|
||||
|
||||
@@ -51,9 +51,14 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
|
||||
if (mode == "delete" || mode == "deletenotranscript"){
|
||||
//delete
|
||||
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
|
||||
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
||||
|
||||
//check perms
|
||||
if (!guild) return
|
||||
if (!permsChecker.command(user.id,guild.id)){
|
||||
if (!permsChecker.ticket(user.id,guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(user)
|
||||
return
|
||||
}
|
||||
@@ -63,7 +68,7 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
if (!nomessage){
|
||||
await channel.send({content:"**"+l.messages.gettingdeleted+"**"})
|
||||
}
|
||||
log("system","deleted a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
|
||||
log("system","deleted a ticket",[{key:"user",value:user.username},{key:"ticket",value:channel.name}])
|
||||
pendingDelete.push(channel.id)
|
||||
|
||||
if (!isDatabaseError) storage.set("amountOfUserTickets",getuserID,Number(storage.get("amountOfUserTickets",getuserID)) - 1)
|
||||
@@ -72,34 +77,35 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
storage.delete("autocloseTickets",channel.id)
|
||||
if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0)
|
||||
|
||||
//getID & send DM & send api event
|
||||
await channel.messages.fetchPinned().then(async msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value.value
|
||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
||||
|
||||
require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
|
||||
|
||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
||||
|
||||
const sphd = bot.hiddenData.removeHiddenData(firstmsg.embeds[0].description)
|
||||
sphd.hiddenData.data.push({key:"pendingdelete",value:"true"})
|
||||
const newEmbed = new discord.EmbedBuilder(firstmsg.embeds[0].data)
|
||||
newEmbed.setDescription(sphd.description + bot.hiddenData.writeHiddenData(sphd.hiddenData.type,sphd.hiddenData.data))
|
||||
await firstmsg.edit({embeds:[newEmbed]})
|
||||
|
||||
if (!id) return false
|
||||
|
||||
//STATS
|
||||
bot.statsManager.updateGlobalStats("TICKETS_DELETED",(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateUserStats("TICKETS_DELETED",user.id,(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.removeStats("ticket","CREATED_BY",channel.id)
|
||||
bot.statsManager.removeStats("ticket","CREATED_AT",channel.id)
|
||||
bot.statsManager.removeStats("ticket","STATUS",channel.id)
|
||||
|
||||
hiddendata.push({key:"pendingdelete",value:"true"})
|
||||
bot.hiddenData.writeHiddenData(channel.id,hiddendata)
|
||||
|
||||
}else if (mode == "close"){
|
||||
//close
|
||||
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
|
||||
if (hiddendata.length < 1) return channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
||||
|
||||
//check perms
|
||||
if (config.system.closeMode == "adminonly"){
|
||||
if (!guild) return
|
||||
if (!permsChecker.command(user.id,guild.id)){
|
||||
if (!permsChecker.ticket(user.id,guild.id,ticketId)){
|
||||
permsChecker.sendUserNoPerms(user)
|
||||
return
|
||||
}
|
||||
@@ -139,27 +145,7 @@ exports.closeManager = 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
|
||||
await channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id){
|
||||
var firstmsg = msglist.find((m => m.author.id == client.user.id))
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id){
|
||||
return channel.send({embeds:[ticketInfoError]})
|
||||
}
|
||||
}
|
||||
|
||||
if (firstmsg.embeds.length < 1 || !firstmsg.embeds[0].description.includes("OTDATA")) return channel.send({embeds:[ticketInfoError]})
|
||||
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
||||
|
||||
if (!ticketData) return
|
||||
|
||||
if (ticketData.closedCategory.enable){
|
||||
/**@type {discord.CategoryChannel} */
|
||||
const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory)
|
||||
@@ -170,11 +156,7 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {String[]}
|
||||
*/
|
||||
const ticketadmin = ticketData.adminroles
|
||||
ticketadmin.forEach((role,index) => {
|
||||
ticketData.adminroles.forEach((role,index) => {
|
||||
if (!config.adminRoles.includes(role)){
|
||||
try {
|
||||
const adminrole = guild.roles.cache.find(r => r.id == role)
|
||||
@@ -191,7 +173,6 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
channel.permissionOverwrites.set(permissionArray)
|
||||
|
||||
@@ -204,33 +185,31 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
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.username},{key:"ticket",value:channel.name}])
|
||||
|
||||
|
||||
//getID & send DM & send api event
|
||||
await channel.messages.fetchPinned().then(msglist => {
|
||||
var firstmsg = msglist.last()
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type").value
|
||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
||||
|
||||
//send api event
|
||||
require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason)
|
||||
|
||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
||||
|
||||
if (!id) return false
|
||||
|
||||
//STATS
|
||||
bot.statsManager.updateGlobalStats("TICKETS_CLOSED",(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateUserStats("TICKETS_CLOSED",user.id,(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateTicketStats("STATUS",channel.id,(current) => {
|
||||
return "closed"
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {discord.TextChannel} channel
|
||||
* @param {Number} limit
|
||||
* @returns
|
||||
* @returns {Promise<discord.Message[]>}
|
||||
*/
|
||||
const getmessages = async (channel,limit) => {
|
||||
const final = []
|
||||
@@ -263,6 +242,9 @@ exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||
const deleteHandler = async () => {
|
||||
if (deleteRequired){
|
||||
pendingDelete.shift()
|
||||
//delete HIDDENDATA
|
||||
storage.delete("HIDDENDATA",channel.id)
|
||||
|
||||
await channel.delete()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,13 +10,12 @@ const storage = bot.storage
|
||||
|
||||
module.exports = () => {
|
||||
//dropdown placeholder
|
||||
client.on("interactionCreate",(interaction) => {
|
||||
client.on("interactionCreate",async (interaction) => {
|
||||
if (!interaction.isStringSelectMenu()) return
|
||||
if (interaction.customId != "OTdropdownMenu") return
|
||||
if (interaction.values.includes("OTChooseTicket")){
|
||||
interaction.deferUpdate()
|
||||
await interaction.deferUpdate()
|
||||
}
|
||||
|
||||
})
|
||||
|
||||
|
||||
@@ -37,7 +36,7 @@ module.exports = () => {
|
||||
if (interaction.customId.startsWith("OTnewT")){
|
||||
const optionid = interaction.customId.split("OTnewT")[1]
|
||||
if (!optionid){
|
||||
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]})
|
||||
await interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]})
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -48,15 +47,16 @@ module.exports = () => {
|
||||
|
||||
//ticketoptions from config
|
||||
const currentTicketOptions = configParser.getTicketById(customId)
|
||||
|
||||
if (currentTicketOptions == false) return interaction.reply({embeds:[bot.errorLog.serverError(l.errors.anotherOption)]})
|
||||
|
||||
if (interaction.isButton()){
|
||||
try {
|
||||
if (config.system.answerInEphemeralOnOpen) await interaction.deferReply({ephemeral:true})
|
||||
await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
|
||||
} catch{}
|
||||
}else if (interaction.isChatInputCommand()){
|
||||
try {
|
||||
await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
|
||||
} catch{}
|
||||
}else if (interaction.isStringSelectMenu()){
|
||||
try {
|
||||
await interaction.deferUpdate()
|
||||
@@ -110,9 +110,7 @@ module.exports = () => {
|
||||
type:"role",
|
||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
||||
})
|
||||
}catch{
|
||||
log("system","invalid role! At 'config.json => main_adminroles:"+index)
|
||||
}
|
||||
}catch{}
|
||||
})
|
||||
|
||||
//add ticket adminroles
|
||||
@@ -131,12 +129,29 @@ module.exports = () => {
|
||||
type:"role",
|
||||
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
||||
})
|
||||
}catch{
|
||||
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
|
||||
}
|
||||
}catch{}
|
||||
}
|
||||
})
|
||||
|
||||
//add ticket adminroles
|
||||
if (currentTicketOptions.readonlyAdminroles){
|
||||
currentTicketOptions.readonlyAdminroles.forEach((role,index) => {
|
||||
if (!config.adminRoles.includes(role) && !currentTicketOptions.adminroles.includes(role)){
|
||||
try {
|
||||
const adminrole = guild.roles.cache.find(r => r.id == role)
|
||||
if (!adminrole) return
|
||||
|
||||
permissionsArray.push({
|
||||
id:adminrole,
|
||||
type:"role",
|
||||
allow:[pfb.AddReactions,pfb.ViewChannel],
|
||||
deny:[pfb.SendMessages,pfb.AttachFiles,pfb.EmbedLinks]
|
||||
})
|
||||
}catch{}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//add member role
|
||||
if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
|
||||
try {
|
||||
@@ -148,9 +163,7 @@ module.exports = () => {
|
||||
deny:[pfb.ViewChannel]
|
||||
})
|
||||
}
|
||||
}catch{
|
||||
log("system","invalid role! At 'config.json => system/memberRole")
|
||||
}
|
||||
}catch{}
|
||||
}
|
||||
|
||||
//create the channel
|
||||
@@ -165,7 +178,7 @@ module.exports = () => {
|
||||
storage.set("userFromChannel",ticketChannel.id,interaction.member.id)
|
||||
if (currentTicketOptions.autoclose.enable) storage.set("autocloseTickets",ticketChannel.id,currentTicketOptions.autoclose.inactiveHours)
|
||||
|
||||
const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
|
||||
bot.hiddenData.writeHiddenData(ticketChannel.id,[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
|
||||
|
||||
var ticketEmbed = new discord.EmbedBuilder()
|
||||
//.setAuthor({name:interaction.user.id})
|
||||
@@ -178,16 +191,19 @@ module.exports = () => {
|
||||
}
|
||||
|
||||
if (currentTicketOptions.ticketmessage.length > 0){
|
||||
ticketEmbed.setDescription(currentTicketOptions.ticketmessage+hiddendata)
|
||||
}else{
|
||||
ticketEmbed.setDescription(hiddendata)
|
||||
ticketEmbed.setDescription(currentTicketOptions.ticketmessage)
|
||||
}
|
||||
|
||||
if (currentTicketOptions.thumbnail.enable) ticketEmbed.setThumbnail(currentTicketOptions.thumbnail.url)
|
||||
if (currentTicketOptions.image.enable) ticketEmbed.setImage(currentTicketOptions.image.url)
|
||||
|
||||
const herePing = currentTicketOptions.ping['@here'] ? " @here" : ""
|
||||
const everyonePing = currentTicketOptions.ping['@everyone'] ? " @everyone" : ""
|
||||
const customPing = currentTicketOptions.ping.custom.enable ? " <@&"+currentTicketOptions.ping.custom.roleId+">" : ""
|
||||
|
||||
|
||||
ticketChannel.send({
|
||||
content:"<@"+interaction.member.id+"> @here",
|
||||
content:"<@"+interaction.member.id+">"+herePing+everyonePing+customPing,
|
||||
embeds:[ticketEmbed],
|
||||
components:[closeButton]
|
||||
|
||||
@@ -195,9 +211,28 @@ module.exports = () => {
|
||||
firstmsg.pin()
|
||||
})
|
||||
|
||||
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.username}])
|
||||
require("../api/modules/events").onTicketOpen(interaction.user,ticketChannel,interaction.guild,new Date(),{name:ticketName,status:"open",ticketOptions:currentTicketOptions})
|
||||
|
||||
//STATS:
|
||||
bot.statsManager.updateGlobalStats("TICKETS_CREATED",(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateUserStats("TICKETS_CREATED",interaction.user.id,(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateTicketStats("CREATED_BY",ticketChannel.id,(current) => {
|
||||
return interaction.user.id
|
||||
})
|
||||
bot.statsManager.updateTicketStats("CREATED_AT",ticketChannel.id,(current) => {
|
||||
return new Date().getTime()
|
||||
})
|
||||
bot.statsManager.updateTicketStats("STATUS",ticketChannel.id,(current) => {
|
||||
return "open"
|
||||
})
|
||||
|
||||
const channelbutton = new discord.ActionRowBuilder()
|
||||
.addComponents([
|
||||
new discord.ButtonBuilder()
|
||||
@@ -213,7 +248,13 @@ module.exports = () => {
|
||||
}
|
||||
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]})
|
||||
if ((interaction.isButton() && config.system.answerInEphemeralOnOpen) || interaction.isChatInputCommand()){
|
||||
if (interaction.deferred){
|
||||
interaction.editReply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)],components:[channelbutton]})
|
||||
}else{
|
||||
interaction.reply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)],components:[channelbutton]})
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
}else{
|
||||
|
||||
@@ -15,7 +15,7 @@ const pfb = discord.PermissionFlagsBits
|
||||
* @returns
|
||||
*/
|
||||
const reopenTicket = (guild,channel,user) => {
|
||||
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}])
|
||||
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.username}])
|
||||
|
||||
var permissionsArray = []
|
||||
|
||||
@@ -46,9 +46,21 @@ const reopenTicket = (guild,channel,user) => {
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
channel.permissionOverwrites.set(permissionsArray)
|
||||
|
||||
require("../api/modules/events").onTicketReopen(user,channel,guild,new Date(),{name:channel.name,status:"reopened",ticketOptions:false})
|
||||
|
||||
//STATS
|
||||
bot.statsManager.updateGlobalStats("TICKETS_REOPENED",(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateUserStats("TICKETS_REOPENED",user.id,(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
bot.statsManager.updateTicketStats("STATUS",channel.id,(current) => {
|
||||
return "reopened"
|
||||
})
|
||||
}
|
||||
exports.reopenTicket = reopenTicket
|
||||
+11
-7
@@ -11,6 +11,14 @@ const version = require("../info.json").version
|
||||
/**@typedef {{style:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String, titleColor:String}, bot:{name:String, id:Number, pfp:String}, ticket:{creatorname:String, creatorid:Number, closedtime:Number, openedtime:Number}}} OThtsDataOption */
|
||||
|
||||
|
||||
/**==========================================================
|
||||
=============================================================
|
||||
================THIS FILE ISN'T USED ANYMORE!!===============
|
||||
This file is for html transcripts V1!
|
||||
Visit compileJsonV2.js for the current version!
|
||||
=============================================================
|
||||
===========================================================*/
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {discord.Guild} guild
|
||||
@@ -46,13 +54,9 @@ exports.compile = (guild,channel,user,messagesInv,data) => {
|
||||
})
|
||||
|
||||
msg.embeds.forEach((embed) => {
|
||||
if (embed.description){
|
||||
var desc = bot.hiddenData.removeHiddenData(embed.description).description
|
||||
}else{var desc = false}
|
||||
|
||||
embedArray.push({
|
||||
title:embed.title || false,
|
||||
description:desc,
|
||||
description:embed.description ? embed.description : false,
|
||||
authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false),
|
||||
authortext:(embed.author ? embed.author.name : false),
|
||||
footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false),
|
||||
@@ -67,7 +71,7 @@ exports.compile = (guild,channel,user,messagesInv,data) => {
|
||||
const memberColor = msg.member ? msg.member.displayHexColor : "#ffffff"
|
||||
messagesArray.push({
|
||||
author:{
|
||||
name:msg.author.tag,
|
||||
name:msg.author.username,
|
||||
id:Number(msg.author.id),
|
||||
color:memberColor,
|
||||
pfp:msg.author.displayAvatarURL()
|
||||
@@ -102,7 +106,7 @@ exports.compile = (guild,channel,user,messagesInv,data) => {
|
||||
|
||||
creatorname:data.ticket.creatorname,
|
||||
creatorid:Number(data.ticket.creatorid),
|
||||
closedbyname:user.tag,
|
||||
closedbyname:user.username,
|
||||
closedbyid:Number(user.id),
|
||||
|
||||
closedtime:data.ticket.closedtime,
|
||||
@@ -0,0 +1,395 @@
|
||||
const discord = require('discord.js')
|
||||
|
||||
const bot = require("../../../index")
|
||||
const tsconfig = bot.tsconfig
|
||||
const tsembeds = require("../embeds")
|
||||
const tsdb = require("../tsdb")
|
||||
|
||||
const otversion = require("../../../package.json").version
|
||||
const version = require("../info.json").version
|
||||
|
||||
const mentions = require("./mentions").replacementions
|
||||
|
||||
/**@typedef {{background:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String}, header:{enableCustomHeader:Boolean, decoColor:String, backgroundColor:String, textColor:String}, stats:{enableCustomStats:Boolean, backgroundColor:String, keyTextColor:String, valueTextColor:String, hideBackgroundColor:String, hideTextColor:String}, favicon:{enableCustomFavicon:Boolean, imageUrl:String}} OTTranscriptStyle} */
|
||||
/**@typedef {{name:String, id:String, pfp:String}} OTTranscriptBot */
|
||||
/**@typedef {{name:String, id:String, guildname:String, guildid:String, guildinvite:String|false, creatorname:String, creatorid:String, closedbyname:String, closedbyid:String, claimedname:String, claimedid:String, creatorpfp:String, closedbypfp:String, claimedpfp:String, closedtime:Number, openedtime:Number, components:{messages:1, files:1, embeds:1, reactions:1, interactions:{dropdowns:1, buttons:1, total:1}, attachments:{invites:1, images:1, gifs:1, stickers:1}}, roleColors:[{id:String,color:String}] }} OTTranscriptTicket */
|
||||
/**@typedef {{author:{name:String, id:String, color:String, pfp:String, bot:Boolean, verifiedBot:Boolean, system:Boolean}, content:String|false, timestamp:Number, type:"normal", important:Boolean, edited:Boolean, embeds:[{title:String|false, description:String|false, authorimg:String|false, authortext:String|false, footerimg:String|false, footertext:String|false, color:String, image:String|false, thumbnail:String|false, url:String|false, fields:[{name:String,value:String,inline:Boolean}]}], attachments:[{type:"FILE", name:String, fileType:String, size:String, url:String}, {type:"FILE:image", name:String, fileType:String, size:String, url:String}, {type:"URL:invite", guildId:String, guildName:String, guildSize:Number, guildOnline:Number, image:String, url:String}, {type:"URL:gif", url:String}, {type:"BUILDIN:sticker", name:String, url:String}], components:[{type:"buttons", buttons:[{type:"interaction"|"url", label:String|false, icon:String|false, color:"gray"|"green"|"red"|"blue", id:String|false, url:String|false, disabled:Boolean}]}, {type:"dropdown", placeholder:String|false, options:[{label:String|false, icon:String|false, description:String|false, id:String|false}]}, {type:"reactions", reactions:[{amount:1, emoji:String, type:"svg"|"image"|"gif"}]}], reply:{type:"reply"|"command"|false, user:{name:String, id:String, color:String, pfp:String, bot:Boolean, verifiedBot:Boolean, system:Boolean}, replyOptions:{content:String, messageId:String, channelId:String, guildId:String}, commandOptions:{interactionName:String, interactionId:String}}}} OTTranscriptMessage */
|
||||
/**@typedef {{enabled:Boolean,premiumToken:String, customCredits:{enable:Boolean, replaceText:String, replaceURL:String, enableReportBug:Boolean},customHeaderUrl:{enabled:Boolean, url:String, text:String}, customTranscriptUrl:{enabled:Boolean, name:String}, customFavicon:{enabled:Boolean, image:String},additionalFlags:String[]}} OTTranscriptPremium */
|
||||
|
||||
/**@typedef {{version:"2", otversion:String, language:String, style:OTTranscriptStyle, bot:OTTranscriptBot, ticket:OTTranscriptTicket, messages:OTTranscriptMessage[], premium:OTTranscriptPremium}} OTTranscriptCompileInput */
|
||||
|
||||
/**@typedef {{style:OTTranscriptStyle,bot:OTTranscriptBot,ticket:OTTranscriptTicket,premium:OTTranscriptPremium}} OTHTMLDataOption */
|
||||
|
||||
|
||||
/**@param {discord.ButtonStyle} buttonstyle */
|
||||
const buttonStyleToColor = (buttonstyle) => {
|
||||
if (buttonstyle == discord.ButtonStyle.Primary){
|
||||
return "blue"
|
||||
}else if (buttonstyle == discord.ButtonStyle.Secondary){
|
||||
return "gray"
|
||||
}else if (buttonstyle == discord.ButtonStyle.Danger){
|
||||
return "red"
|
||||
}else if (buttonstyle == discord.ButtonStyle.Success){
|
||||
return "green"
|
||||
}else{
|
||||
return "gray"
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {discord.Guild} guild
|
||||
* @param {discord.Channel} channel
|
||||
* @param {discord.User} user
|
||||
* @param {discord.Message[]} messagesInv
|
||||
* @param {OTHTMLDataOption} data
|
||||
*/
|
||||
exports.compile = (guild,channel,user,messagesInv,data) => {
|
||||
const messages = messagesInv.reverse()
|
||||
var invisibleMessages = 0
|
||||
|
||||
//MESSAGE STATS COUNTS
|
||||
var messageAmount = messages.length
|
||||
var fileAmount = 0
|
||||
var embedAmount = 0
|
||||
var reactionsAmount = 0
|
||||
var interactionAmount = 0
|
||||
messages.forEach((msg) => {
|
||||
fileAmount = fileAmount + Array.from(msg.attachments).length
|
||||
embedAmount = embedAmount + msg.embeds.length
|
||||
|
||||
msg.reactions.cache.forEach(reaction => {
|
||||
reactionsAmount = reactionsAmount + reaction.count
|
||||
})
|
||||
if (msg.components && msg.components.length > 0){
|
||||
msg.components.forEach((component) => {
|
||||
if (component.components.length > 0){
|
||||
interactionAmount = interactionAmount + component.components.length
|
||||
}else{
|
||||
interactionAmount = interactionAmount+1
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
/**@type {OTTranscriptMessage[]} */
|
||||
const messagesArray = []
|
||||
messages.forEach((msg) => {
|
||||
if (msg.content || msg.embeds.length > 0 || msg.attachments.toJSON().length > 0 || msg.components.length > 0 || msg.reactions.cache.size > 0){
|
||||
|
||||
const embedArray = []
|
||||
const attachmentArray = []
|
||||
const componentsArray = []
|
||||
|
||||
msg.attachments.forEach((file) => {
|
||||
attachmentArray.push({
|
||||
type:"FILE",
|
||||
name:file.name,
|
||||
fileType:file.contentType,
|
||||
size:Math.round(file.size/1000)+" kb",
|
||||
url:file.url
|
||||
})
|
||||
})
|
||||
|
||||
msg.embeds.forEach((embed) => {
|
||||
embedArray.push({
|
||||
title:embed.title || false,
|
||||
description:embed.description ? mentions(embed.description,guild) : false,
|
||||
authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false),
|
||||
authortext:(embed.author ? embed.author.name : false),
|
||||
footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false),
|
||||
footertext:(embed.footer ? embed.footer.text : false),
|
||||
color:embed.hexColor,
|
||||
image:((embed.image && embed.image.url) ? embed.image.url : false),
|
||||
thumbnail:((embed.thumbnail && embed.thumbnail.url) ? embed.thumbnail.url : false),
|
||||
url:(embed.url ? embed.url : false),
|
||||
fields:embed.fields
|
||||
})
|
||||
})
|
||||
|
||||
const tempreactions = []
|
||||
msg.reactions.cache.forEach((reaction) => {
|
||||
const count = reaction.count
|
||||
const emoji = reaction.emoji
|
||||
|
||||
if (emoji instanceof discord.GuildEmoji){
|
||||
//custom emoji
|
||||
tempreactions.push({
|
||||
amount:count,
|
||||
emoji:(emoji.url) ? emoji.url : "",
|
||||
type:(emoji.animated) ? "gif" : "image"
|
||||
})
|
||||
}else if (emoji instanceof discord.ReactionEmoji){
|
||||
//build-in emoji
|
||||
tempreactions.push({
|
||||
amount:count,
|
||||
emoji:emoji.name,
|
||||
type:"svg"
|
||||
})
|
||||
}
|
||||
})
|
||||
componentsArray.push({
|
||||
type: "reactions",
|
||||
reactions:tempreactions
|
||||
})
|
||||
|
||||
msg.components.forEach((actionrow) => {
|
||||
var isdropdown = false
|
||||
var actioncomponents = []
|
||||
actionrow.components.forEach((comp) => {
|
||||
if (comp.type == discord.ComponentType.ActionRow || comp.type == discord.ComponentType.TextInput) return
|
||||
|
||||
/**
|
||||
* type: "buttons";
|
||||
buttons: [{
|
||||
type: "interaction" | "url";
|
||||
label: string | false;
|
||||
icon: string | false;
|
||||
color: "gray" | "green" | "red" | "blue";
|
||||
id: string | false;
|
||||
url: string | false;
|
||||
disabled: boolean;
|
||||
}];
|
||||
}, {
|
||||
type: "dropdown";
|
||||
placeholder: string | false;
|
||||
options: [{
|
||||
label: string | false;
|
||||
icon: string | false;
|
||||
description: string | false;
|
||||
id: string | false;
|
||||
}];
|
||||
},
|
||||
*/
|
||||
if (comp.type == discord.ComponentType.Button){
|
||||
actioncomponents.push({
|
||||
type: (comp.style == discord.ButtonStyle.Link) ? "url" : "interaction",
|
||||
label: (comp.label) ? comp.label : false,
|
||||
icon: (comp.emoji) ? comp.emoji.name : false,
|
||||
color: buttonStyleToColor(comp.style),
|
||||
id: comp.customId ? comp.customId : false,
|
||||
url: (comp.url) ? comp.url : false,
|
||||
disabled: false
|
||||
})
|
||||
}else{
|
||||
isdropdown = true
|
||||
var drpdwnoptions = []
|
||||
/**@type {discord.APISelectMenuOption[]} */
|
||||
const dropdownoptions = comp.options
|
||||
dropdownoptions.forEach((opt) => {
|
||||
drpdwnoptions.push({
|
||||
label: opt.label,
|
||||
icon: (opt.emoji) ? opt.emoji : false,
|
||||
description: (opt.description) ? opt.description : false,
|
||||
id: "hello world :)"
|
||||
})
|
||||
})
|
||||
|
||||
componentsArray.push({
|
||||
type:"dropdown",
|
||||
placeholder:false,
|
||||
options:drpdwnoptions
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
if (!isdropdown){
|
||||
componentsArray.push({
|
||||
type:"buttons",
|
||||
buttons:actioncomponents
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
const important = msg.guild ? (msg.content.includes("<@"+msg.guild.id+">") || msg.content.includes("<@everyone") || msg.content.includes("@here")): false
|
||||
|
||||
const replytype = (msg.interaction) ? "command" : ((msg.reference) ? "reply" : false)
|
||||
if (replytype == "command"){
|
||||
const replycolorRAW = msg.guild.members.cache.find((m) => m.id == msg.interaction.user.id)
|
||||
const replycolor = (replycolorRAW) ? replycolorRAW.displayHexColor.replace("#000000","#ffffff") : "#ffffff"
|
||||
var reply = {
|
||||
type:replytype,
|
||||
commandOptions:{
|
||||
interactionId:msg.interaction.id,
|
||||
interactionName:msg.interaction.commandName
|
||||
},
|
||||
user:{
|
||||
name:msg.interaction.user.username,
|
||||
id:msg.interaction.user.id,
|
||||
color:replycolor,
|
||||
pfp:msg.interaction.user.displayAvatarURL(),
|
||||
bot:msg.interaction.user.bot,
|
||||
system:msg.interaction.user.system,
|
||||
verifiedBot:msg.interaction.user.flags.has(discord.UserFlags.VerifiedBot)
|
||||
}
|
||||
}
|
||||
}else if (replytype == "reply"){
|
||||
|
||||
var replycontentRAW = messages.find((msg2) => msg2.id == msg.reference.messageId)
|
||||
var replycontent = (replycontentRAW && replycontentRAW.content) ? replycontentRAW.content.slice(0,(60-replycontentRAW.author.username.length)) : "deleted this message"
|
||||
const replycolorRAW = (replycontentRAW) ? msg.guild.members.cache.find((m) => m.id == replycontentRAW.author.id) : false
|
||||
const replycolor = (replycolorRAW) ? replycolorRAW.displayHexColor.replace("#000000","#ffffff") : "#ffffff"
|
||||
|
||||
var user = (replycontentRAW && replycontentRAW.content) ? {
|
||||
name:(replycontentRAW) ? replycontentRAW.author.username : "undefined",
|
||||
id:(replycontentRAW) ? replycontentRAW.author.id : "undefined",
|
||||
color:replycolor,
|
||||
pfp:(replycontentRAW) ? replycontentRAW.author.username : "",
|
||||
bot:(replycontentRAW) ? replycontentRAW.author.bot : false,
|
||||
system:(replycontentRAW) ? replycontentRAW.author.system : false,
|
||||
verifiedBot:(replycontentRAW) ? replycontentRAW.author.flags.has(discord.UserFlags.VerifiedBot) : false,
|
||||
} : {
|
||||
name:"someone",
|
||||
id:"undefined",
|
||||
color:"#ffffff",
|
||||
pfp:"https://raw.githubusercontent.com/twitter/twemoji/master/assets/72x72/1f5d1.png",
|
||||
bot:false,
|
||||
system:false,
|
||||
verifiedBot:false,
|
||||
}
|
||||
|
||||
var reply = {
|
||||
type:replytype,
|
||||
replyOptions:{
|
||||
content:replycontent,
|
||||
messageId: msg.reference.messageId,
|
||||
channelId: msg.reference.channelId,
|
||||
guildId: msg.reference.guildId
|
||||
},
|
||||
user:user
|
||||
}
|
||||
}else{var reply = {type:replytype}}
|
||||
|
||||
const authorColor = msg.member ? msg.member.displayHexColor.replace("#000000","#ffffff") : "#ffffff"
|
||||
messagesArray.push({
|
||||
author:{
|
||||
name:msg.author.username,
|
||||
id:msg.author.id,
|
||||
color:authorColor,
|
||||
pfp:msg.author.displayAvatarURL(),
|
||||
bot:msg.author.bot,
|
||||
system:msg.author.system,
|
||||
verifiedBot:msg.author.flags.has(discord.UserFlags.VerifiedBot)
|
||||
},
|
||||
content:mentions(msg.content,guild) || "",
|
||||
timestamp:msg.createdTimestamp,
|
||||
embeds:embedArray,
|
||||
attachments:attachmentArray,
|
||||
edited: (typeof msg.editedTimestamp == "number"),
|
||||
type:"normal",
|
||||
important:important,
|
||||
reply:reply,
|
||||
components:componentsArray
|
||||
})
|
||||
}else {invisibleMessages++}
|
||||
})
|
||||
|
||||
const dsb = data.style.background
|
||||
const dsh = data.style.header
|
||||
const dss = data.style.stats
|
||||
const dsf = data.style.favicon
|
||||
|
||||
/**@type {OTTranscriptCompileInput} */
|
||||
const result = {
|
||||
version,otversion,
|
||||
language:bot.config.languageFile,
|
||||
style:{
|
||||
background:{
|
||||
backgroundData:dsb.backgroundData || "",
|
||||
backgroundModus:dsb.backgroundModus || "",
|
||||
enableCustomBackground:dsb.enableCustomBackground || false,
|
||||
},
|
||||
header:{
|
||||
backgroundColor:dsh.backgroundColor || "#202225",
|
||||
decoColor:dsh.decoColor || "#F8BA00",
|
||||
textColor:dsh.textColor || "#ffffff",
|
||||
enableCustomHeader:dsh.enableCustomHeader || false
|
||||
},
|
||||
stats:{
|
||||
backgroundColor:dss.backgroundColor || "#202225",
|
||||
keyTextColor:dss.keyTextColor || "#737373",
|
||||
valueTextColor:dss.valueTextColor || "#ffffff",
|
||||
hideBackgroundColor:dss.hideBackgroundColor || "#40444a",
|
||||
hideTextColor:dss.hideTextColor || "#ffffff",
|
||||
enableCustomStats:dss.enableCustomStats || false
|
||||
}
|
||||
},
|
||||
bot:{
|
||||
name:data.bot.name || "Open Ticket",
|
||||
id:data.bot.id || 0,
|
||||
pfp:data.bot.pfp || "transcripts.dj-dj.be/favicon.png"
|
||||
},
|
||||
ticket:{
|
||||
name:channel.name,
|
||||
id:channel.id,
|
||||
|
||||
guildname:guild.name,
|
||||
guildid:guild.id,
|
||||
guildinvite:"",
|
||||
|
||||
creatorname:data.ticket.creatorname,
|
||||
creatorid:data.ticket.creatorid,
|
||||
creatorpfp:data.ticket.creatorpfp,
|
||||
|
||||
closedbyname:user.username,
|
||||
closedbyid:user.id,
|
||||
closedbypfp:user.displayAvatarURL(),
|
||||
|
||||
claimedid:"",
|
||||
claimedname:"",
|
||||
claimedpfp:"",
|
||||
|
||||
closedtime:data.ticket.closedtime,
|
||||
openedtime:data.ticket.openedtime,
|
||||
|
||||
roleColors:[],
|
||||
components:{
|
||||
messages:messageAmount,
|
||||
embeds:embedAmount,
|
||||
files:fileAmount,
|
||||
interactions:{
|
||||
buttons:0,
|
||||
dropdowns:0,
|
||||
total:interactionAmount
|
||||
},
|
||||
reactions:reactionsAmount,
|
||||
attachments:{
|
||||
gifs:0,
|
||||
images:0,
|
||||
stickers:0,
|
||||
invites:0
|
||||
}
|
||||
}
|
||||
},
|
||||
messages:messagesArray,
|
||||
premium:{
|
||||
enabled:false,
|
||||
premiumToken:"",
|
||||
|
||||
customCredits:{
|
||||
enable:false,
|
||||
replaceText:"Powered By Open Ticket!",
|
||||
replaceURL:"https://openticket.dj-dj.be",
|
||||
enableReportBug:true
|
||||
},
|
||||
customHeaderUrl:{
|
||||
enabled:false,
|
||||
url:"https://openticket.dj-dj.be",
|
||||
text:"Hello!"
|
||||
},
|
||||
customTranscriptUrl:{
|
||||
enabled:false,
|
||||
name:"test-server"
|
||||
},
|
||||
customFavicon:{
|
||||
enabled:dsf.enableCustomFavicon,
|
||||
image:(dsf.imageUrl) ? dsf.imageUrl : "https://openticket.dj-dj.be"
|
||||
},
|
||||
additionalFlags:[]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -6,7 +6,7 @@ const tsconfig = bot.tsconfig
|
||||
const tsembeds = require("../embeds")
|
||||
const tsdb = require("../tsdb")
|
||||
|
||||
/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */
|
||||
/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number,waittime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */
|
||||
|
||||
/**
|
||||
* @param {Object} json
|
||||
@@ -17,12 +17,12 @@ exports.upload = async (json) => {
|
||||
const data = encodeURIComponent(JSON.stringify(json))
|
||||
|
||||
try {
|
||||
const res = await axios.get("https://api.transcripts.dj-dj.be/upload?auth=openticketTRANSCRIPT1234&version=1.0.0&data="+data)
|
||||
const res = await axios.post("https://apis.dj-dj.be/transcripts/upload?auth=openticketTRANSCRIPT1234&version=2",JSON.stringify(json))
|
||||
if (res.status != 200) resolve(false)
|
||||
|
||||
resolve(res.data)
|
||||
}catch{
|
||||
console.log("failed transcript upload!")
|
||||
}catch(err){
|
||||
console.log("failed transcript upload!",err.response)
|
||||
resolve(false)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
const discord = require('discord.js')
|
||||
|
||||
const bot = require("../../../index")
|
||||
const tsconfig = bot.tsconfig
|
||||
const tsembeds = require("../embeds")
|
||||
const tsdb = require("../tsdb")
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} text
|
||||
* @param {discord.Guild} guild
|
||||
*/
|
||||
exports.replacementions = (text,guild) => {
|
||||
const userregex = /<@([0-9]+)>(\s)?/g
|
||||
const usertext = text.replace(userregex,(x) => {
|
||||
var res = userregex.exec(x)
|
||||
userregex.lastIndex = 0
|
||||
|
||||
var member = guild.members.cache.find((m) => m.id == res[1])
|
||||
var text = member ? member.user.username.replace(/\s/g," ") : res[1]
|
||||
return "<@"+text+"> "
|
||||
})
|
||||
|
||||
const channelregex = /<#([0-9]+)>(\s)?/g
|
||||
const channeltext = usertext.replace(channelregex,(x) => {
|
||||
var res = channelregex.exec(x)
|
||||
channelregex.lastIndex = 0
|
||||
|
||||
var channel = guild.channels.cache.find((c) => c.id == res[1])
|
||||
var text = channel ? channel.name.replace(/\s/g," ") : res[1]
|
||||
return "<#"+text+"> "
|
||||
})
|
||||
|
||||
const roleregex = /<@&([0-9]+)>(\s)?/g
|
||||
const roletext = channeltext.replace(roleregex,(x) => {
|
||||
var res = roleregex.exec(x)
|
||||
roleregex.lastIndex = 0
|
||||
|
||||
var role = guild.roles.cache.find((r) => r.id == res[1])
|
||||
var text = role ? role.name.replace(/\s/g," ") : res[1]
|
||||
|
||||
var color = role ? ((role.hexColor == "#000000") ? "regular" : role.hexColor) : "regular"
|
||||
|
||||
return "<@&"+text+"::"+color+"> "
|
||||
})
|
||||
|
||||
const defaultroleregex = /@(everyone|here)(\s)?/g
|
||||
const defaultroletext = roletext.replace(defaultroleregex,(x) => {
|
||||
var res = defaultroleregex.exec(x)
|
||||
defaultroleregex.lastIndex = 0
|
||||
|
||||
var text = res[1]
|
||||
return "<@&"+text+"::regular> "
|
||||
})
|
||||
|
||||
return defaultroletext
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
{
|
||||
"version":"1.0.0",
|
||||
"otversion":"3.3.1",
|
||||
"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"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -23,7 +23,7 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => {
|
||||
const embed = new discord.EmbedBuilder()
|
||||
.setTitle("🧾 "+l.transcripts.title)
|
||||
.setColor(config.color)
|
||||
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
|
||||
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
|
||||
.setFooter({text:name})
|
||||
|
||||
.setDescription("`"+l.transcripts.processed+"...`\n"+l.transcripts.wait+"\n\n"+l.transcripts.estimated+": "+processtime)
|
||||
@@ -43,7 +43,7 @@ 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()})
|
||||
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
|
||||
.setFooter({text:name})
|
||||
|
||||
if (url){
|
||||
@@ -67,7 +67,7 @@ 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()})
|
||||
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
|
||||
.setFooter({text:name})
|
||||
|
||||
const errDesc = (typeof err == "string") ? "\n"+err : ""
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"version":"1.0.0"
|
||||
"version":"2"
|
||||
}
|
||||
@@ -14,11 +14,15 @@ const tsdb = require("./tsdb")
|
||||
const checkAvailability = async () => {
|
||||
if (process.argv.some((v) => v == "--tsoffline")) return true
|
||||
const axios = require("axios").default
|
||||
const res = await axios.get("https://transcripts.dj-dj.be/status.txt")
|
||||
try{
|
||||
const res = await axios.get("https://transcripts.dj-dj.be/api/status.json")
|
||||
if (!res || !(res.status == 200) || !res.data) return false
|
||||
|
||||
if ((res.data == "online") || (res.data == "1") || (res.data == "true")) return true
|
||||
if (res.data && res.data["v2"] == "online") return true
|
||||
else return false
|
||||
}catch{
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -31,40 +35,68 @@ const checkAvailability = async () => {
|
||||
*/
|
||||
module.exports = async (messages,guild,channel,user,reason) => {
|
||||
require("../api/modules/events").onTranscriptCreation(messages,channel,guild,new Date())
|
||||
bot.statsManager.updateGlobalStats("TRANSCRIPTS_CREATED",(current) => {
|
||||
if (typeof current != "undefined") return current+1
|
||||
return 1
|
||||
})
|
||||
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()
|
||||
const asyncmanager = async () => {
|
||||
const hiddendata = bot.hiddenData.readHiddenData(channel.id)
|
||||
if (hiddendata.length < 1) return
|
||||
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
|
||||
|
||||
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return false
|
||||
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
|
||||
const ticketId = hiddendata.data.find(d => d.key == "type")
|
||||
|
||||
const id = hiddendata.data.find(d => d.key == "openerid").value
|
||||
const opentime = new Date(Number(hiddendata.data.find(d => d.key == "createdms").value))
|
||||
const id = hiddendata.find(d => d.key == "openerid").value
|
||||
const opentime = new Date(Number(hiddendata.find(d => d.key == "createdms").value))
|
||||
|
||||
const ticketopener = client.users.cache.find(u => u.id == id)
|
||||
|
||||
if (tsconfig.sendTranscripts.useHTMLtranscripts){
|
||||
const JSONDATA = require("./communication/compileJson").compile(guild,channel,user,messages,{
|
||||
const tsb = tsconfig.style.background
|
||||
const tsh = tsconfig.style.header
|
||||
const tss = tsconfig.style.stats
|
||||
const tsf = tsconfig.style.favicon
|
||||
const JSONDATA = require("./communication/compileJsonV2").compile(guild,channel,user,messages,{
|
||||
style:{
|
||||
titleColor:tsconfig.style.titleColor,
|
||||
enableCustomBackground:tsconfig.style.background.enableCustomBackground,
|
||||
backgroundModus:tsconfig.style.background.backgroundModus,
|
||||
backgroundData:tsconfig.style.background.backgroundData
|
||||
background:{
|
||||
enableCustomBackground:tsb.enableCustomBackground,
|
||||
backgroundModus:tsb.backgroundModus,
|
||||
backgroundData:tsb.backgroundData
|
||||
},
|
||||
header:{
|
||||
enableCustomHeader:tsh.enableCustomHeader,
|
||||
backgroundColor:tsh.backgroundColor,
|
||||
decoColor:tsh.decoColor,
|
||||
textColor:tsh.textColor
|
||||
},
|
||||
stats:{
|
||||
enableCustomStats:tss.enableCustomStats,
|
||||
backgroundColor:tss.backgroundColor,
|
||||
keyTextColor:tss.keyTextColor,
|
||||
valueTextColor:tss.valueTextColor,
|
||||
hideBackgroundColor:tss.hideBackgroundColor,
|
||||
hideTextColor:tss.hideTextColor
|
||||
},
|
||||
favicon:{
|
||||
enableCustomFavicon:tsf.enableCustomFavicon,
|
||||
imageUrl:tsf.imageUrl
|
||||
}
|
||||
|
||||
},
|
||||
bot:{
|
||||
name:client.user.username,
|
||||
id:client.user.id,
|
||||
pfp:client.user.displayAvatarURL()
|
||||
pfp:client.user.displayAvatarURL(),
|
||||
},
|
||||
ticket:{
|
||||
creatorid:ticketopener.id,
|
||||
creatorname:ticketopener.tag,
|
||||
creatorname:ticketopener.username,
|
||||
creatorpfp:ticketopener.displayAvatarURL(),
|
||||
|
||||
openedtime:opentime.getTime(),
|
||||
closedtime:new Date().getTime()
|
||||
}
|
||||
@@ -88,16 +120,17 @@ module.exports = async (messages,guild,channel,user,reason) => {
|
||||
if (!TSdata) return false
|
||||
|
||||
if (TSdata.status == "success"){
|
||||
const url = "https://transcripts.dj-dj.be/t/"+TSdata.time+"_"+TSdata.id+".html"
|
||||
//MAKE THIS COMPATIBLE WITH PREMIUM "customTranscriptUrl" IN FUTURE VERSIONS!!
|
||||
const url = "https://transcripts.dj-dj.be/v2/"+TSdata.time+"_"+TSdata.id+".html"
|
||||
|
||||
//calculate estimated time
|
||||
const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime())
|
||||
const dumpLoopTime = 15000
|
||||
const nextDump = new Date(lastDumpTime+dumpLoopTime)
|
||||
const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow
|
||||
//const lastDumpTime = (new Date(TSdata.estimated.lastdump).getTime())
|
||||
//const dumpLoopTime = 15000
|
||||
//const nextDump = new Date(lastDumpTime+dumpLoopTime)
|
||||
//const processtime = TSdata.estimated.processtime+6000 //6sec extra time for overflow
|
||||
|
||||
const finaltime = new Date(nextDump.getTime()+processtime)
|
||||
const duration = finaltime.getTime()-new Date().getTime()
|
||||
const duration = TSdata.estimated.waittime
|
||||
const finaltime = new Date(new Date().getTime()+duration)
|
||||
|
||||
//waiting
|
||||
if (tsconfig.sendTranscripts.enableChannel){
|
||||
@@ -148,5 +181,5 @@ module.exports = async (messages,guild,channel,user,reason) => {
|
||||
}
|
||||
}
|
||||
}
|
||||
asyncmanager(msglist)
|
||||
asyncmanager()
|
||||
}
|
||||
@@ -47,7 +47,7 @@ exports.createTranscript = async (messagecollection,channel,backup) => {
|
||||
})
|
||||
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)
|
||||
filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+", "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+"|"+msg.author.username+"] ["+msgstats+"]\n"+content+"\n"+filestring)
|
||||
})
|
||||
|
||||
if (filearray.length < 2) filearray.push("transcript is empty")
|
||||
|
||||
@@ -6,7 +6,7 @@ const l = bot.language
|
||||
//==================
|
||||
|
||||
//OTTicketOptions
|
||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: "red"|"green"|"blue"|"gray",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number} }} OTTicketOptions */
|
||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color: "red"|"green"|"blue"|"gray",adminroles: String[], readonlyAdminroles: String[], channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number}, ping:{"@here":Boolean, "@everyone":Boolean, custom:{enable:Boolean, roleId:String}} }} OTTicketOptions */
|
||||
|
||||
//OTRoleOptions
|
||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",enableDmOnOpen:Boolean}} OTRoleOptions */
|
||||
@@ -16,13 +16,13 @@ const l = bot.language
|
||||
|
||||
|
||||
//OTConfigMessage
|
||||
/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableThumbnail: boolean, thumbnail: string, enableCustomColor: boolean, color: string, options: string[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/
|
||||
/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableFooterImage: boolean, footerImage: string, enableThumbnail: boolean, thumbnail: string, enableImage: boolean, image: 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 */
|
||||
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, url:String, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number}, readonlyAdminroles: String[]}} OTAllOptions */
|
||||
|
||||
//StringOptions
|
||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"image"|"closedCategory"} OTTicketStringOptions */
|
||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"adminroles"|"channelprefix"|"category"|"message"|"enableDmOnOpen"|"ticketmessage"|"thumbnail"|"image"|"closedCategory"|"adminroles"|"autoclose"|"ping"} OTTicketStringOptions */
|
||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"color"|"roles"|"mode"|"enableDmOnOpen"} OTRoleStringOptions */
|
||||
/**@typedef {"id"|"name"|"description"|"icon"|"label"|"type"|"url"} OTWebsiteStringOptions */
|
||||
|
||||
|
||||
@@ -2,10 +2,13 @@ const discord = require("discord.js")
|
||||
const bot = require("../../index")
|
||||
const config = bot.config
|
||||
const l = bot.language
|
||||
const b = discord.ButtonStyle
|
||||
|
||||
/**@returns {"DANGER"|"SUCCESS"|"PRIMARY"|"SECONDARY"} */
|
||||
/**
|
||||
* @param {String} color
|
||||
* @returns {"DANGER"|"SUCCESS"|"PRIMARY"|"SECONDARY"} */
|
||||
const getColor = (color) => {
|
||||
const b = discord.ButtonStyle
|
||||
if (color){
|
||||
if (color.toLowerCase() == "red"){
|
||||
return b.Danger
|
||||
}else if (color.toLowerCase() == "green"){
|
||||
@@ -14,11 +17,12 @@ const getColor = (color) => {
|
||||
return b.Primary
|
||||
}else if (color.toLowerCase() == "black" || color.toLowerCase() == "gray" || color.toLowerCase() == "grey"){
|
||||
return b.Secondary
|
||||
}else if (color == "DANGER" || color == "SECONDARY" || color == "SUCCESS" || color == "PRIMARY"){
|
||||
}else if (color.toUpperCase() == "DANGER" || color.toUpperCase() == "SECONDARY" || color.toUpperCase() == "SUCCESS" || color.toUpperCase() == "PRIMARY"){
|
||||
return color
|
||||
}else if (color.toLowerCase() == "none" || color.toLowerCase() == "false" || color.toLowerCase() == ""){
|
||||
return b.Secondary
|
||||
}else return b.Secondary
|
||||
}else return b.Secondary
|
||||
}
|
||||
|
||||
const getOption = (id) => {
|
||||
|
||||
+16
-2
@@ -40,11 +40,25 @@ exports.createEmbed = (id) => {
|
||||
//create the embed
|
||||
const embed = new discord.EmbedBuilder()
|
||||
.setTitle(data.name)
|
||||
if (data.enableFooter) embed.setFooter({text:data.footer})
|
||||
|
||||
try {
|
||||
const footerimg = (data.enableFooter && data.enableFooterImage) ? data.footerImage : undefined
|
||||
if (data.enableFooter) embed.setFooter({text:data.footer,iconURL:footerimg})
|
||||
}catch{
|
||||
bot.errorLog.log("info","FOOTER FAILED TO LOAD, probably invalid url!")
|
||||
}
|
||||
|
||||
try {
|
||||
if (data.enableThumbnail) embed.setThumbnail(data.thumbnail)
|
||||
}catch{bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!")}
|
||||
}catch{
|
||||
bot.errorLog.log("info","THUMBNAIL FAILED TO LOAD, probably invalid url!")
|
||||
}
|
||||
|
||||
try {
|
||||
if (data.enableImage) embed.setImage(data.image)
|
||||
}catch{
|
||||
bot.errorLog.log("info","IMAGE FAILED TO LOAD, probably invalid url!")
|
||||
}
|
||||
|
||||
if (data.enableCustomColor){
|
||||
embed.setColor(data.color)
|
||||
|
||||
+29
-48
@@ -1,68 +1,49 @@
|
||||
const storage = require("../../index").storage
|
||||
|
||||
/**@typedef {{type:String,data:[{key:String,value:String}],status:Boolean}} hiddenData */
|
||||
/**@typedef {[{key:String,value:String}]} hiddenData */
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} messageContent
|
||||
* @param {String} channelid
|
||||
* @returns {hiddenData}
|
||||
*/
|
||||
|
||||
exports.readHiddenData = (messageContent) => {
|
||||
//ticketdata//type:123|userid:456)
|
||||
if (!messageContent.includes("[ ](OTDATA|")) return {type:"",data:[],status:false}
|
||||
const rawhidden = messageContent.split("[ ](OTDATA|")[1]
|
||||
const rawhidden2 = rawhidden.split("//")
|
||||
exports.readHiddenData = (channelid) => {
|
||||
const content = storage.get("HIDDENDATA",channelid)
|
||||
if (!content) return []
|
||||
|
||||
const datatype = rawhidden2[0]
|
||||
var rawhiddendata = rawhidden2[1]
|
||||
var rawhiddendataArray = rawhiddendata.split("")
|
||||
rawhiddendataArray.pop()
|
||||
|
||||
rawhiddendata = rawhiddendataArray.join("")
|
||||
|
||||
const splittedData = rawhiddendata.split("|")
|
||||
|
||||
const resultData = []
|
||||
splittedData.forEach((data) => {
|
||||
// type:123
|
||||
const dataresult = data.split(":")
|
||||
|
||||
resultData.push({key:dataresult[0],value:dataresult[1]})
|
||||
})
|
||||
|
||||
return {type:datatype,data:resultData,status:true}
|
||||
try {
|
||||
return JSON.parse(content)
|
||||
} catch {
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} type
|
||||
* @param {String} channelid
|
||||
* @param {[{key:String,value:String}]} data
|
||||
* @returns {String}
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
exports.writeHiddenData = (type,data) => {
|
||||
const dataValues = []
|
||||
data.forEach((d) => {
|
||||
dataValues.push(d.key+":"+d.value)
|
||||
})
|
||||
|
||||
const datastring = dataValues.join("|")
|
||||
|
||||
const result = "[ ](OTDATA|"+type+"//"+datastring+")"
|
||||
|
||||
return result
|
||||
exports.writeHiddenData = (channelid,data) => {
|
||||
try {
|
||||
storage.set("HIDDENDATA",channelid,JSON.stringify(data))
|
||||
return true
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} description
|
||||
* @returns {{description:String,hiddenData:hiddenData}}
|
||||
* @param {String} channelid
|
||||
* @returns {Boolean}
|
||||
*/
|
||||
exports.removeHiddenData = (description) => {
|
||||
if (!description.includes("[ ](OTDATA|")) return {description:description,hiddenData:[]}
|
||||
|
||||
const hiddenData = this.readHiddenData(description)
|
||||
const splitted = description.split("[ ](OTDATA")
|
||||
const original = splitted[0]
|
||||
|
||||
return {description:original,hiddenData:hiddenData}
|
||||
exports.deleteHiddenData = (channelid) => {
|
||||
try {
|
||||
storage.delete("HIDDENDATA",channelid)
|
||||
return true
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
+12
-10
@@ -46,7 +46,7 @@ const getLivestatus = (local) => {
|
||||
}
|
||||
}else{
|
||||
try {
|
||||
axios.get("https://livestatus.dj-dj.be/openticket.json").then((res) => {
|
||||
axios.get("https://apis.dj-dj.be/livestatus/announcements/openticket.json").then((res) => {
|
||||
const livestatus = res.data
|
||||
if (!Array.isArray(livestatus)) return resolve(false)
|
||||
if (!livestatus) return resolve(false)
|
||||
@@ -176,28 +176,30 @@ exports.liveStatusUploadManager = async (err) => {
|
||||
const result = await uploadLiveStatus({
|
||||
bot:{
|
||||
id:client.user.id,
|
||||
name:client.user.tag,
|
||||
name:client.user.username,
|
||||
pfp:client.user.displayAvatarURL()
|
||||
},
|
||||
error:err,
|
||||
openticket:{
|
||||
config:{
|
||||
messages:config.messages,
|
||||
options:config.options,
|
||||
transcripts:bot.tsconfig,
|
||||
system:config.system
|
||||
//TEMPORARY SOLUTION => AXIOS 414 ERROR!
|
||||
//messages:config.messages,
|
||||
//options:config.options,
|
||||
//transcripts:bot.tsconfig,
|
||||
//system:config.system
|
||||
},
|
||||
language:config.languageFile,
|
||||
version:require("../../package.json").version,
|
||||
version:"3.5.0",
|
||||
slashcmds:slashMode,
|
||||
transcripts:transcriptMode,
|
||||
plugins:fs.readdirSync("./plugins"),
|
||||
pluginload:globalPluginData
|
||||
},
|
||||
details:{
|
||||
errortime:new Date().getTime(),
|
||||
actions:this.actionRecorder,
|
||||
database:fs.readFileSync("./storage/database.json").toString()
|
||||
errortime:new Date().getTime()
|
||||
//TEMPORARY SOLUTION => AXIOS 414 ERROR!
|
||||
//actions:this.actionRecorder,
|
||||
//database:fs.readFileSync("./storage/database.json").toString()
|
||||
}
|
||||
})
|
||||
if (!result){
|
||||
|
||||
@@ -12,12 +12,12 @@ const storage = bot.storage
|
||||
* @param {String} guildid
|
||||
* @returns {Boolean} has permissions?
|
||||
*/
|
||||
exports.command = (memberid,guildid) => {
|
||||
exports.global = (memberid,guildid) => {
|
||||
bot.actionRecorder.push({
|
||||
category:"ot.managers.permissionChecker",
|
||||
file:"./core/permissionChecker.js",
|
||||
time:new Date().getTime(),
|
||||
type:"command"
|
||||
type:"global"
|
||||
})
|
||||
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
|
||||
if (config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
|
||||
@@ -25,6 +25,33 @@ exports.command = (memberid,guildid) => {
|
||||
}else {return true}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {String} memberid
|
||||
* @param {String} guildid
|
||||
* @param {String} optionid
|
||||
* @returns {Boolean} has permissions?
|
||||
*/
|
||||
exports.ticket = (memberid,guildid,optionid) => {
|
||||
bot.actionRecorder.push({
|
||||
category:"ot.managers.permissionChecker",
|
||||
file:"./core/permissionChecker.js",
|
||||
time:new Date().getTime(),
|
||||
type:"ticket"
|
||||
})
|
||||
|
||||
const option = config.options.find((opt) => opt.id == optionid)
|
||||
const ticketadmins = option && option.adminroles ? option.adminroles : []
|
||||
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
|
||||
|
||||
const isGlobalAdmin = config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)})
|
||||
const isTicketAdmin = ticketadmins.some((item)=>{return permsmember.roles.cache.has(item)})
|
||||
const hasAdministrator = permsmember.permissions.has("Administrator")
|
||||
const hasManageGuild = permsmember.permissions.has("ManageGuild")
|
||||
|
||||
return isGlobalAdmin || isTicketAdmin || hasAdministrator || hasManageGuild
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {discord.User} user
|
||||
|
||||
@@ -17,22 +17,19 @@
|
||||
|
||||
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?
|
||||
|
||||
Open Ticket is an open-source community project!
|
||||
Because of this, almost 80% of all features in OT were ideas from our community!
|
||||
Feel free to add new ideas in our discord server
|
||||
or via github issues! Translations are always welcome!
|
||||
|
||||
|
||||
INFORMATION:
|
||||
============
|
||||
Open Ticket v3.3.1 - © DJdj Development
|
||||
Open Ticket v3.5.0 - © DJdj Development
|
||||
|
||||
discord: https://discord.dj-dj.be
|
||||
website: https://www.dj-dj.be
|
||||
github: https://openticket.dj-dj.be
|
||||
github: https://otgithub.dj-dj.be
|
||||
support e-mail: support@dj-dj.be
|
||||
|
||||
Config files:
|
||||
@@ -60,6 +57,7 @@ exports.client = client
|
||||
client.setMaxListeners(50)
|
||||
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client")
|
||||
|
||||
//LOAD CONFIG
|
||||
var tempconfig = require("./config.json")
|
||||
/**@type {Boolean} */
|
||||
var isDevConfig = false
|
||||
@@ -75,31 +73,34 @@ if (process.argv.some((v) => v == "--devconfig")){
|
||||
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded flags")
|
||||
|
||||
exports.developerConfig = isDevConfig
|
||||
|
||||
const config = tempconfig
|
||||
exports.config = config
|
||||
|
||||
const tsconfig = isDevConfig ? require("./devtsconfig.json") : require("./transcriptconfig.json")
|
||||
exports.tsconfig = tsconfig
|
||||
|
||||
//LOAD LANGUAGE
|
||||
const language = require("./core/languageManager").language
|
||||
exports.language = language
|
||||
|
||||
//LOAD FLAGS
|
||||
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 config")
|
||||
exports.storage = require('./core/dynamicdatabase/storage')
|
||||
exports.storage = require('./core/dynamicdatabase/storage').main
|
||||
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage")
|
||||
|
||||
exports.statsStorage = require('./core/dynamicdatabase/storage').stats
|
||||
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded stats storage")
|
||||
|
||||
exports.errorLog = require("./core/errorLogSystem")
|
||||
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")
|
||||
this.errorLog.log("debug","loaded new logs")
|
||||
|
||||
//LOAD SYSTEM LIBRARYS
|
||||
exports.actionRecorder = require("./core/utils/liveStatus").actionRecorder
|
||||
|
||||
exports.hiddenData = require("./core/utils/hiddendata")
|
||||
this.errorLog.log("debug","loaded hiddendataTM")
|
||||
|
||||
exports.embeds = {
|
||||
commands:require("./core/interactionHandlers/embeds/commands")
|
||||
}
|
||||
@@ -110,6 +111,10 @@ exports.buttons = {
|
||||
}
|
||||
this.errorLog.log("debug","loaded buttons & embeds")
|
||||
|
||||
exports.statsManager = require("./core/statsManager")
|
||||
this.statsManager.startupStatsManager()
|
||||
|
||||
//START CLIENT LOGIN PROCESS
|
||||
client.on('ready',async () => {
|
||||
this.errorLog.log("debug","client logged in")
|
||||
this.actionRecorder.push({
|
||||
@@ -118,17 +123,19 @@ client.on('ready',async () => {
|
||||
time:new Date().getTime(),
|
||||
type:"client.loggedin.success"
|
||||
})
|
||||
var statusSet = false
|
||||
const setStatus = (type,text) => {
|
||||
if (statusSet == true) return
|
||||
const getTypeEnum = (text) => {
|
||||
if (text.toLowerCase() == "playing") return discord.ActivityType.Playing
|
||||
else if (text.toLowerCase() == "listening") return discord.ActivityType.Listening
|
||||
else if (text.toLowerCase() == "watching") return discord.ActivityType.Watching
|
||||
const getTypeEnum = (type) => {
|
||||
if (type.toLowerCase() == "playing") return discord.ActivityType.Playing
|
||||
else if (type.toLowerCase() == "listening") return discord.ActivityType.Listening
|
||||
else if (type.toLowerCase() == "watching") return discord.ActivityType.Watching
|
||||
else if (type.toLowerCase() == "custom") return discord.ActivityType.Custom
|
||||
else return discord.ActivityType.Listening
|
||||
}
|
||||
client.user.setActivity(text,{type:getTypeEnum(type)})
|
||||
statusSet = true
|
||||
client.user.setActivity({
|
||||
type:getTypeEnum(type),
|
||||
state:(text.toLowerCase() == "custom") ? text : undefined,
|
||||
name:text
|
||||
})
|
||||
}
|
||||
this.errorLog.log("debug","bot status loaded")
|
||||
this.actionRecorder.push({
|
||||
@@ -226,7 +233,7 @@ client.on('ready',async () => {
|
||||
}
|
||||
}
|
||||
|
||||
//load plugins
|
||||
//LOAD PLUGINS (after client login)
|
||||
this.actionRecorder.push({
|
||||
category:"ot.managers.plugins",
|
||||
file:"./core/api/pluginlauncher.js",
|
||||
@@ -242,6 +249,8 @@ client.on('ready',async () => {
|
||||
})
|
||||
this.errorLog.log("debug","loading plugins")
|
||||
})
|
||||
|
||||
//LOAD CHECKER.JS
|
||||
if (!require("./core/api/api.json").disable.checkerjs.all){
|
||||
this.actionRecorder.push({
|
||||
category:"ot.managers.main",
|
||||
@@ -260,6 +269,7 @@ if (!require("./core/api/api.json").disable.checkerjs.all){
|
||||
})
|
||||
}
|
||||
|
||||
//LOAD COMMANDS & CORE
|
||||
if (process.argv[2] && process.argv[2].startsWith("slash")){
|
||||
//do nothing
|
||||
}else{
|
||||
@@ -283,6 +293,8 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){
|
||||
require("./commands/claim")()
|
||||
require("./commands/unclaim")()
|
||||
require("./commands/change")()
|
||||
require("./commands/stats")()
|
||||
|
||||
this.actionRecorder.push({
|
||||
category:"ot.managers.loader",
|
||||
file:"./index.js",
|
||||
@@ -314,6 +326,7 @@ if (process.argv[2] && process.argv[2].startsWith("slash")){
|
||||
})
|
||||
}
|
||||
|
||||
//LOAD API
|
||||
this.actionRecorder.push({
|
||||
category:"ot.managers.loader",
|
||||
file:"./index.js",
|
||||
@@ -331,6 +344,7 @@ this.actionRecorder.push({
|
||||
type:"api.success"
|
||||
})
|
||||
|
||||
//ERROR SYSTEM
|
||||
this.actionRecorder.push({
|
||||
category:"ot.managers.loader",
|
||||
file:"./index.js",
|
||||
@@ -370,7 +384,9 @@ process.on("uncaughtException",async (error,origin) => {
|
||||
APIEvents.onError(error.name+": "+error.message,new Date())
|
||||
|
||||
//TEMPORARY INTEGRATION FOR LIVESTATUS ERROR UPLOADER:
|
||||
try {
|
||||
await require("./core/utils/liveStatus").liveStatusUploadManager(error.name+": "+error.message+" | origin: "+origin+"\n"+error.stack)
|
||||
} catch {this.errorLog.log("info","FAILED TO AUTO-REPORT ERROR! (you can ignore this error)")}
|
||||
})
|
||||
|
||||
this.actionRecorder.push({
|
||||
@@ -380,6 +396,7 @@ this.actionRecorder.push({
|
||||
type:"debugsystem.success"
|
||||
})
|
||||
|
||||
//LOGIN SYSTEM
|
||||
const token = config.token.fromENV ? process.env.TOKEN : config.token.value
|
||||
client.login(token)
|
||||
this.errorLog.log("debug","login with token")
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"ChilledBroke#9986 & M4#5882",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors": {
|
||||
"missingArgsTitle": "قيمة غير صالحة!",
|
||||
"missingArgsDescription": "قيمة مفقودة",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Please wait!",
|
||||
"estimated":"Estimated time",
|
||||
"available":"The transcript is available here"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"DJdj Development",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Invalid Arguments!",
|
||||
"missingArgsDescription":"Missing Argument",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Please wait!",
|
||||
"estimated":"Estimated time",
|
||||
"available":"The transcript is available here"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
+88
-51
@@ -1,55 +1,58 @@
|
||||
{
|
||||
"_CREDITS":"spyeye_",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Neplatny Argument!",
|
||||
"missingArgsTitle":"Neplatný Argument!",
|
||||
"missingArgsDescription":"Chybí Argument",
|
||||
"noPermsTitle":"Nemáš práva!",
|
||||
"noPermsDescription":"Potřebujes `ADMINISTRATOR`roli nebo byt v listině povolenych roli!",
|
||||
"noPermsDelete":"Pouze Admini muůřou mazat ticket!",
|
||||
"chooseFromListTitle":"Neplatný ID",
|
||||
"noPermsTitle":"K tomuto nemáš práva!",
|
||||
"noPermsDescription":"Potřebuješ `ADMINISTRATOR`roli nebo být na seznamu povolených rolí!",
|
||||
"noPermsDelete":"Pouze Admin může vymazat ticket!",
|
||||
"chooseFromListTitle":"Neplatné ID",
|
||||
"chooseFromListDescription":"Vyber si jedno z ID níže:",
|
||||
"boterror":"Bot Chyba!",
|
||||
"boterror":"Chyba Bota!",
|
||||
"notInTicketTitle":"Nejsi v ticketu!",
|
||||
"notInTicketDescription":"Tenhle příkaz nefunguje mimo ticket!",
|
||||
"ticketDoesntExist":"Tenhle ticket už neexistuje !",
|
||||
"roleDoesntExist":"Tenhle role už neexistuje!",
|
||||
"anotherOption":"This option is not a ticket but another type!",
|
||||
"maxAmountTitle":"Max počet byl dosáhnut!",
|
||||
"maxAmountDescription":"Dosáhl jsi max počet povolených ticketu!\nSo nemůžeš si vytvořit nový!",
|
||||
"somethingWentWrong":"**Něco se pokazilo!**\nProsím zkus to jindy!"
|
||||
"notInTicketDescription":"Tento příkaz nefunguje mimo ticket!",
|
||||
"ticketDoesntExist":"Tento ticket už neexistuje!",
|
||||
"roleDoesntExist":"Tato role už neexistuje!",
|
||||
"anotherOption":"Tato možnost není ticket, ale jiná!",
|
||||
"maxAmountTitle":"Byl dosáhnut maximální počet",
|
||||
"maxAmountDescription":"Dosáhl jsi maximální počet povolených ticketů!\nTaže si nemůžeš vytvořit nový.",
|
||||
"somethingWentWrong":"**Něco se pokazilo!**\nProsíme zkuste to později!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"Přidat {0} do tohohle ticketu!",
|
||||
"userRemovedTitle":"Odstranit {0} z tohohle ticketu!",
|
||||
"renameTitle":"Změnit jmeno na {0}!",
|
||||
"closeTitle":"Zavři tenhle ticket!",
|
||||
"deleteTitle":"Mažu ticket...",
|
||||
"reopenTitle":"Znovu otevíram ticket",
|
||||
"userAddedTitle":"Přidat {0} do tohoto ticketu.",
|
||||
"userRemovedTitle":"Odstranit {0} z tohoto ticketu.",
|
||||
"renameTitle":"Změnit jméno na {0}!",
|
||||
"closeTitle":"Uzavřít tento ticket!",
|
||||
"deleteTitle":"Probíhá vymazání ticketu...",
|
||||
"reopenTitle":"Ticket byl znovu otevřen",
|
||||
|
||||
"claimTitle":"Ticket nyní převzal {0}",
|
||||
"unclaimTitle":"Ticket už není převzaný",
|
||||
"changeTitle":"Změněn typ ticketu {0}!",
|
||||
"unclaimTitle":"Ticket není nadále převzaný",
|
||||
"changeTitle":"Typ ticketu byl změněn {0}!",
|
||||
|
||||
"statsTitle":"Tady je info o ticketu {0}!",
|
||||
"statsTitle":"Zde jsou informace 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!",
|
||||
"autocloseRejectTitle":"Tento ticket již nebude automaticky uzavřen!",
|
||||
"autocloseWarn":"Tato možnost uzavře pouze neaktivní tickety!",
|
||||
|
||||
"goToTicket":"běž do ticketu",
|
||||
"ticketWarning":"The embed is in the message below!",
|
||||
"maxTicketWarning":"**Warning:** _Můžeš vytvořit pouze {0} v tuhle chvíli!_"
|
||||
"goToTicket":"Jít do ticketu",
|
||||
"ticketWarning":"Embed se náchází pod touto zprávou.",
|
||||
"maxTicketWarning":"**Warning:** _V tuto chvíli můžeš vytvořit pouze {0} ticketů_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Dostupné příkazy:",
|
||||
"header1":"**Běž do {0} pro vytvoření ticketi!**\n\n",
|
||||
"header2":"**Použíj příkaz `/nový` nebo `/ticket` pro vytvoření ticketu**\n\n",
|
||||
"title":"Zde jsou všechny dostupné příkazy:",
|
||||
"header1":"**Pro vytvoření ticketu bež do {0} **\n\n",
|
||||
"header2":"**Použíj příkaz `/nový` nebo `/ticket` pro vytvoření nového ticketu**\n\n",
|
||||
|
||||
"msgCmd":"Vytvoř embed s tlačíky. (admins only)",
|
||||
"renameCmd":"Přejmenovat ticket. (no spaces)",
|
||||
"msgCmd":"Vytvoř embed s tlačíky. (Pouze Admin)",
|
||||
"renameCmd":"Přejmenovat ticket. (Bez mezer)",
|
||||
"closeCmd":"Zavřít ticket.",
|
||||
"deleteCmd":"Odstranit ticket.",
|
||||
"addCmd":"Pridat uživatele do ticketu.",
|
||||
"removeCmd":"Odebrat uživatele z ticketu.",
|
||||
"reopenCmd":"Re-Open a ticket after it was closed.",
|
||||
"reopenCmd":"Znovu otevře ticket, který byl uzavřen.",
|
||||
"changeCmd":"Změnit typ ticketu.",
|
||||
"claimCmd":"Převzi ticket.",
|
||||
"unclaimCmd":"Uvolnit ticket.",
|
||||
@@ -57,42 +60,76 @@
|
||||
"autocloseCmd":"Nastavit automatické uzavření ticketu"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"Zavřit ticket",
|
||||
"close":"Uzavřít ticket",
|
||||
"delete":"Vymazat ticket",
|
||||
"reopen":"Znovu otevřít ticket",
|
||||
"closeWithReason":"zavřít s důvodem"
|
||||
"closeWithReason":"Zzavřít s důvodem"
|
||||
},
|
||||
"messages":{
|
||||
"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!*",
|
||||
"closedDescription":"Zde mohou psát pouze Admin uživatelé\n\n*Klikni na tlačítko níže pro smazání nebo pro znovu otevření tohoto ticketu!*",
|
||||
"createdTitle":"Ticket otevřen!",
|
||||
"createdDescription":"Tvůj ticket je vytvořem, můžeš si ho všimnout pomocí pingu!",
|
||||
|
||||
"newTicketDmTitle":"Nový ticket!",
|
||||
"closedTicketDmTitle":"Ticket Zavřený!",
|
||||
"deletedTicketDmTitle":"Ticket Odstranen!",
|
||||
"closedTicketDmDescription":"Tvuj ticket je uzavřen!",
|
||||
"deletedTicketDmDescription":"Tvuj ticket byl smazan!",
|
||||
"closedTicketDmTitle":"Ticket byl Uzavřen!",
|
||||
"deletedTicketDmTitle":"Ticket byl Odstraněn!",
|
||||
"closedTicketDmDescription":"Tvůj ticket je uzavřen!",
|
||||
"deletedTicketDmDescription":"Tvůj ticket byl vymazán!",
|
||||
"reopenTicketDmTitle":"Ticket je znovu otevřený!",
|
||||
"reopenTicketDmDescription":"Tvuj ticket byl znovu ovetřený!",
|
||||
|
||||
"chooseCategory":"Vyber si kategorii:",
|
||||
"gettingdeleted":"Ticket bude vymazan...",
|
||||
"gettingdeleted":"Ticket bude vymazán...",
|
||||
|
||||
"none":"žádný",
|
||||
"reason":"důvod",
|
||||
"createdat":"otevřeno v",
|
||||
"openedby":"otevřel",
|
||||
"deletedby":"smazano uzivatelem",
|
||||
"closedby":"zavreno uzivatelem",
|
||||
"none":"Žádný",
|
||||
"reason":"Důvod",
|
||||
"createdat":"Otevřeno v",
|
||||
"openedby":"Otevřel",
|
||||
"deletedby":"Vymázáno uživatelem",
|
||||
"closedby":"Uzavřeno uživatelem",
|
||||
|
||||
"modalreason":"Jakž byl důvod k zavření toho ticketu?",
|
||||
"chooseATicket": "Vyber ticket"
|
||||
"modalreason":"Zde napiš důvod uzavření tohoto ticketu.",
|
||||
"chooseATicket": "Vyber si ticket"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Přepis",
|
||||
"processed":"Tento přepis se zpracoval",
|
||||
"title":"Záznam",
|
||||
"processed":"Tento záznam byl zpracován",
|
||||
"wait":"Prosím počkej!",
|
||||
"estimated":"Odhadovaný čas",
|
||||
"available":"Záloha je uložena zde!"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Globalní statistiky",
|
||||
"ticketTitle":"Statistiky ticketů pro {0}",
|
||||
"userTitle":"Statistiky uživatele {0}",
|
||||
"systemTitle":"Systémové statistiky",
|
||||
"versionTitle":"Verze bota",
|
||||
|
||||
"ticketsCreated":"Ticket založen",
|
||||
"ticketsClosed":"Ticket uzavřen",
|
||||
"ticketsDeleted":"Ticket vymazán",
|
||||
"ticketsReopened":"Ticket znovu otevřen",
|
||||
"ticketsAutoclosed":"Ticket byl automaticky uzavřen",
|
||||
"transcriptsCreated":"Transcripty vytvořeny",
|
||||
"startupDate":"Datum spuštění",
|
||||
"latestUpdate":"Poslední aktualizace",
|
||||
"ticketCreatedOn":"Ticket vytvořen dne",
|
||||
"ticketCreatedBy":"Ticket vytvořil",
|
||||
"messagesSent":"Zpráva odeslána",
|
||||
"status":"Status",
|
||||
"participants":"Účastníci",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Uživatel",
|
||||
"open":"Otevřít",
|
||||
"reopened":"Znovu Otevřít",
|
||||
"closed":"Uzavřít",
|
||||
"autoclosed":"Automaticky uzavřen"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Tento uživatel není v databázi statistik k nalezení!"
|
||||
}
|
||||
}
|
||||
+38
-1
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"the_gamer#5095",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors": {
|
||||
"missingArgsTitle": "Ugyldigt Argument!",
|
||||
"missingArgsDescription": "Manglende Argument",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait": "Vent venligst!",
|
||||
"estimated": "Estimeret tid",
|
||||
"available": "Transcriptet er tilgængelig her"
|
||||
}
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Globale Statestikker",
|
||||
"ticketTitle":"Ticket Statestikker tilhørende: {0}",
|
||||
"userTitle":"Bruger Statestikker tilhørende: {0}",
|
||||
"systemTitle":"System Statestikker",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Oprettet",
|
||||
"ticketsClosed":"Tickets Lukket",
|
||||
"ticketsDeleted":"Tickets Slettet",
|
||||
"ticketsReopened":"Tickets Genåbnet",
|
||||
"ticketsAutoclosed":"Tickets Autolukket",
|
||||
"transcriptsCreated":"Transcripts Oprettet",
|
||||
"startupDate":"Startup Dato",
|
||||
"latestUpdate":"Seneste Opdatering",
|
||||
"ticketCreatedOn":"Ticket Oprettet Den",
|
||||
"ticketCreatedBy":"Ticket Oprettet Af",
|
||||
"messagesSent":"Beskeder sendt",
|
||||
"status":"Status",
|
||||
"participants":"Deltagere",
|
||||
"role":"Rolle",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Medlem",
|
||||
"open":"Åben",
|
||||
"reopened":"Genåbnet",
|
||||
"closed":"Lukket",
|
||||
"autoclosed":"Autolukket"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Denne bruger kan ikke findes i statestik databasen!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"DJj123dj#1706",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Onjuiste parameters!",
|
||||
"missingArgsDescription":"Er missen parameters",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Gelieve te wachten!",
|
||||
"estimated":"Geschatte tijd",
|
||||
"available":"Het transcript is hier beschikbaar"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Globale Stats",
|
||||
"ticketTitle":"Ticket Stats voor {0}",
|
||||
"userTitle":"User Stats voor {0}",
|
||||
"systemTitle":"Systeem Stats",
|
||||
"versionTitle":"Bot Versie",
|
||||
|
||||
"ticketsCreated":"Tickets Gemaakt",
|
||||
"ticketsClosed":"Tickets Gesloten",
|
||||
"ticketsDeleted":"Tickets Verwijderd",
|
||||
"ticketsReopened":"Tickets Heropend",
|
||||
"ticketsAutoclosed":"Tickets Auto-gesloten",
|
||||
"transcriptsCreated":"Transcripts Gemaakt",
|
||||
"startupDate":"Opstart Datum",
|
||||
"latestUpdate":"Laatste Update",
|
||||
"ticketCreatedOn":"Ticket Gemaakt Op",
|
||||
"ticketCreatedBy":"Ticket Gemaakt Door",
|
||||
"messagesSent":"Berichten Verzonden",
|
||||
"status":"Status",
|
||||
"participants":"Deelnemers",
|
||||
"role":"Rol",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Globale Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Heropend",
|
||||
"closed":"Gesloten",
|
||||
"autoclosed":"Auto-gesloten"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Deze user kan niet in de database gevonden worden!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"DJdj Development",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Invalid Arguments!",
|
||||
"missingArgsDescription":"Missing Argument",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Please wait!",
|
||||
"estimated":"Estimated time",
|
||||
"available":"The transcript is available here"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"Sanke#6086",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Arguments invalides!",
|
||||
"missingArgsDescription":"Argument manquant",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"S'il vous plait, attendez...",
|
||||
"estimated":"Temps estime:",
|
||||
"available":"La transcript est disponible ici"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Statistiques mondiales",
|
||||
"ticketTitle":"Statistiques des tickets pour {0}",
|
||||
"userTitle":"Statistiques utilisateur pour {0}",
|
||||
"systemTitle":"Statistiques du système",
|
||||
"versionTitle":"Version du bot",
|
||||
|
||||
"ticketsCreated":"Tickets créés",
|
||||
"ticketsClosed":"Tickets fermés",
|
||||
"ticketsDeleted":"Tickets supprimés",
|
||||
"ticketsReopened":"Tickets rouverts",
|
||||
"ticketsAutoclosed":"Tickets fermés automatiquement",
|
||||
"transcriptsCreated":"Transcriptions créées",
|
||||
"startupDate":"Date de démarrage du bot",
|
||||
"latestUpdate":"Dernière mise à jour",
|
||||
"ticketCreatedOn":"Ticket créé le",
|
||||
"ticketCreatedBy":"Ticket créé par",
|
||||
"messagesSent":"Messages envoyés",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Administrateur global",
|
||||
"ticketAdmin":"Administrateur des Tickets",
|
||||
"member":"Membre",
|
||||
"open":"Ouvrir",
|
||||
"reopened":"Rouvert",
|
||||
"closed":"Fermée",
|
||||
"autoclosed":"fermeture automatique"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Cet utilisateur est introuvable dans la base de données de statistiques!"
|
||||
}
|
||||
}
|
||||
|
||||
+38
-1
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"david.#8276 ",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Ungültiges Argument!",
|
||||
"missingArgsDescription":"Fehlendes Argument!",
|
||||
@@ -36,7 +39,7 @@
|
||||
|
||||
"goToTicket":"Geh zu deinem Ticket",
|
||||
"ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!",
|
||||
"maxTicketWarning":"**Warnung:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_"
|
||||
"maxTicketWarning":"**Warnung:** _Es können maximal {0} Tickets zur gleichen Zeit geöffnet sein!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Hilfe Menu:",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Bitte warten!",
|
||||
"estimated":"Verbleibende Zeit",
|
||||
"available":"Das Transcript ist hier verfügbar"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats für {0}",
|
||||
"userTitle":"NutzerStats für {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets erstellt",
|
||||
"ticketsClosed":"Tickets geschlossen",
|
||||
"ticketsDeleted":"Tickets gelöscht",
|
||||
"ticketsReopened":"Tickets wiedergeöffnet",
|
||||
"ticketsAutoclosed":"Tickets Autogeschlossen",
|
||||
"transcriptsCreated":"Transcripts erstellt",
|
||||
"startupDate":"Start Datum",
|
||||
"latestUpdate":"Letztes Update",
|
||||
"ticketCreatedOn":"Ticket erstellt am",
|
||||
"ticketCreatedBy":"Ticket erstellt von",
|
||||
"messagesSent":"Nachrichten gesendet",
|
||||
"status":"Status",
|
||||
"participants":"Teilnehmer",
|
||||
"role":"Rolle",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Nutzer",
|
||||
"open":"Öffnen",
|
||||
"reopened":"Wiedergeöffnet",
|
||||
"closed":"Geschlossen",
|
||||
"autoclosed":"Autogeschlossen"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Der Nutzer wurde in der Statistik-Datenbank nicht gefunden!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"_CREDITS":"ꙅoᴎɒᎸɘƚꙅ#3744",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Invalid Arguments!",
|
||||
"missingArgsDescription":"Missing Argument",
|
||||
"noPermsTitle":"Δεν έχεις άδεια για να τρέξεις αυτή την εντολή!",
|
||||
"noPermsDescription":"Χρειάζεσε άδεια διαχειριστή για να τρέξεις αυτή την εντολή.",
|
||||
"noPermsDelete":"Μόνο οι διαχειριστές μπορούν να διαγράψουν τα εισιτήρια!",
|
||||
"chooseFromListTitle":"Μη έγκυρο id.",
|
||||
"chooseFromListDescription":"Διάλεξε ενα απο τα παρακάτω id:",
|
||||
"boterror":"Υπάρχει κάποιο πρόβλημα!",
|
||||
"notInTicketTitle":"Δεν είσε στο κανάλι του εισιτηρίου!",
|
||||
"notInTicketDescription":"Δεν μπορείς να τρέξεις αυτή την εντολή εκτός του εισιτηρίου",
|
||||
"ticketDoesntExist":"Αυτο το εισιτήριο δεν υπάρχει!",
|
||||
"roleDoesntExist":"Αυτός ο ρόλος δεν υπάρχει!",
|
||||
"anotherOption":"Διάλεξε άλλο λόγο για εισιτήριο!",
|
||||
"maxAmountTitle":"Έχεις ανοίξει πολλά εισιτήρια για την ώρα.",
|
||||
"maxAmountDescription":"Έχεις υπερβεί το όριο των εισιτηρίον!\nΔεν μπορείς να ανοίξεις καινούργιο.!",
|
||||
"somethingWentWrong":"**Κάτι πήγε λάθος!**\nΔοκίμασε ξανά αργότερα!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"Ο {0} προσθέθηκε στο εισιτήριο",
|
||||
"userRemovedTitle":"Ο {0} αφαιρέθηκε απο το εισιτήριο!",
|
||||
"renameTitle":"Το όνομα άλλαξε σε {0}!",
|
||||
"closeTitle":"Το εισιτήριο έκλεισε!",
|
||||
"deleteTitle":"Διαγράφω το εισιτήριο...",
|
||||
"reopenTitle":"Το εισιτήριο ξανά άνοιξε!",
|
||||
|
||||
"claimTitle":"Το εισιτήριο διεκδικήθεικε απο τον {0}",
|
||||
"unclaimTitle":"Το εισιτήριο δεν είναι πλέον διεκδικημένο!",
|
||||
"changeTitle":"Ο τύπος του εισιτηρίου άλλαξε σε {0}!",
|
||||
|
||||
"statsTitle":"Εδώ είναι τα στατιστικά για το {0}!",
|
||||
"autocloseTitle":"Αυτό το εισιτήριο θα κλείσε σε {0}!",
|
||||
"autocloseRejectTitle":"Αυτό το εισιτήριο δεν θα κλέισε αυτόματα!",
|
||||
"autocloseWarn":"Αυτό ισχύει μονο για μή ενεργά εισιτήρια!",
|
||||
|
||||
"goToTicket":"Μεταφορά στο εισιτήριο.",
|
||||
"ticketWarning":"Το εισιτήριο είναι στο παρακάτω μήνυμα!",
|
||||
"maxTicketWarning":"**Προειδοποίηση:** _Μπορείς να φτιάξεις μόνο {0} εισιτήριο/εισιτήρια για την ώρα!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Διαθέσιμες εντολές:",
|
||||
"header1":"**Πηγαινε στο {0} για να φτιάξεις ενα νέο εισιτήριο!**\n\n",
|
||||
"header2":"**Τρέχα την εντολή `/new` ή `/ticket` για να φτιάξεις ένα εισιτήριο!**\n\n",
|
||||
|
||||
"msgCmd":"Εμφάνισε ένα embed με κουμπιά. (admins only)",
|
||||
"renameCmd":"Μετονόμασε το εισιτήριο. (όχι κενά)",
|
||||
"closeCmd":"Κλέισε το εισιτήριο.",
|
||||
"deleteCmd":"Διέγραψε το εισιτήριο.",
|
||||
"addCmd":"Πρόσθεσε κάποιον στο εισιτήριο.",
|
||||
"removeCmd":"Αφαίρεσε κάποιον απο το εισιτήριο.",
|
||||
"reopenCmd":"Ξανά άνοιξε το εισιτήριο.",
|
||||
"changeCmd":"Άλλαξε τον τύπο του εισιτηρίου.",
|
||||
"claimCmd":"Διεκδίκησε το εισιτήριο.",
|
||||
"unclaimCmd":"Unclaim a ticket.",
|
||||
"statsCmd":"Δές τα στατιστικά του εισιτηρίου.",
|
||||
"autocloseCmd":"Βάλε χρονόμετρο για να κλείσει το εισιτήριο"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"κλείσε το εισιτήριο",
|
||||
"delete":"Διέγραψε το εισιτήριο",
|
||||
"reopen":"Ξανά άνοιξε το εισιτήριο",
|
||||
"closeWithReason":"Κλείσε με αιτιολόγιση"
|
||||
},
|
||||
"messages":{
|
||||
"closedDescription":"Μονο οι διαχειριστές μπορουν να διαγράψουν τα εισιτήρια!\n\n*Πάτα το παρακάτω κουμπί για να ξανά ανοίξεις το εισιτήριο!*",
|
||||
"createdTitle":"Το εισιτήριο δημιουργήθηκε!",
|
||||
"createdDescription":"Το εισιτήριο σου δημιουργήθηκε μπορείς να το βρείς με την αναφορά που έγινε στο κανάλι του εισιτηρίου!",
|
||||
|
||||
"newTicketDmTitle":"Νέο εισιτήριο!",
|
||||
"closedTicketDmTitle":"Το εισιτήριο έκλεισε!",
|
||||
"deletedTicketDmTitle":"Tο εισιτήριο διεγράφη!",
|
||||
"closedTicketDmDescription":"Το εισιτήριο σου είναι κλειστό!",
|
||||
"deletedTicketDmDescription":"Το εισιτήριο σου διεγράφη!",
|
||||
"reopenTicketDmTitle":"Tο εισιτήριο ξανά άνοιξε!",
|
||||
"reopenTicketDmDescription":"Το εισιτήριο σου ξανά άνοιξε!",
|
||||
|
||||
"chooseCategory":"Διάλεξε μία κατηγορία:",
|
||||
"gettingdeleted":"Το εισιτήριο διαγράφεται...",
|
||||
|
||||
"none":"Κανένας",
|
||||
"reason":"Λόγος",
|
||||
"createdat":"Δημιουργήθηκε",
|
||||
"openedby":"Ανοίχτηκε από",
|
||||
"deletedby":"Διεγράφη απο",
|
||||
"closedby":"Έκλεισε από",
|
||||
|
||||
"modalreason":"Γιατι να κλείσει το εισιτήριο?",
|
||||
"chooseATicket": "Δίαλεξε ενα εισιτήριο"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Αντίγραφο",
|
||||
"processed":"Το αντίγραφο ετοιμάζεται!",
|
||||
"wait":"Παρακαλώ περιμένετε!",
|
||||
"estimated":"Ώρα αναμονής",
|
||||
"available":"Το αντίγραφο είναι ανοιχτώ εδώ!"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"_CREDITS":"Snowy",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Hibás paraméterek!",
|
||||
"missingArgsDescription":"Hiányzó paraméterek",
|
||||
"noPermsTitle":"Nincs jogosultságod!",
|
||||
"noPermsDescription":"Szükséged van az `Adminisztrátor` jogra, vagy rajta kell lenned az engedélyezett rangok listáján!",
|
||||
"noPermsDelete":"Csak adminok törölhetik a ticketet!",
|
||||
"chooseFromListTitle":"Ismeretlen ID",
|
||||
"chooseFromListDescription":"Válassz egy ID-t az alábbi listából:",
|
||||
"boterror":"Bot Hiba!",
|
||||
"notInTicketTitle":"Nem vagy egy ticketben!",
|
||||
"notInTicketDescription":"Ez a parancs nem működik a ticketeken kívűl!",
|
||||
"ticketDoesntExist":"Ez a ticket már nem létezik!",
|
||||
"roleDoesntExist":"Ez a rang már nem létezik!",
|
||||
"anotherOption":"Ez a választás nem egy ticket, hanem más!",
|
||||
"maxAmountTitle":"Maximum limit elérve!",
|
||||
"maxAmountDescription":"Elérted a maximum engedélyezett ticketek számát!\nSzóval nem tudsz újat csinálni!",
|
||||
"somethingWentWrong":"**Valami balul sült el!**\nKérlek próbáld újra később!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"{0} hozzáadva a tickethez!",
|
||||
"userRemovedTitle":"{0} elvéve a ticketből!",
|
||||
"renameTitle":"Ticket neve megváltoztatva erre: {0}!",
|
||||
"closeTitle":"Ticket bezárva!",
|
||||
"deleteTitle":"Ticket törlése...",
|
||||
"reopenTitle":"Ticket újranyitva!",
|
||||
|
||||
"claimTitle":"A ticketet igényelte: {0}",
|
||||
"unclaimTitle":"Már senki nem ingényeli a ticketet!",
|
||||
"changeTitle":"Ticket típus megváltoztatva erre: {0}!",
|
||||
|
||||
"statsTitle":"Ticket statisztikák erre: {0}!",
|
||||
"autocloseTitle":"Ez a ticket automatikusan be lesz zárva ennyi idő múlva: {0}!",
|
||||
"autocloseRejectTitle":"Ez a ticket nem lesz automatikusan bezárva!",
|
||||
"autocloseWarn":"Ez csak az inaktív hibajegyeket érinti!",
|
||||
|
||||
"goToTicket":"A tickethez",
|
||||
"ticketWarning":"Az embed az alábbi üzenetben van!",
|
||||
"maxTicketWarning":"**Warning:** _Csak {0} ticketet készíthetsz egy időben!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Elérhető parancsok:",
|
||||
"header1":"**Hogy elkészíts egy ticketet, menj ide: {0}!**\n\n",
|
||||
"header2":"**Futtasd a `/new` vagy `/ticket` parancsot a ticket készítéséhez!**\n\n",
|
||||
|
||||
"msgCmd":"Embed küldése gombokkal. (csak adminok)",
|
||||
"renameCmd":"Ticket átnevezése. (szóköz nélkül)",
|
||||
"closeCmd":"Ticket bezárása.",
|
||||
"deleteCmd":"Ticket törlése.",
|
||||
"addCmd":"Felhasználó hozzáadása a tickethez.",
|
||||
"removeCmd":"Felhasználó elvétele a tickettől.",
|
||||
"reopenCmd":"Ticket újranyitása miután már be lett zárva.",
|
||||
"changeCmd":"Ticket típusának megváltoztatása.",
|
||||
"claimCmd":"Ticket igénylése.",
|
||||
"unclaimCmd":"Ticket igénylésének törlése.",
|
||||
"statsCmd":"Ticket statisztikák megtekintése.",
|
||||
"autocloseCmd":"Ticketek automatikus bezárási idejének beállítása"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"Ticket bezárása",
|
||||
"delete":"Ticket törlése",
|
||||
"reopen":"Ticket újranyitása",
|
||||
"closeWithReason":"Bezárás indokkal"
|
||||
},
|
||||
"messages":{
|
||||
"closedDescription":"Csak adminok tudnak ebben a ticketben beszélni!\n\n*Kattints az alábbi gombokkal hogy töröld vagy újranyisd a ticketet!*",
|
||||
"createdTitle":"Ticket Elkészítve!",
|
||||
"createdDescription":"A ticketet elkészítve, meg tudod találni egy pingel!",
|
||||
|
||||
"newTicketDmTitle":"Új ticket!",
|
||||
"closedTicketDmTitle":"Ticket bezárva!",
|
||||
"deletedTicketDmTitle":"Ticket törölve!",
|
||||
"closedTicketDmDescription":"A ticketed bezárták!",
|
||||
"deletedTicketDmDescription":"A ticketed törölték!",
|
||||
"reopenTicketDmTitle":"Ticket újranyitva!",
|
||||
"reopenTicketDmDescription":"A ticketed újranyitották!",
|
||||
|
||||
"chooseCategory":"válassz egy kategóriát:",
|
||||
"gettingdeleted":"A ticket törölve lesz...",
|
||||
|
||||
"none":"nincs",
|
||||
"reason":"indok",
|
||||
"createdat":"elkészítve ekkor:",
|
||||
"openedby":"nyitotta:",
|
||||
"deletedby":"törölve általa:",
|
||||
"closedby":"bezárva általa:",
|
||||
|
||||
"modalreason":"Mi az indokod a ticket bezárására?",
|
||||
"chooseATicket": "Válassz egy ticketet"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Átirat",
|
||||
"processed":"Ez az átirat jelenleg feldolgozás alatt van",
|
||||
"wait":"Kérlek várj!",
|
||||
"estimated":"Becsült idő",
|
||||
"available":"Az átirat itt érhető el"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"_CREDITS":"erxg",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Argumen tidak valid!",
|
||||
"missingArgsDescription":"Argumen hilang",
|
||||
"noPermsTitle":"Tidak ada akses!",
|
||||
"noPermsDescription":"Anda memerlukan akses `ADMINISTRATOR` atau berada di dalam peran yang diizinkan!",
|
||||
"noPermsDelete":"Hanya admin yang dapat menghapus tiket!",
|
||||
"chooseFromListTitle":"ID Tidak Valid",
|
||||
"chooseFromListDescription":"Silahkan pilih salah satu id di bawah:",
|
||||
"boterror":"Bot Error!",
|
||||
"notInTicketTitle":"Anda tidak berada di dalam sebuah tiket!",
|
||||
"notInTicketDescription":"Perintah ini tidak bekerja di luar tiket!",
|
||||
"ticketDoesntExist":"Tiket ini sudah tidak ada lagi!",
|
||||
"roleDoesntExist":"Peran ini sudah tidak ada lagi!",
|
||||
"anotherOption":"Opsi ini bukan tiket, melainkan tipe lain!",
|
||||
"maxAmountTitle":"Batas maksimum tercapai!",
|
||||
"maxAmountDescription":"Kamu telah meraih batas maksimum tiket yang diperbolehkan!\nJadi kamu tidak bisa membuat tiket baru!",
|
||||
"somethingWentWrong":"Ada yang salah! Silakan coba lagi nanti!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"Menambah {0} ke tiket ini!",
|
||||
"userRemovedTitle":"Mengeluarkan {0} dari tiket ini!",
|
||||
"renameTitle":"Mengganti nama menjadi {0}!",
|
||||
"closeTitle":"Menutup tiket ini!",
|
||||
"deleteTitle":"Menghapus tiket ini...",
|
||||
"reopenTitle":"Membuka ulang tiket ini!",
|
||||
|
||||
"claimTitle":"Tiket ini diklaim oleh {0}",
|
||||
"unclaimTitle":"Tiket ini tidak diklaim lagi!",
|
||||
"changeTitle":"Mengganti tipe tiket menjadi {0}!",
|
||||
|
||||
"statsTitle":"Ini adalah status untuk {0}!",
|
||||
"autocloseTitle":"Tiket ini akan tutup otomatis setelah {0}!",
|
||||
"autocloseRejectTitle":"Tiket ini tidak akan tertutup secara otomatis lagi!",
|
||||
"autocloseWarn":"Ini hanya mempengaruhi tiket yang tidak aktif!",
|
||||
|
||||
"goToTicket":"Pergi ke tiket",
|
||||
"ticketWarning":"Sematan tersebut tersedia dalam pesan di bawah ini!",
|
||||
"maxTicketWarning":"**Peringatan:** _Anda hanya bisa membuat {0} tiket dalam satu waktu!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Perintah yang tersedia:",
|
||||
"header1":"**Pergi ke {0} untuk membuat tiket!**\n\n",
|
||||
"header2":"**Jalankan perintah `/new` atau `/ticket` untuk membuat tiket!**\n\n",
|
||||
|
||||
"msgCmd":"Munculkan sematan dengan tombol. (hanya admin)",
|
||||
"renameCmd":"Ganti nama tiket. (tanpa spasi)",
|
||||
"closeCmd":"Tutup tiket.",
|
||||
"deleteCmd":"Hapus tiket.",
|
||||
"addCmd":"Tambahkan pengguna ke dalam tiket.",
|
||||
"removeCmd":"Keluarkan pengguna dari tiket.",
|
||||
"reopenCmd":"Buka ulang tiket setelah ditutup.",
|
||||
"changeCmd":"Ganti tipe tiket.",
|
||||
"claimCmd":"Klaim tiket.",
|
||||
"unclaimCmd":"Batalkan klaim tiket.",
|
||||
"statsCmd":"Lihat status tiket.",
|
||||
"autocloseCmd":"Atur timer untuk menutup tiket secara otomatis"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"Tutup tiket",
|
||||
"delete":"Hapus tiket",
|
||||
"reopen":"Buka ulang tiket",
|
||||
"closeWithReason":"Tutup dengan alasan"
|
||||
},
|
||||
"messages":{
|
||||
"closedDescription":"Hanya admin yang dapat berbincang di tiket ini sekarang!\n\n*Tekan tombol di bawah untuk menghapus atau membuka ulang tiket ini!*",
|
||||
"createdTitle":"Tiket dibuat!",
|
||||
"createdDescription":"Tiket anda dibuat, anda dapat mengetahui dengan ping!",
|
||||
|
||||
"newTicketDmTitle":"Tiket baru!",
|
||||
"closedTicketDmTitle":"Tiket ditutup!",
|
||||
"deletedTicketDmTitle":"TIket dihapus!",
|
||||
"closedTicketDmDescription":"Tiket anda ditutup!",
|
||||
"deletedTicketDmDescription":"Tiket anda dihapus!",
|
||||
"reopenTicketDmTitle":"Tiket dibuka kembali!",
|
||||
"reopenTicketDmDescription":"Tiket anda dibuka kembali!",
|
||||
|
||||
"chooseCategory":"Pilih kategori:",
|
||||
"gettingdeleted":"Tiket sedang dihapus...",
|
||||
|
||||
"none":"tidak ada",
|
||||
"reason":"Alasan",
|
||||
"createdat":"dibuat di",
|
||||
"openedby":"dibuka oleh",
|
||||
"deletedby":"dihapus oleh",
|
||||
"closedby":"ditutup oleh",
|
||||
|
||||
"modalreason":"Apa alasan penutupan tiket ini?",
|
||||
"chooseATicket": "Pilih tiket"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Transcript",
|
||||
"processed":"Transkrip sedang diproses",
|
||||
"wait":"Mohon tunggu!",
|
||||
"estimated":"Estimasi waktu",
|
||||
"available":"Transkrip tersedia di sini"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Statistik Global",
|
||||
"ticketTitle":"Status Tiket Untuk {0}",
|
||||
"userTitle":"Status Pengguna Untuk {0}",
|
||||
"systemTitle":"Status Sistem",
|
||||
"versionTitle":"Versi Robot",
|
||||
|
||||
"ticketsCreated":"Tiket Dibuat",
|
||||
"ticketsClosed":"Tiket Ditutup",
|
||||
"ticketsDeleted":"Tiket Dihapus",
|
||||
"ticketsReopened":"Tiket Dibuka Kembali",
|
||||
"ticketsAutoclosed":"Tiket Ditutup Otomatis",
|
||||
"transcriptsCreated":"Transkrip Dibuat",
|
||||
"startupDate":"Tanggal Mulai",
|
||||
"latestUpdate":"Pembaruan Terbaru",
|
||||
"ticketCreatedOn":"Tiket Dibuat Pada",
|
||||
"ticketCreatedBy":"Tiket Dibuat Oleh",
|
||||
"messagesSent":"Pesan Terkirim",
|
||||
"status":"Status",
|
||||
"participants":"Partisipan",
|
||||
"role":"Peran",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Admin Global",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Anggota",
|
||||
"open":"Buka",
|
||||
"reopened":"Dibuka kembali",
|
||||
"closed":"Ditutup",
|
||||
"autoclosed":"Ditutup Otomatis"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Pengguna ini tidak dapat ditemukan dalam basis data statistik!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"Maurizio#0268",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Argomenti non validi!",
|
||||
"missingArgsDescription":"Argomenti mancanti",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Perfavore attendi!",
|
||||
"estimated":"Tempo estimato",
|
||||
"available":"La trascrizione è disponibile qui"
|
||||
},
|
||||
"stats": {
|
||||
"globalTitle": "Statistiche Globali",
|
||||
"ticketTitle": "Statistiche Ticket per {0}",
|
||||
"userTitle": "Statistiche Utenti per {0}",
|
||||
"systemTitle": "Sistema Statistiche",
|
||||
"versionTitle": "Versione Bot",
|
||||
|
||||
"ticketsCreated": "Tickets Creato",
|
||||
"ticketsClosed": "Tickets Chiuso",
|
||||
"ticketsDeleted": "Tickets Eliminato",
|
||||
"ticketsReopened": "Tickets Riaperto",
|
||||
"ticketsAutoclosed": "Tickets Chiuso Automaticamente",
|
||||
"transcriptsCreated": "Transcrizione Creata",
|
||||
"startupDate": "Data Inizio",
|
||||
"latestUpdate": "Ultimo Update",
|
||||
"ticketCreatedOn": "Ticket Creato Su",
|
||||
"ticketCreatedBy": "Ticket Creato Da",
|
||||
"messagesSent": "Messaggi Inviati",
|
||||
"status": "Stato",
|
||||
"participants": "Partecipanti",
|
||||
"role": "Ruolo",
|
||||
|
||||
"switches": {
|
||||
"globalAdmin": "Amministratore Globale",
|
||||
"ticketAdmin": "Amministratore Ticket",
|
||||
"member": "Membro",
|
||||
"open": "Aperto",
|
||||
"reopened": "Riaperto",
|
||||
"closed": "Chiuso",
|
||||
"autoclosed": "Chiuso Automaticamente"
|
||||
},
|
||||
|
||||
"errorUserNotFound": "Questo utente non può essere trovato nel database delle statistiche!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"_CREDITS":"NoOneNook#0266",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Ugyldige argumenter!",
|
||||
"missingArgsDescription":"Manglende argument",
|
||||
"noPermsTitle":"Ingen rettigheter",
|
||||
"noPermsDescription":"Du trenger administrator eller moderator rettigheter",
|
||||
"noPermsDelete":"Bare staff kan slette en ticket!",
|
||||
"chooseFromListTitle":"Ugyldig ID",
|
||||
"chooseFromListDescription":"Velg en av ID-ene nedenfor:",
|
||||
"boterror":"Bot Error!",
|
||||
"notInTicketTitle":"Du er ikke i en ticket!",
|
||||
"notInTicketDescription":"Du kan ikke bruke denne command utenfor en ticket.",
|
||||
"ticketDoesntExist":"Ticket finnes ikke lenger!",
|
||||
"roleDoesntExist":"Rollen eksisterer ikke lenger!",
|
||||
"anotherOption":"Dette alternativet er ikke en ticket!",
|
||||
"maxAmountTitle":"Maks antall er nådd!",
|
||||
"maxAmountDescription":"Du har nådd maksimalt antall tillatte ticket's\nSå du kan ikke lage en ny før de andre er lukket!",
|
||||
"somethingWentWrong":"**Noe gikk galt!**\nVennligst prøv igjen senere!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"{0} har blitt lagt til i ticket!",
|
||||
"userRemovedTitle":"Fjernet {0} fra ticket!",
|
||||
"renameTitle":"Endret navn til {0}!",
|
||||
"closeTitle":"Ticket er blitt lukket!",
|
||||
"deleteTitle":"Sletter ticket...",
|
||||
"reopenTitle":"Ticket er gjenåpnet",
|
||||
|
||||
"claimTitle":"{0} har tatt over denne saken!",
|
||||
"unclaimTitle":"Denne ticket er blitt ledig igjen!",
|
||||
"changeTitle":"Endret ticket-type til {0}!",
|
||||
|
||||
"statsTitle":"Her er statistikken for {0}!",
|
||||
"autocloseTitle":"Denne ticket stenges automatisk etter kl {0}!",
|
||||
"autocloseRejectTitle":"Denne ticket vil ikke lenger stenges automatisk!",
|
||||
"autocloseWarn":"Dette påvirker kun inaktive tickets!",
|
||||
|
||||
"goToTicket":"DIN TICKET",
|
||||
"ticketWarning":"Embed er i meldingen nedenfor!",
|
||||
"maxTicketWarning":"**Advarsel:** _Du kan bare opprette {0}ticket(s) om gangen!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Tilgjengelige Commands:",
|
||||
"header1":"**Gå til {0} for å opprette en ticket!**\n\n",
|
||||
"header2":"**Skriv kommandoen `/new` eller `/ticket` for å lage en ticket!**\n\n",
|
||||
|
||||
"msgCmd":"Lag en embed med knapper. (admins only)",
|
||||
"renameCmd":"Gi nytt navn til en ticket. (ingen mellomrom)",
|
||||
"closeCmd":"Lukk en ticket.",
|
||||
"deleteCmd":"Slett en ticket.",
|
||||
"addCmd":"Legg til en bruker i ticket.",
|
||||
"removeCmd":"Fjern en bruker fra ticket.",
|
||||
"reopenCmd":"Åpne en ticket på nytt etter at den ble avsluttet.",
|
||||
"changeCmd":"Endre ticket kategori",
|
||||
"claimCmd":"Ta over ticket.",
|
||||
"unclaimCmd":"Frigjør den fra ticket.",
|
||||
"statsCmd":"Se ticket stats.",
|
||||
"autocloseCmd":"Still inn når ticket lukkes automatisk etter den ble åpnet"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"Lukk Ticket",
|
||||
"delete":"Slett Ticket",
|
||||
"reopen":"Gjenåpne Ticket",
|
||||
"closeWithReason":"Legg til årsak"
|
||||
},
|
||||
"messages":{
|
||||
"closedDescription":"Bare staff medlemmer kan snakke i denne ticket nå!\n\n*Klikk på knappen nedenfor for å slette eller åpne ticket på nytt!*",
|
||||
"createdTitle":"Ticket er laget!",
|
||||
"createdDescription":"__Du finner den ved å trykke på knappen under__",
|
||||
|
||||
"newTicketDmTitle":"New Ticket!",
|
||||
"closedTicketDmTitle":"Ticket Åpnet!",
|
||||
"deletedTicketDmTitle":"Ticket Slettet!",
|
||||
"closedTicketDmDescription":"Din ticket er lukket!",
|
||||
"deletedTicketDmDescription":"Din ticket er slettet!",
|
||||
"reopenTicketDmTitle":"Ticket gjenåpnet!",
|
||||
"reopenTicketDmDescription":"Din icket er gjenåpnet!",
|
||||
|
||||
"chooseCategory":"Velg en kategori:",
|
||||
"gettingdeleted":"Ticket slettes....",
|
||||
|
||||
"none":"Ingen",
|
||||
"reason":"Grunnlag",
|
||||
"createdat":"Laget",
|
||||
"openedby":"Laget av",
|
||||
"deletedby":"Slettet av",
|
||||
"closedby":"Lukket av",
|
||||
|
||||
"modalreason":"Grunnlag for lukking!",
|
||||
"chooseATicket": "Velg en ticket"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Ticket logg",
|
||||
"processed":"Logg fil lages, snart klar!",
|
||||
"wait":"Vennligst vent!",
|
||||
"estimated":"Beregnet tid",
|
||||
"available":"Loggfil er tilgjengelig over denne meldingen!"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Globale Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"Bruker Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Versjon",
|
||||
|
||||
"ticketsCreated":"Tickets Laget",
|
||||
"ticketsClosed":"Tickets Lukket",
|
||||
"ticketsDeleted":"Tickets Slettet",
|
||||
"ticketsReopened":"Tickets Gjenåpnet",
|
||||
"ticketsAutoclosed":"Tickets Auto-lukket",
|
||||
"transcriptsCreated":"Transcripts Opprettet",
|
||||
"startupDate":"Start Dato",
|
||||
"latestUpdate":"Siste Oppdatering",
|
||||
"ticketCreatedOn":"Ticket Laget den",
|
||||
"ticketCreatedBy":"Ticket Laget av",
|
||||
"messagesSent":"Meldinger sendt",
|
||||
"status":"Status",
|
||||
"participants":"Deltakere",
|
||||
"role":"Rolle",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Medlem",
|
||||
"open":"Åpen",
|
||||
"reopened":"Gjenåpnet",
|
||||
"closed":"Lukket",
|
||||
"autoclosed":"Auto-Lukket"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Denne brukeren kan ikke bli funnet i statistikkdatabasen!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"MKevas#8311",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Nieprawidłowe argumenty!",
|
||||
"missingArgsDescription":"Brakujący argument",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Proszę czekać!",
|
||||
"estimated":"Szacowany czas",
|
||||
"available":"Transkrypcja jest dostępna tutaj"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Globalne Statystyki",
|
||||
"ticketTitle":"Statystyki biletów dla {0}",
|
||||
"userTitle":"Statystyki użytkowników dla {0}",
|
||||
"systemTitle":"Statystyki systemu",
|
||||
"versionTitle":"Wersja bota",
|
||||
|
||||
"ticketsCreated":"Bilety stworzone",
|
||||
"ticketsClosed":"Bilety zamknięte",
|
||||
"ticketsDeleted":"Bilety skasowane",
|
||||
"ticketsReopened":"Bilety otwarte ponownie",
|
||||
"ticketsAutoclosed":"Bilety automatycznie zamknięte",
|
||||
"transcriptsCreated":"Utworzono transkrypcje",
|
||||
"startupDate":"Data uruchomienia",
|
||||
"latestUpdate":"Najnowsza aktualizacja",
|
||||
"ticketCreatedOn":"Bilet został utworzony dnia",
|
||||
"ticketCreatedBy":"Bilet stworzony przez",
|
||||
"messagesSent":"Wiadomość wysłana",
|
||||
"status":"Status",
|
||||
"participants":"Uczestnicy",
|
||||
"role":"Rola",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Globalny administrator",
|
||||
"ticketAdmin":"Admin biletowy",
|
||||
"member":"Użytkownik",
|
||||
"open":"Otwarte",
|
||||
"reopened":"Otwarte ponownie",
|
||||
"closed":"Zamknięte",
|
||||
"autoclosed":"Automatycznie zamknięte"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Tego użytkownika nie można znaleźć w bazie statystyk!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"QuirAddon#9778",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Argumentos inválidos!",
|
||||
"missingArgsDescription":"Argumento ausente",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Por favor espere!",
|
||||
"estimated":"Tempo estimado",
|
||||
"available":"A Transcrição está disponível aqui"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"Sanke#6086",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Argumente Invalide",
|
||||
"missingArgsDescription":"Argument Lipsa",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Te rugam sa astepti!",
|
||||
"estimated":"Timp estimat",
|
||||
"available":"Transcriptul este disponibil aici"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Statistici Globale",
|
||||
"ticketTitle":"Statistici Ticket pentru {0}",
|
||||
"userTitle":"Statistici utilizator pentru {0}",
|
||||
"systemTitle":"Statistici Sistem",
|
||||
"versionTitle":"Versiune Bot",
|
||||
|
||||
"ticketsCreated":"Tickete Create",
|
||||
"ticketsClosed":"Tickets Inchise",
|
||||
"ticketsDeleted":"Tickete Sterse",
|
||||
"ticketsReopened":"Tickete Redeschise",
|
||||
"ticketsAutoclosed":"Tickets Inchise automat",
|
||||
"transcriptsCreated":"Transcript-uri create",
|
||||
"startupDate":"Data startup",
|
||||
"latestUpdate":"Update recent",
|
||||
"ticketCreatedOn":"Ticket creat pe data",
|
||||
"ticketCreatedBy":"Ticket Creat de",
|
||||
"messagesSent":"Mesaje trimise",
|
||||
"status":"Status",
|
||||
"participants":"Participanti",
|
||||
"role":"Rol",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Admin Global",
|
||||
"ticketAdmin":"Admin Ticket",
|
||||
"member":"Membru",
|
||||
"open":"Deschis",
|
||||
"reopened":"Redeschis",
|
||||
"closed":"Inchis",
|
||||
"autoclosed":"Inchis automat"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Acest utilizator nu poate fi gasit in database-ul nostru!"
|
||||
}
|
||||
}
|
||||
|
||||
+50
-13
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"Apexo#0723",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Неверные аргументы!",
|
||||
"missingArgsDescription":"Отсутствует аргумент",
|
||||
@@ -29,12 +32,12 @@
|
||||
"unclaimTitle":"Этот тикет никем не взят!",
|
||||
"changeTitle":"Изменён тип тикета на {0}!",
|
||||
|
||||
"statsTitle":"Here are the stats for {0}!",
|
||||
"autocloseTitle":"This ticket will be closed automatically after {0}!",
|
||||
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
|
||||
"autocloseWarn":"This only affects inactive tickets!",
|
||||
"statsTitle":"Здесь статистика для {0}!",
|
||||
"autocloseTitle":"Этот тикет будет закрыт автоматически после {0}!",
|
||||
"autocloseRejectTitle":"Этот тикет больше не будет закрыт автоматически!",
|
||||
"autocloseWarn":"Это касается только неактивных тикетов!",
|
||||
|
||||
"goToTicket":"go to ticket",
|
||||
"goToTicket":"перейти в тикет",
|
||||
"ticketWarning":"embed ниже сообщения!",
|
||||
"maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_"
|
||||
},
|
||||
@@ -50,11 +53,11 @@
|
||||
"addCmd":"Добавить пользователя в тикет.",
|
||||
"removeCmd":"Удалить пользователя из тикета.",
|
||||
"reopenCmd":"Открыть заново тикет после того, как он был закрыт.",
|
||||
"changeCmd":"Change ticket type.",
|
||||
"claimCmd":"Claim a ticket.",
|
||||
"unclaimCmd":"Unclaim a ticket.",
|
||||
"statsCmd":"View ticket stats.",
|
||||
"autocloseCmd":"Set timer to automatically close ticket"
|
||||
"changeCmd":"Поменять тип тикета.",
|
||||
"claimCmd":"Взять тикет.",
|
||||
"unclaimCmd":"Снять тикет.",
|
||||
"statsCmd":"Посмотреть статистику тикета.",
|
||||
"autocloseCmd":"Установить таймер, чтобы автоматически закрыть тикет"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"Закрыть тикет",
|
||||
@@ -80,8 +83,8 @@
|
||||
|
||||
"none":"отсутствует",
|
||||
"reason":"причина",
|
||||
"createdat":"created at",
|
||||
"openedby":"opened by",
|
||||
"createdat":"создан",
|
||||
"openedby":"открыт",
|
||||
"deletedby":"удалён",
|
||||
"closedby":"закрыт",
|
||||
|
||||
@@ -90,9 +93,43 @@
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Транскрипт",
|
||||
"processed":"This transcript is being processed",
|
||||
"processed":"Этот транскрипт находится в процессе обработки",
|
||||
"wait":"Пожайлуста подождите!",
|
||||
"estimated":"Оценочное время",
|
||||
"available":"Транскрипт здесь доступен"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Общая статистика",
|
||||
"ticketTitle":"Статистика тикета для {0}",
|
||||
"userTitle":"Статистика пользователя для {0}",
|
||||
"systemTitle":"Системная статистика",
|
||||
"versionTitle":"Версия бота",
|
||||
|
||||
"ticketsCreated":"Тикет создан",
|
||||
"ticketsClosed":"Тикет закрыт",
|
||||
"ticketsDeleted":"Тикет удален",
|
||||
"ticketsReopened":"Тикет переоткрыт",
|
||||
"ticketsAutoclosed":"Тикет автоматически закрыт",
|
||||
"transcriptsCreated":"Транскрипт создан",
|
||||
"startupDate":"Дата запуска",
|
||||
"latestUpdate":"Последнее обновление",
|
||||
"ticketCreatedOn":"Тикет создан",
|
||||
"ticketCreatedBy":"Тикет создан",
|
||||
"messagesSent":"Сообщение отправлено",
|
||||
"status":"Статус",
|
||||
"participants":"Участники",
|
||||
"role":"Роль",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Главная",
|
||||
"ticketAdmin":"Тикет",
|
||||
"member":"Участник",
|
||||
"open":"Открыть",
|
||||
"reopened":"Переоткрытый",
|
||||
"closed":"Закрыт",
|
||||
"autoclosed":"Автоматически закрыт"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Участник не найден в базе данных статистики!"
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
"examples":{
|
||||
"en-GB":"english",
|
||||
"en-US":"english",
|
||||
"no": "Norwegian",
|
||||
"nl":"dutch",
|
||||
"ro":"romanian",
|
||||
"de":"german",
|
||||
@@ -10,6 +11,7 @@
|
||||
"es-ES":"spanish",
|
||||
"it":"italian",
|
||||
"ru":"russian",
|
||||
"tr": "Türkçe",
|
||||
|
||||
"MISSING":"arabic,portuguese",
|
||||
"NOTAVAILABLE":"arabic,portuguese,czech"
|
||||
@@ -18,6 +20,7 @@
|
||||
"help":{
|
||||
"en-GB":"A list of the available commands.",
|
||||
"en-US":"A list of the available commands.",
|
||||
"no":"En liste over commands.",
|
||||
"nl":"Een lijst met de beschikbare commands.",
|
||||
"ro":"O lista a comenzilor disponibile.",
|
||||
"de":"Eine Liste der verfügbaren Befehle.",
|
||||
@@ -25,11 +28,13 @@
|
||||
"fr":"Une liste des commandes.",
|
||||
"es-ES":"Una lista de los comandos disponibles.",
|
||||
"it":"Una lista di tutti i comandi disponibili.",
|
||||
"ru":"Список доступных команд"
|
||||
"ru":"Список доступных команд",
|
||||
"tr": "Kullanılabilir komutların listesi."
|
||||
},
|
||||
"message":{
|
||||
"en-GB":"Spawn an embed with buttons.",
|
||||
"en-US":"Spawn an embed with buttons.",
|
||||
"no":"Legg inn en melding i denne kanalen",
|
||||
"nl":"Spawn een embed met knoppen.",
|
||||
"ro":"Deschide un embed cu butoane.",
|
||||
"de":"Sendet ein Embed mit Knöpfen.",
|
||||
@@ -37,11 +42,13 @@
|
||||
"fr":"Créer un embed avec des boutons.",
|
||||
"es-ES":"Genera un embed con botones.",
|
||||
"it":"Genera un embed con un pulsante.",
|
||||
"ru":"Создать embed с кнопками"
|
||||
"ru":"Создать embed с кнопками",
|
||||
"tr": "Butonlar ile bir yerleştirme oluşturun."
|
||||
},
|
||||
"close":{
|
||||
"en-GB":"Close a ticket.",
|
||||
"en-US":"Close a ticket.",
|
||||
"no":"Lukk ticket.",
|
||||
"nl":"Sluit een ticket",
|
||||
"ro":"Inchide un ticket.",
|
||||
"de":"Schließe ein Ticket.",
|
||||
@@ -49,11 +56,13 @@
|
||||
"fr":"Fermer un ticket.",
|
||||
"es-ES":"Cierra un ticket.",
|
||||
"it":"Chiudi un ticket.",
|
||||
"ru":"Закрыть тикет"
|
||||
"ru":"Закрыть тикет",
|
||||
"tr": "Bileti kapat."
|
||||
},
|
||||
"delete":{
|
||||
"en-GB":"Delete a ticket.",
|
||||
"en-US":"Delete a ticket.",
|
||||
"no":"Slett ticket.",
|
||||
"nl":"Verwijder een ticket",
|
||||
"ro":"Sterge un ticket.",
|
||||
"de":"Lösche ein Ticket.",
|
||||
@@ -61,11 +70,13 @@
|
||||
"fr":"Supprimer un ticket.",
|
||||
"es-ES":"Elimina un ticket.",
|
||||
"it":"Elimina un ticket.",
|
||||
"ru":"Удалить тикет"
|
||||
"ru":"Удалить тикет",
|
||||
"tr": "Bileti sil."
|
||||
},
|
||||
"reopen":{
|
||||
"en-GB":"Re-Open a ticket.",
|
||||
"en-US":"Re-Open a ticket.",
|
||||
"no":"Gjenåpne ticket.",
|
||||
"nl":"Heropen een ticket.",
|
||||
"ro":"Re-deschide un ticket.",
|
||||
"de":"Wiedereröffnung eines Tickets.",
|
||||
@@ -73,11 +84,13 @@
|
||||
"fr":"Re-ouvrir un ticket.",
|
||||
"es-ES":"Re-abre un ticket.",
|
||||
"it":"Ri-Apri un ticket.",
|
||||
"ru":"Открыть заново тикет"
|
||||
"ru":"Открыть заново тикет",
|
||||
"tr": "Bileti yeniden aç."
|
||||
},
|
||||
"add":{
|
||||
"en-GB":"Add another user to a ticket.",
|
||||
"en-US":"Add another user to a ticket.",
|
||||
"no":"Legg til en annen bruker til ticket.",
|
||||
"nl":"Voeg een andere user toe aan een ticket.",
|
||||
"ro":"Adauga un utilizator la acest ticket.",
|
||||
"de":"Füge einen anderen Nutzer zum Ticket hinzu.",
|
||||
@@ -85,11 +98,13 @@
|
||||
"fr":"Ajouter un utilisateur au ticket.",
|
||||
"es-ES":"Agrega otro usuario al ticket.",
|
||||
"it":"Aggiungi un membro al ticket",
|
||||
"ru":"Добавить другого пользователя в тикет"
|
||||
"ru":"Добавить другого пользователя в тикет",
|
||||
"tr": "Bilete başka bir kullanıcı ekle."
|
||||
},
|
||||
"remove":{
|
||||
"en-GB":"Remove a user from a ticket.",
|
||||
"en-US":"Remove a user from a ticket.",
|
||||
"no":"Fjern en bruker fra ticket.",
|
||||
"nl":"Verwijder een user van een ticket.",
|
||||
"ro":"Sterge un utilizator dintr-un ticket.",
|
||||
"de":"Entferne einen Nutzer von dem Ticket.",
|
||||
@@ -97,11 +112,13 @@
|
||||
"fr":"Enlever quelqu’un du ticket.",
|
||||
"es-ES":"Elimina otro usuario del ticket.",
|
||||
"it":"Rimuovi un membro dal ticket",
|
||||
"ru":"Удалить пользователя из тикета"
|
||||
"ru":"Удалить пользователя из тикета",
|
||||
"tr": "Kullanıcıyı bir biletten kaldır."
|
||||
},
|
||||
"newticket":{
|
||||
"en-GB":"Create a ticket",
|
||||
"en-US":"Create a ticket",
|
||||
"no":"Lag en ny ticket",
|
||||
"nl":"Maak een ticket aan",
|
||||
"ro":"Creeaza un ticket.",
|
||||
"de":"Erstelle ein Ticket.",
|
||||
@@ -109,11 +126,13 @@
|
||||
"fr":"Créer un ticket",
|
||||
"es-ES":"Crear un ticket.",
|
||||
"it":"Crea un ticket",
|
||||
"ru":"Создать тикет"
|
||||
"ru":"Создать тикет",
|
||||
"tr": "Bilet oluştur"
|
||||
},
|
||||
"rename":{
|
||||
"en-GB":"Rename a ticket channel.",
|
||||
"en-US":"Rename a ticket channel.",
|
||||
"no":"Gi nytt navn til ticket kanalen.",
|
||||
"nl":"Hernoem een ticket channel.",
|
||||
"ro":"Redenumeste un ticket.",
|
||||
"de":"Benenne einen Ticket Channel.",
|
||||
@@ -121,11 +140,13 @@
|
||||
"fr":"Renommer un ticket.",
|
||||
"es-ES":"Renombrar un canal de ticket.",
|
||||
"it":"Rinomina il canale di un ticket.",
|
||||
"ru":"Переименовать канал тикета"
|
||||
"ru":"Переименовать канал тикета",
|
||||
"tr": "Bilet kanalını yeniden adlandır."
|
||||
},
|
||||
"claim":{
|
||||
"en-GB":"Claim a ticket.",
|
||||
"en-US":"Claim a ticket.",
|
||||
"no":"Overta ticket.",
|
||||
"nl":"Claim een ticket.",
|
||||
"ro":" ",
|
||||
"de":" ",
|
||||
@@ -133,11 +154,13 @@
|
||||
"fr":" ",
|
||||
"es-ES":" ",
|
||||
"it":" ",
|
||||
"ru":"Взять тикет"
|
||||
"ru":"Взять тикет",
|
||||
"tr":"Bilet talep et."
|
||||
},
|
||||
"unclaim":{
|
||||
"en-GB":"Un-claim a ticket.",
|
||||
"en-US":"Un-claim a ticket.",
|
||||
"no":"Frigjør ticket.",
|
||||
"nl":"Ontclaim een ticket.",
|
||||
"ro":" ",
|
||||
"de":" ",
|
||||
@@ -145,11 +168,13 @@
|
||||
"fr":" ",
|
||||
"es-ES":" ",
|
||||
"it":" ",
|
||||
"ru":"Снять тикет"
|
||||
"ru":"Снять тикет",
|
||||
"tr":"Bileti iptal et."
|
||||
},
|
||||
"category":{
|
||||
"en-GB":"Change ticket type.",
|
||||
"en-US":"Change ticket type.",
|
||||
"no":"Endre ticket type.",
|
||||
"nl":"Verander ticket type.",
|
||||
"ro":" ",
|
||||
"de":" ",
|
||||
@@ -157,7 +182,8 @@
|
||||
"fr":" ",
|
||||
"es-ES":" ",
|
||||
"it":" ",
|
||||
"ru":"Изменить тип тикета"
|
||||
"ru":"Изменить тип тикета",
|
||||
"tr":"Bilet türünü değiştir."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"n1kkec#5341",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Napačen argument!",
|
||||
"missingArgsDescription":"Argument manka",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait": "Počakajte!",
|
||||
"estimated": "Predvideni čas",
|
||||
"available": "Prepis je na voljo tukaj"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"Redactado#1673 & josuens14#5267",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"¡Argumentos inválidos!",
|
||||
"missingArgsDescription":"Argumento faltante.",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"¡Por favor, espere!",
|
||||
"estimated":"Tiempo estimado",
|
||||
"available":"La transcripción estará disponible aquí"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Estadísticas Globales",
|
||||
"ticketTitle":"Estadísitcas para el ticket {0}",
|
||||
"userTitle":"Estadísticas para el usuario {0}",
|
||||
"systemTitle":"Estadísticas del sistema",
|
||||
"versionTitle":"Versión del bot",
|
||||
|
||||
"ticketsCreated":"Tickets Creados",
|
||||
"ticketsClosed":"Tickets Cerrados",
|
||||
"ticketsDeleted":"Tickets Eliminados",
|
||||
"ticketsReopened":"Tickets Reabiertos",
|
||||
"ticketsAutoclosed":"Tickets Cerrados automáticamente",
|
||||
"transcriptsCreated":"Transcripciones Creadas",
|
||||
"startupDate":"Fecha de Inicio",
|
||||
"latestUpdate":"Última Actualización",
|
||||
"ticketCreatedOn":"Ticket creado el",
|
||||
"ticketCreatedBy":"Ticket creado por",
|
||||
"messagesSent":"Mensajes enviados",
|
||||
"status":"Estado",
|
||||
"participants":"Participantes",
|
||||
"role":"Rol",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Admin Global",
|
||||
"ticketAdmin":"Admin del Ticket",
|
||||
"member":"Miembro",
|
||||
"open":"Abierto",
|
||||
"reopened":"Reabierto",
|
||||
"closed":"Cerrado",
|
||||
"autoclosed":"Cerrado automáticamente"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"¡Este usuario no pudo ser encontrado en la base de datos de estadísitcas!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"_CREDITS":"Mods HD#0661",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"อาร์กิวเมนต์ไม่ถูกต้อง!",
|
||||
"missingArgsDescription":"ขาดอาร์กิวเมนต์",
|
||||
"noPermsTitle":"ไม่มีสิทธิ์!",
|
||||
"noPermsDescription":"คุณต้องมีสิทธิ์ `ADMINISTRATOR` หรืออยู่ในรายการบทบาทที่ได้รับอนุญาต!",
|
||||
"noPermsDelete":"เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถลบตั๋วได้!",
|
||||
"chooseFromListTitle":"ID ไม่ถูกต้อง",
|
||||
"chooseFromListDescription":"เลือกหนึ่งใน ID ด้านล่าง:",
|
||||
"boterror":"ข้อผิดพลาดของบอท!",
|
||||
"notInTicketTitle":"คุณไม่ได้อยู่ในตั๋ว!",
|
||||
"notInTicketDescription":"คำสั่งนี้ไม่ทำงานนอกตั๋ว!",
|
||||
"ticketDoesntExist":"ตั๋วนี้ไม่มีอีกแล้ว!",
|
||||
"roleDoesntExist":"บทบาทนี้ไม่มีอีกแล้ว!",
|
||||
"anotherOption":"ตัวเลือกนี้ไม่ใช่ตั๋ว แต่เป็นประเภทอื่น!",
|
||||
"maxAmountTitle":"ถึงจำนวนสูงสุดแล้ว!",
|
||||
"maxAmountDescription":"คุณได้ถึงจำนวนสูงสุดของตั๋วที่อนุญาต!\nดังนั้นคุณไม่สามารถสร้างใหม่ได้!",
|
||||
"somethingWentWrong":"**มีบางอย่างผิดพลาด!**\nกรุณาลองอีกครั้งในภายหลัง!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"เพิ่ม {0} ในตั๋วนี้!",
|
||||
"userRemovedTitle":"ลบ {0} ออกจากตั๋วนี้!",
|
||||
"renameTitle":"เปลี่ยนชื่อเป็น {0}!",
|
||||
"closeTitle":"ปิดตั๋วนี้!",
|
||||
"deleteTitle":"กำลังลบตั๋วนี้...",
|
||||
"reopenTitle":"เปิดตั๋วนี้อีกครั้ง!",
|
||||
|
||||
"claimTitle":"ตั๋วนี้ถูกเรียกขึ้นโดย {0}",
|
||||
"unclaimTitle":"ตั๋วนี้ไม่ได้ถูกเรียกขึ้นแล้ว!",
|
||||
"changeTitle":"เปลี่ยนประเภทตั๋วเป็น {0}!",
|
||||
|
||||
"statsTitle":"นี่คือสถิติสำหรับ {0}!",
|
||||
"autocloseTitle":"ตั๋วนี้จะถูกปิดอัตโนมัติหลังจาก {0}!",
|
||||
"autocloseRejectTitle":"ตั๋วนี้จะไม่ถูกปิดอัตโนมัติอีกต่อไป!",
|
||||
"autocloseWarn":"ส่วนนี้มีผลกับตั๋วที่ไม่ได้ใช้งาน!",
|
||||
|
||||
"goToTicket":"ไปที่ตั๋ว",
|
||||
"ticketWarning":"Embed อยู่ในข้อความด้านล่าง!",
|
||||
"maxTicketWarning":"**คำเตือน:** _คุณสามารถสร้างได้ {0} ตั๋วในครั้งเดียว!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"คำสั่งที่ใช้ได้:",
|
||||
"header1":"**ไปที่ {0} เพื่อสร้างตั๋ว!**\n\n",
|
||||
"header2":"**ใช้คำสั่ง `/new` หรือ `/ticket` เพื่อสร้างตั๋ว!**\n\n",
|
||||
|
||||
"msgCmd":"สร้าง embed พร้อมปุ่ม (เฉพาะผู้ดูแลระบบ)",
|
||||
"renameCmd":"เปลี่ยนชื่อตั๋ว (ไม่มีช่องว่าง)",
|
||||
"closeCmd":"ปิดตั๋ว",
|
||||
"deleteCmd":"ลบตั๋ว",
|
||||
"addCmd":"เพิ่มผู้ใช้ในตั๋ว",
|
||||
"removeCmd":"ลบผู้ใช้ออกจากตั๋ว",
|
||||
"reopenCmd":"เปิดตั๋วอีกครั้งหลังจากถูกปิด",
|
||||
"changeCmd":"เปลี่ยนประเภทตั๋ว",
|
||||
"claimCmd":"เรียกขึ้นตั๋ว",
|
||||
"unclaimCmd":"ยกเลิกการเรียกขึ้นตั๋ว",
|
||||
"statsCmd":"ดูสถิติตั๋ว",
|
||||
"autocloseCmd":"ตั้งค่าการปิดตั๋วอัตโนมัติ"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"ปิดตั๋ว",
|
||||
"delete":"ลบตั๋ว",
|
||||
"reopen":"เปิดตั๋วอีกครั้ง",
|
||||
"closeWithReason":"ปิดด้วยเหตุผล"
|
||||
},
|
||||
"messages":{
|
||||
"closedDescription":"เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถพูดคุยในตั๋วนี้ได้!\n\n*คลิกที่ปุ่มด้านล่างเพื่อลบหรือเปิดตั๋วนี้อีกครั้ง!*",
|
||||
"createdTitle":"สร้างตั๋วแล้ว!",
|
||||
"createdDescription":"ตั๋วของคุณถูกสร้างแล้ว คุณสามารถตรวจสอบได้จากการแจ้งเตือน!",
|
||||
|
||||
"newTicketDmTitle":"ตั๋วใหม่!",
|
||||
"closedTicketDmTitle":"ปิดตั๋ว!",
|
||||
"deletedTicketDmTitle":"ลบตั๋ว!",
|
||||
"closedTicketDmDescription":"ตั๋วของคุณถูกปิด!",
|
||||
"deletedTicketDmDescription":"ตั๋วของคุณถูกลบ!",
|
||||
"reopenTicketDmTitle":"เปิดตั๋วอีกครั้ง!",
|
||||
"reopenTicketDmDescription":"ตั๋วของคุณถูกเปิดอีกครั้ง!",
|
||||
|
||||
"chooseCategory":"เลือกหมวดหมู่:",
|
||||
"gettingdeleted":"กำลังลบตั๋ว...",
|
||||
|
||||
"none":"ไม่มี",
|
||||
"reason":"เหตุผล",
|
||||
"createdat":"สร้างเมื่อ",
|
||||
"openedby":"เปิดโดย",
|
||||
"deletedby":"ถูกลบโดย",
|
||||
"closedby":"ถูกปิดโดย",
|
||||
|
||||
"modalreason":"เหตุผลในการปิดตั๋วนี้คืออะไร?",
|
||||
"chooseATicket": "เลือกตั๋ว"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"บันทึกการสนทนา",
|
||||
"processed":"บันทึกการสนทนากำลังดำเนินการ",
|
||||
"wait":"กรุณารอ!",
|
||||
"estimated":"เวลาโดยประมาณ",
|
||||
"available":"บันทึกการสนทนาสามารถใช้งานได้ที่นี่"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"สถิติทั้งหมด",
|
||||
"ticketTitle":"สถิติห้องติดต่อสำหรับ {0}",
|
||||
"userTitle":"สถิติผู้ใช้สำหรับ {0}",
|
||||
"systemTitle":"สถานะระบบ",
|
||||
"versionTitle":"เวอร์ชั่นของบอท",
|
||||
|
||||
"ticketsCreated":"ห้องติดต่อที่สร้าง",
|
||||
"ticketsClosed":"ห้องติดต่อที่ปิด",
|
||||
"ticketsDeleted":"ห้องติดต่อที่ลบ:",
|
||||
"ticketsReopened":"ห้องติดต่อที่เปิดใหม่",
|
||||
"ticketsAutoclosed":"ห้องติดต่อที่ปิดโดยอัตโนมัติ",
|
||||
"transcriptsCreated":"ทรานสคริปต์ที่สร้าง",
|
||||
"startupDate":"วันที่เริ่มต้น",
|
||||
"latestUpdate":"การอัปเดตล่าสุด",
|
||||
"ticketCreatedOn":"ห้องติดต่อที่สร้างเมื่อ",
|
||||
"ticketCreatedBy":"ห้องติดต่อที่สร้างโดย",
|
||||
"messagesSent":"ข้อความที่ส่ง",
|
||||
"status":"สถานะ",
|
||||
"participants":"ผู้มีส่วนร่วม",
|
||||
"role":"บทบาท",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"ผู้ดูแลทั้งหมด",
|
||||
"ticketAdmin":"ผู้ดูแลห้องติดต่อ",
|
||||
"member":"ผู้ใช้",
|
||||
"open":"เปิด",
|
||||
"reopened":"เปิดใหม่",
|
||||
"closed":"ปิด",
|
||||
"autoclosed":"ปิดโดยอัตโนมัติ"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"ไม่พบผู้ใช้ในฐานข้อมูลสถิติ!"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,7 @@
|
||||
{
|
||||
"_CREDITS":"Hydrâelčhâvø#1575",
|
||||
"_INFO":"This file is a translation for open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Geçersiz argümanlar!",
|
||||
"missingArgsDescription":"Eksik argüman!",
|
||||
@@ -94,5 +97,39 @@
|
||||
"wait":"Lütfen Bekleyiniz!",
|
||||
"estimated":"Tahmini Süre",
|
||||
"available":"Transkript burada mevcuttur"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Global Stats",
|
||||
"ticketTitle":"Ticket Stats for {0}",
|
||||
"userTitle":"User Stats for {0}",
|
||||
"systemTitle":"System Stats",
|
||||
"versionTitle":"Bot Version",
|
||||
|
||||
"ticketsCreated":"Tickets Created",
|
||||
"ticketsClosed":"Tickets Closed",
|
||||
"ticketsDeleted":"Tickets Deleted",
|
||||
"ticketsReopened":"Tickets Reopened",
|
||||
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||
"transcriptsCreated":"Transcripts Created",
|
||||
"startupDate":"Startup Date",
|
||||
"latestUpdate":"Latest Update",
|
||||
"ticketCreatedOn":"Ticket Created On",
|
||||
"ticketCreatedBy":"Ticket Created By",
|
||||
"messagesSent":"Messages Sent",
|
||||
"status":"Status",
|
||||
"participants":"Participants",
|
||||
"role":"Role",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Global Admin",
|
||||
"ticketAdmin":"Ticket Admin",
|
||||
"member":"Member",
|
||||
"open":"Open",
|
||||
"reopened":"Reopened",
|
||||
"closed":"Closed",
|
||||
"autoclosed":"Autoclosed"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"This user can't be found in the stats database!"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"_CREDITS":"Anderskiy#4093",
|
||||
"_INFO":"Цей файл є перекладом для open ticket 3.5.0",
|
||||
|
||||
"errors":{
|
||||
"missingArgsTitle":"Невірні аргументи!",
|
||||
"missingArgsDescription":"Відсутні аргументи!",
|
||||
"noPermsTitle":"Відсутні права!",
|
||||
"noPermsDescription":"Вам потрібно право `ADMINISTRATOR` або бути в списку дозволених ролей!",
|
||||
"noPermsDelete":"Тільки адміни можуть видаляти тікети!",
|
||||
"chooseFromListTitle":"Недійсний ID",
|
||||
"chooseFromListDescription":"Виберіть один із наведених нижче id:",
|
||||
"boterror":"Помилка боту!",
|
||||
"notInTicketTitle":"Вас немає в тікеті!",
|
||||
"notInTicketDescription":"Ця команда не працює поза тікетами!",
|
||||
"ticketDoesntExist":"Цей тікет більше не існує!",
|
||||
"roleDoesntExist":"Ця роль більше не існує!",
|
||||
"anotherOption":"Це не є тікетом, а є іншим типом!",
|
||||
"maxAmountTitle":"Досягнуто максимальної кількості!",
|
||||
"maxAmountDescription":"Ви досягли максимально дозволеної кількості тікетів!\nТож ви не можете створити новий!",
|
||||
"somethingWentWrong":"**Щось пішло не так!**\nБудь ласка, спробуйте ще раз!"
|
||||
},
|
||||
"commands":{
|
||||
"userAddedTitle":"Додано {0} до цього тікету!",
|
||||
"userRemovedTitle":"Видалено {0} з цього тікету!",
|
||||
"renameTitle":"Змінено ім'я на {0}!",
|
||||
"closeTitle":"Тікет закритий!",
|
||||
"deleteTitle":"Видаляємо тікет",
|
||||
"reopenTitle":"Знову відкриваємо тікет!",
|
||||
|
||||
"claimTitle":"Цей тікет узяв {0}",
|
||||
"unclaimTitle":"Цей тікет ніким не зайнятий!",
|
||||
"changeTitle":"Тип тікету змінено на {0}!",
|
||||
|
||||
"statsTitle":"Ось статистика для {0}!",
|
||||
"autocloseTitle":"Цей тікет буде автоматично закрито після {0}!",
|
||||
"autocloseRejectTitle":"Цей тікет більше не закриватиметься автоматично!",
|
||||
"autocloseWarn":"Це стосується лише неактивних тікетів!",
|
||||
|
||||
"goToTicket":"перейти до тікету",
|
||||
"ticketWarning":"Ембед знаходиться в повідомленні нижче!",
|
||||
"maxTicketWarning":"**Попередження:** _Ви можете створити лише стільки квитків за раз: {0}!_"
|
||||
},
|
||||
"helpMenu":{
|
||||
"title":"Доступні команди:",
|
||||
"header1":"**Перейдіть до {0}, щоб створити тікет!**\n\n",
|
||||
"header2":"**Виконайте команду `/new` або `/ticket`, щоб створити тікет!**\n\n",
|
||||
|
||||
"msgCmd":"Створити ембед з кнопками. (тільки адміністратори)",
|
||||
"renameCmd":"Перейменувати тікет. (без пробілів)",
|
||||
"closeCmd":"Закрити тікет.",
|
||||
"deleteCmd":"Видалити тікет.",
|
||||
"addCmd":"Додати користувача до тікету.",
|
||||
"removeCmd":"Видалити користувача з тікету.",
|
||||
"reopenCmd":"Повторне відкриття тікету після його закриття.",
|
||||
"changeCmd":"Змінити тіп тикету.",
|
||||
"claimCmd":"Узяти тікет.",
|
||||
"unclaimCmd":"Відмовитися від тікету.",
|
||||
"statsCmd":"Переглянути статистику тікету.",
|
||||
"autocloseCmd":"Встановіть таймер для автоматичного закриття квитка"
|
||||
},
|
||||
"buttons":{
|
||||
"close":"Закрити тікет",
|
||||
"delete":"Видалити тікет",
|
||||
"reopen":"Відкрити тікет",
|
||||
"closeWithReason":"Закрити з причиною"
|
||||
},
|
||||
"messages":{
|
||||
"closedDescription":"Зараз лише адміністратори можуть говорити в цьому тікеті!\n\n*Натисніть кнопку нижче, щоб видалити або повторно відкрити цей тікет!*",
|
||||
"createdTitle":"Тікет створено!",
|
||||
"createdDescription":"Ваш тікет створено, ви можете визначити його за допомогою пінгу!",
|
||||
|
||||
"newTicketDmTitle":"Новий тікет!",
|
||||
"closedTicketDmTitle":"Тікет закрито!",
|
||||
"deletedTicketDmTitle":"Тікет видалено!",
|
||||
"closedTicketDmDescription":"Твій тікет закрито!",
|
||||
"deletedTicketDmDescription":"Твій тікет видалено!",
|
||||
"reopenTicketDmTitle":"Тікет відкритий!",
|
||||
"reopenTicketDmDescription":"Твій тікет відкритий!",
|
||||
|
||||
"chooseCategory":"виберіть категорію:",
|
||||
"gettingdeleted":"Тікет видаляється...",
|
||||
|
||||
"none":"пусто",
|
||||
"reason":"причина",
|
||||
"createdat":"створений",
|
||||
"openedby":"відкритий",
|
||||
"deletedby":"видалений",
|
||||
"closedby":"закритий",
|
||||
|
||||
"modalreason":"Яка причина закриття цього тікету?",
|
||||
"chooseATicket": "Виберіть тікет"
|
||||
},
|
||||
"transcripts":{
|
||||
"title":"Транскрипція",
|
||||
"processed":"Ця транскрипція обробляється",
|
||||
"wait":"Будь-ласка почекайте!",
|
||||
"estimated":"Розрахунковий час",
|
||||
"available":"Транскрипція доступна тут"
|
||||
},
|
||||
"stats":{
|
||||
"globalTitle":"Загальна статистика",
|
||||
"ticketTitle":"Статистика тікету для {0}",
|
||||
"userTitle":"Статистика корстувача для {0}",
|
||||
"systemTitle":"Системна статистика",
|
||||
"versionTitle":"Версія бота",
|
||||
|
||||
"ticketsCreated":"Тікет створен",
|
||||
"ticketsClosed":"Тікет закрито",
|
||||
"ticketsDeleted":"Тікет видалено",
|
||||
"ticketsReopened":"Тікет перевідкритий",
|
||||
"ticketsAutoclosed":"Тікет автоматично закритий",
|
||||
"transcriptsCreated":"Транскрипт створено",
|
||||
"startupDate":"Дата запуску",
|
||||
"latestUpdate":"Останнє оновлення",
|
||||
"ticketCreatedOn":"Тікет створено",
|
||||
"ticketCreatedBy":"Тікет створено",
|
||||
"messagesSent":"Повідомлення відправлено",
|
||||
"status":"Стан",
|
||||
"participants":"Учасники",
|
||||
"role":"Роль",
|
||||
|
||||
"switches":{
|
||||
"globalAdmin":"Головна",
|
||||
"ticketAdmin":"Тікет",
|
||||
"member":"Учасник",
|
||||
"open":"Відкрити",
|
||||
"reopened":"Перевідкритий",
|
||||
"closed":"Закритий",
|
||||
"autoclosed":"Автоматично закритий"
|
||||
},
|
||||
|
||||
"errorUserNotFound":"Учасник не знайдений у базі даних статистики!"
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 65 KiB |
+4
-5
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "open-ticket",
|
||||
"version": "3.3.1",
|
||||
"version": "3.5.0",
|
||||
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "node index.js",
|
||||
"test": "node index.js --devconfig",
|
||||
"test": "node index.js --devconfig --noerrorupload",
|
||||
"slashEnable": "node index.js slash enable",
|
||||
"slashDisable": "node index.js slash disable",
|
||||
"cleardata": "node ./core/dynamicdatabase/cleardata.js"
|
||||
@@ -13,10 +13,9 @@
|
||||
"author": "DJdj Development",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"axios": "^0.27.2",
|
||||
"axios": "^1.6.2",
|
||||
"chalk": "^5.0.1",
|
||||
"discord.js": "^14.8.0",
|
||||
"node": "^16.10.0"
|
||||
"discord.js": "^14.14.1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
||||
+21
-3
@@ -7,12 +7,30 @@
|
||||
"useHTMLtranscripts":true
|
||||
},
|
||||
"style":{
|
||||
"titleColor":"#F8BA00",
|
||||
"background":{
|
||||
"enableCustomBackground":false,
|
||||
"backgroundModus":"color OR image",
|
||||
"backgroundData":"#abc123 OR https://www.example.com/image.png"
|
||||
"backgroundModus":"image OR color",
|
||||
"backgroundData":"image url OR hex color (#ffffff)"
|
||||
|
||||
},
|
||||
"header":{
|
||||
"enableCustomHeader":false,
|
||||
"backgroundColor":"#202225",
|
||||
"decoColor":"#F8BA00",
|
||||
"textColor":"#ffffff"
|
||||
|
||||
},
|
||||
"stats":{
|
||||
"enableCustomStats":false,
|
||||
"backgroundColor":"#202225",
|
||||
"keyTextColor":"#737373",
|
||||
"valueTextColor":"#ffffff",
|
||||
"hideBackgroundColor":"#40444a",
|
||||
"hideTextColor":"#ffffff"
|
||||
},
|
||||
"favicon":{
|
||||
"enableCustomFavicon":false,
|
||||
"imageUrl":"https://transcripts.dj-dj.be/favicon.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user