Compare commits

...
93 Commits
Author SHA1 Message Date
Jasper acc89990c2 Open Ticket v3.5.6
Open Ticket v3.5.6
2024-05-31 16:42:41 +02:00
DJj123dj ee9f8eaca1 v3.5.6 bug fix update 2024-05-31 16:36:08 +02:00
Jasper ae8a8d1b14 v3.5.5 hotfix (instant push)
v3.5.5 hotfix (instant push)
2024-05-12 11:14:40 +02:00
DJj123dj 38afb9c2a6 v3.5.5 hotfix (instant push) 2024-05-12 11:14:02 +02:00
Jasper 5bdb7941b6 Open Ticket v3.5.5
Open Ticket v3.5.5
2024-05-10 14:08:11 +02:00
DJj123dj 01c1f3150e v3.5.5 push 2 2024-05-04 14:36:36 +02:00
DJj123dj e524cccd19 v3.5.5 push 1 2024-05-04 14:22:41 +02:00
Jasper ede102bddf Add Latvian Translation (Part 4) 2024-04-27 11:22:05 +02:00
Jasper ab5d5c06be Latvian Translation (Part 3) 2024-04-27 11:17:31 +02:00
Jasper 355f078ee5 Add Latvian translation (Part 2) 2024-04-27 11:14:30 +02:00
Jasper c207560743 Add Latvian translation (Part 1)
Still requires checker.js validation & testing
2024-04-27 11:12:46 +02:00
Ronalds b29dfaeaae Create latvian.json 2024-04-27 12:06:57 +03:00
Jasper 1710111fcb Open Ticket Sponsoring!
Open Ticket Sponsoring!
2024-04-22 21:25:43 +02:00
Jasper 805c6b8e55 Open Ticket Sponsoring!
Lets goo! Open Ticket has sponsorships!
2024-04-22 21:24:55 +02:00
Jasper d0ab311da4 Fixed readme
Fixed readme
2024-04-08 23:30:21 +02:00
Jasper 92a3671768 Fixed README documentation links 2024-04-08 23:28:53 +02:00
Jasper 71074e1afe Open Ticket v3.5.4
Open Ticket v3.5.4
2024-04-04 15:38:22 +02:00
DJj123dj e80ce1a64a v3.5.4 push 2 2024-04-04 14:06:48 +02:00
DJj123dj 5dfbce1856 v3.5.4 push 1 2024-03-27 14:22:35 +01:00
Jasper 407e56a806 Open Ticket v3.5.3
Open Ticket v3.5.3
2024-02-05 21:34:56 +01:00
DJj123dj e0f42834e5 v3.5.3 push 2 2024-02-05 21:32:02 +01:00
DJj123dj d03abd9eeb v3.5.3 push 1 2024-01-27 20:32:27 +01:00
Jasper 466a4aea81 Open Ticket v3.5.2
Open Ticket v3.5.2
2024-01-10 17:12:37 +01:00
DJj123dj 9d96d11cd3 v3.5.2 2024-01-10 17:11:46 +01:00
Jasper e3b99e656e Open Ticket v3.5.1!
Open Ticket v3.5.1!
2023-12-25 19:01:13 +01:00
DJj123dj 07e2a68d06 v3.5.1 push 2 (fix button color bug) 2023-12-25 18:56:28 +01:00
DJj123dj 795ca4f981 v3.5.1 push 1 (translation update) 2023-12-23 14:19:36 +01:00
Jasper 5231129278 Open Ticket v3.5.0
Open Ticket v3.5.0
2023-12-17 14:13:30 +01:00
DJj123dj f62bc7adf9 v3.5.0 last push 2023-12-17 14:12:22 +01:00
DJj123dj 5de6b1e906 v3.5.0 translation push 2 + improved thai 2023-12-16 18:00:54 +01:00
DJj123dj 62413505d6 v3.5.0 translation push 1 + bug fix 2023-12-16 17:46:34 +01:00
DJj123dj 20b617f6eb v3.5.0 push 5 2023-12-14 21:37:29 +01:00
DJj123dj 94510bbfb0 v3.5.0 push 4 2023-12-13 21:39:18 +01:00
DJj123dj d51511fdb5 v3.5.0 push 3 2023-12-13 12:27:01 +01:00
DJj123dj 3447a37603 v3.5.0 push 2 2023-12-12 21:32:15 +01:00
DJj123dj 4b17aa640f v3.5.0 push 1 2023-11-29 19:29:27 +01:00
Jasper 3b7674f1a5 Open Ticket v3.4.4
v3.4.4
2023-11-09 20:37:10 +01:00
DJj123dj 7de9339da3 v3.4.4 2023-11-09 20:36:21 +01:00
Jasper e2e1e19bc8 Open Ticket v3.4.3
Open Ticket v3.4.3
2023-08-30 17:23:21 +02:00
DJj123dj 5f19adf561 v3.4.3 2023-08-30 17:22:26 +02:00
Jasper 1bb70745ea Open Ticket v3.4.2
Open Ticket v3.4.2
2023-08-11 11:23:50 +02:00
DJj123dj 589bbe5cd5 v3.4.2 2023-08-11 11:22:25 +02:00
Jasper 447fddea56 Open Ticket v3.4.1
Open Ticket v3.4.1
2023-06-17 12:20:40 +02:00
DJj123dj bf7a003799 Update slash.json 2023-06-17 12:18:41 +02:00
DJj123dj 6115ab1cc8 Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-06-17 12:16:26 +02:00
DJj123dj c2307fd1ed bug fix update v3.4.1 2023-06-17 12:16:23 +02:00
Jasper 2a3850c3cc Merge pull request #71 from NoOneNook/dev
Norwegian in slash.json | Dev- branch
2023-06-07 13:01:35 +02:00
NoOneNook 688c40ce7b Update slash.json
Translated slash.json into Norwegian
2023-06-07 03:16:44 +02:00
Jasper dee2a21be9 Update reopen.js 2023-05-19 16:23:12 +02:00
Jasper d7ae040d60 Removed readme warning
Update README.md
2023-05-19 15:03:22 +02:00
Jasper 7b6202985a Update README.md 2023-05-19 15:02:43 +02:00
Jasper a2f2c601a5 Open Ticket 3.4.0!
Open Ticket 3.4.0!
2023-05-19 15:02:09 +02:00
Jasper b27016df2e Merge branch 'main' into dev 2023-05-19 15:00:47 +02:00
DJj123dj 6341f2f71b v3.4.0 last push 2023-05-19 14:55:29 +02:00
DJj123dj 56a5b9c7d0 Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-05-17 21:43:59 +02:00
DJj123dj f608cb71ce v3.4.0 push 2 (html transcripts v2) 2023-05-17 21:43:57 +02:00
Jasper 7c7c325307 temp fix for bugs 2023-05-01 13:11:34 +02:00
Jasper 832021d72a Update russian.json
Update russian.json
2023-04-30 12:23:11 +02:00
Apexo 030554a7f5 Update russian.json 2023-04-30 13:17:08 +03:00
Jasper ada5ea0c5d temp fix for "forEach" bug
This is a temporary fix for the "Cannot read properties of undefined (reading 'forEach')" bug. This will be fixed in a better way in v3.4.0
2023-04-30 12:11:31 +02:00
DJj123dj fb6b891835 v3.4.0 push 1: fixed all currently known bugs 2023-04-29 09:15:56 +02:00
Jasper 739ad81f3f v3.3.3 MAJOR FIX!
v3.3.3 MAJOR FIX!
2023-04-22 16:53:32 +02:00
DJj123dj a6f67a9452 v3.3.3 MAJOR FIX! 2023-04-22 16:52:43 +02:00
Jasper 56a6540663 v3.3.2 extra
v3.3.2 extra
2023-04-19 18:45:55 +02:00
DJj123dj 5f8812d261 v3.3.2 push 2 2023-04-19 18:45:12 +02:00
Jasper 7a3dcf4c42 Open Ticket v3.3.2
Open Ticket v3.3.2
2023-04-19 18:43:38 +02:00
DJj123dj 7cebd4dd6a Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-04-19 18:39:23 +02:00
DJj123dj 27912a0c37 v3.3.2 2023-04-19 18:39:21 +02:00
Jasper 67871d885a Update dev
update dev branch
2023-03-23 14:22:29 +01:00
Jasper 1bd0d013ed Update config.json 2023-03-23 14:21:39 +01:00
Jasper a074a17519 Update issue templates 2023-03-23 14:15:25 +01:00
Jasper 67af96ef5c Update SECURITY.md 2023-03-23 14:10:38 +01:00
Jasper a041f28cf7 Update CONTRIBUTING.md 2023-03-23 14:10:03 +01:00
Jasper a8c9c2ea8d Create SECURITY.md 2023-03-23 13:35:08 +01:00
Jasper 8748301b04 Open Ticket v3.3.1
Open Ticket v3.3.1
2023-03-23 12:51:58 +01:00
DJj123dj 2d7a7b5728 v3.3.1 push 4 2023-03-23 12:46:53 +01:00
DJj123dj 0807ca884c Update ticketAutoclose.js 2023-03-21 20:10:06 +01:00
DJj123dj 0ead037fa8 v3.3.1 push 3 (autoclose spam fix) 2023-03-21 19:49:12 +01:00
DJj123dj 4287c11bf1 v3.3.1 push 2 (fixed dropdown crash) 2023-03-21 17:38:15 +01:00
DJj123dj 69fdc7ccf0 v3.3.1 BUG FIXES! (+ added Slovenian) 2023-03-20 20:01:09 +01:00
Jasper 6c213306b6 Add Slovenian language
add slovenian language
2023-03-19 12:51:12 +01:00
n1kkec 4096e8196d feat(language): add slovenian language 2023-03-19 12:47:24 +01:00
Jasper 94ee890848 Open Ticket v3.3!
Open Ticket v3.3!
2023-03-19 12:34:23 +01:00
DJj123dj 4dced819a3 v3.3 push 7 (added autoclose) 2023-03-19 12:29:24 +01:00
DJj123dj 1159af9fa9 v3.3 push 6 (added ticket claiming) 2023-03-18 11:48:01 +01:00
DJj123dj 67d429c52b v3.3 push 5 2023-03-16 20:58:08 +01:00
DJj123dj f67af805c1 v3.3 push 4 (1 entire afternoon of work)
My TODO list is too big :)
2023-03-15 20:57:14 +01:00
DJj123dj 944032f690 v3.3 push 3 (lots of small changes 😄) 2023-03-13 20:22:23 +01:00
DJj123dj ee248e86bc Merge branch 'dev' of https://github.com/DJj123dj/open-ticket into dev 2023-03-12 11:22:55 +01:00
DJj123dj b171bce62b v3.3 push 2 (added Polish) 2023-03-12 11:22:53 +01:00
Jasper df0bce0189 Delete test.txt 2023-03-01 14:31:36 +01:00
Jasper 2630aa899f Create test.txt 2023-03-01 14:03:50 +01:00
DJj123dj dba370d66e v3.3 push 1 & added turkish language 2023-02-25 21:02:31 +01:00
102 changed files with 5971 additions and 1543 deletions
+44 -3
View File
@@ -1,3 +1,44 @@
# 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?
4. [Have you read the documentation?](https://otdocs.dj-dj.be)
If there is translation missing, you 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: 31/5/2024<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>
Documentation: https://otdocs.dj-dj.be
+1
View File
@@ -0,0 +1 @@
github: DJj123dj
+2 -2
View File
@@ -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
---
+2 -2
View File
@@ -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
---
+40
View File
@@ -0,0 +1,40 @@
# Security Policy
## Supported Versions
Below, you can find a list with the status of every open ticket version. This list will change every update!
- ✅ Supported **(bugs, errors, discord support, documentation, html transcripts)**
- 🟧 Deprecated / Partially Supported **(discord support, documentation, html transcripts)**
- ❌ Fully Deprecated / Not Supported **(sometimes documentation)**
| Version | Supported | Until |
|-----------|-----------|-----------------------------|
| 3.5.6 | ✅ | |
| 3.5.5 | ✅ | June 2024 |
| 3.5.4 | 🟧 | Next Update |
| < 3.5.4 | ❌ | |
## 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: 31/5/2024<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
View File
@@ -13,6 +13,7 @@ storage/dynamicDB/
storage/slashcmdEnabled.txt
storage/database.json
storage/tsdatabase.json
storage/stats.json
storage/.DS_Store
.vscode/
livestatus.json
+68 -49
View File
@@ -1,66 +1,85 @@
<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>
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-3.2.2-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.2.2) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://docs.openticket.dj-dj.be)
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket" width="600px">
[![discord](https://img.shields.io/badge/discord-join%20our%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-3.5.6-brightgreen.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/releases/tag/v3.5.6) [![discord.js](https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm)]() [![license](https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square)](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [![stars](https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square)](https://otdocs.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 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://otdocs.dj-dj.be/)
## Features
- **🎉 NEW! html transcripts!**
## 📌 Features
- **🎉 advanced html transcripts!**
- 🔒 close, ❌ delete & ✅ re-open tickets
- 🇬🇧 translation in 12 different languages
- 🇬🇧 translation in 24 different languages
- 📄 very advanced customisation
- 🆗 buttons or 🔽 dropdowns!
- 🆒 plugins
- ∞ unlimited tickets & unlimited messages
- 🆒 custom plugins
- ∞ unlimited tickets & embeds
- ➕➖ add/remove users from a ticket
- 📊 ticket, user & global staticstics
- /slash & text commands
- 📥 reaction roles & url buttons
- 🖥️ discord.js v14 & axios
- 🎛️ latest discord integration
<details>
<summary><b>Click here for even more features!</b></summary>
- very customisable
- close tickets with reason
- also includes reaction roles!
- discord interaction buttons
- discord.js 14
</details>
## 📸 Preview
<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">
## preview
Images coming soon<br>
You can already see some images at our [documentation!](https://docs.openticket.dj-dj.be)
## 🩷 Sponsors
A big thanks to all our sponsors!
- <img src="https://github.com/SpyEye2.png" alt="Profile Picture" width="25px"></img> **[SpyEye](https://github.com/SpyEye2)**
- <img src="https://github.com/DOSEV5.png" alt="Profile Picture" width="25px"></img> **[DOSEV5](https://github.com/DOSEV5)**
- <img src="https://github.com/mods-hd.png" alt="Profile Picture" width="25px"></img> **[Mods HD](https://github.com/mods-hd)**
## 🛠️ Contributors
### Official Team
|Role |User (discord name)|
|-----------------|-------------------|
|Lead Developer |djj123dj |
|Support Team |sankedev |
|Support Team |vuur_draak |
## credits
DJdj Development Team
|Main Developer|Developer|Support Team|Designer|
|--------------|---------|-----------|---------|
|DJj123dj |Sanke |DJ-Lite |vuur_draak|
### Translators
|Language |Maintainer (discord name) |Status |
|-------------------|--------------------------|---------------|
|English |djj123dj |🟢 Up To Date |
|Dutch |djj123dj |🟢 Up To Date |
|French |sankedev & tostam |🟢 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 |deqressing |🟢 Up To Date |
|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 |
|Indonesian |erxg |🟢 Up To Date |
|Kurdish |raze.hama |🟢 Up To Date |
|Hungarian |Snowy |🔴 Outdated |
|Persian |sasanwm |🟢 Up To Date |
|Latvian |ronalds1398 |🟢 Up To Date |
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 |
## 📎 Links
current version: _v3.5.6_
</br>changelog: [click here](https://otgithub.dj-dj.be/releases)
</br>documentation: [click here](https://otdocs.dj-dj.be/)
## links
current version: _v3.2.2_
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
© 2023 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
© 2024 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
+48 -35
View File
@@ -18,62 +18,75 @@ 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
/**@type {discord.PermissionOverwriteManager} */
const overwrites = msg.channel.permissionOverwrites
overwrites.create(user.id,{
ViewChannel:true,
AddReactions:true,
AttachFiles:true,
EmbedLinks:true,
SendMessages:true,
ReadMessageHistory:true
},{reason:"Added user to ticket."})
msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
msg.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
msg.channel.send({embeds:[bot.embeds.commands.addEmbed(user,msg.author)]})
var loguser = msg.mentions.users.first()
log("command","someone used the 'add' command",[{key:"user",value:msg.author.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}])
var loguser = msg.mentions.users.first()
log("command","someone used the 'add' command",[{key:"user",value:msg.author.tag}])
log("system","user added to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"added_user",value:loguser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
})
APIEvents.onCommand("add",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
})
if (!DISABLE.commands.slash.add) client.on("interactionCreate",(interaction) => {
if (!DISABLE.commands.slash.add) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "add") return
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.reply({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.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
await interaction.deferReply()
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
interaction.reply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
/**@type {discord.PermissionOverwriteManager} */
const overwrites = interaction.channel.permissionOverwrites
overwrites.create(user.id,{
ViewChannel:true,
AddReactions:true,
AttachFiles:true,
EmbedLinks:true,
SendMessages:true,
ReadMessageHistory:true
},{reason:"Added user to ticket."})
interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
var loguser = user
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.tag}])
log("system","user added to ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
})
var loguser = user
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.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.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
})
}
+98 -66
View File
@@ -12,91 +12,123 @@ 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
var newtype = msg.content.split(config.prefix+"change")[1].substring(1)
if (!newtype) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
const newTicket = require("../core/utils/configParser").getTicketById(newtype)
const list = []
config.options.forEach((o) => list.push(o.id))
if (!newTicket) return bot.errorLog.invalidIdChooseFromList(list)
/**@type {String} */
var chName = msg.channel.name
const splitted = chName.split("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await msg.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) msg.channel.setParent(parent)
}
msg.channel.setName(newTicket.channelprefix+name)
msg.channel.send({embeds:[bot.embeds.commands.changeEmbed(msg.author,newtype)]})
log("command","someone used the 'change' command",[{key:"user",value:msg.author.tag}])
log("system","ticket type changed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
const list = []
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,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("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await msg.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) msg.channel.setParent(parent)
}
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.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",(interaction) => {
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.reply({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.deferReply()
interaction.channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
await interaction.deferReply()
var newtype = interaction.options.getString("type",true)
if (!newtype) return interaction.reply({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
const newTicket = require("../core/utils/configParser").getTicketById(newtype,true)
const list = []
config.options.forEach((o) => list.push(o.id))
if (!newTicket) return bot.errorLog.invalidIdChooseFromList(list)
/**@type {String} */
var chName = interaction.channel.name
const splitted = chName.split("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await interaction.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent)
}
interaction.channel.setName(newTicket.channelprefix+name)
interaction.reply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]})
log("command","someone used the 'change' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket type changed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newtype",value:newtype}])
APIEvents.onCommand("change",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
const list = []
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)
if (!newTicket) return interaction.editReply({embeds:[bot.errorLog.invalidIdChooseFromList(list,l.errors.missingArgsDescription+" `<type>`:\n`"+config.prefix+"change <type>`")]})
/**@type {discord.PermissionOverwriteManager} */
const prePermsManager = interaction.channel.permissionOverwrites
const prePerms = prePermsManager.cache
/**@type {String} */
var chName = interaction.channel.name
const splitted = chName.split("-")
const prefix = splitted.shift()
const name = (splitted.length > 0) ? splitted.join("-") : prefix
if (newTicket.category){
const parent = await interaction.guild.channels.fetch(newTicket.category,{cache:true})
if (parent && parent.type == discord.ChannelType.GuildCategory) interaction.channel.setParent(parent)
}
prePermsManager.set(prePerms)
interaction.channel.setName(newTicket.channelprefix+name).catch(() => {
interaction.channel.send({embeds:[bot.errorLog.failedRenameChannel]})
})
hiddendata.find((value,index) => {
if (value.key == "type"){
hiddendata[index] = {key:"type",value:newtype}
}
})
interaction.editReply({embeds:[bot.embeds.commands.changeEmbed(interaction.user,newtype)]})
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())
})
}
+62 -35
View File
@@ -5,6 +5,8 @@ const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const embed = discord.EmbedBuilder
const storage = bot.storage
const APIEvents = require("../core/api/modules/events")
const DISABLE = require("../core/api/api.json").disable
@@ -12,69 +14,94 @@ 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 => {
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 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.claimEmbed(claimingUser,msg.author)]})
msg.channel.send({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
const newEmbed = new embed(firstmsg.embeds[0].data)
.setFooter({text:"claimed by: "+msg.author.username,iconURL:msg.author.displayAvatarURL()})
var loguser = claimingUser
log("command","someone used the 'claim' command",[{key:"user",value:msg.author.tag}])
log("system","user claimed to ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
//APIEvents.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())
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.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.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
})
if (!DISABLE.commands.slash.claim) client.on("interactionCreate",(interaction) => {
if (!DISABLE.commands.slash.claim) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "claim") return
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.reply({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
return interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
}
interaction.channel.messages.fetchPinned().then(msglist => {
await interaction.deferReply()
hiddendata.push({key:"claimedby",value:user.id})
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
storage.set("claimData",interaction.channel.id,user.id)
await interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
//interaction.reply({embeds:[bot.embeds.commands.claimEmbed(user,interaction.user)]})
interaction.reply({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
var loguser = 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:loguser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
//APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
//APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
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.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.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.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
})
}
+38 -45
View File
@@ -24,37 +24,32 @@ module.exports = () => {
}
const reason = tempreason
msg.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (hiddendata.data.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
if (hiddendata.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
msg.channel.send({embeds:[bot.embeds.commands.closeEmbed(msg.author,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"close",reason,true)
log("command","someone used the 'close' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"close",reason,true)
log("command","someone used the 'close' command",[{key:"user",value:msg.author.username}])
APIEvents.onCommand("close",true,msg.author,msg.channel,msg.guild,new Date())
})
if (!DISABLE.commands.slash.close) client.on("interactionCreate",(interaction) => {
if (!DISABLE.commands.slash.close) client.on("interactionCreate",async(interaction) => {
if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "close") return
@@ -62,31 +57,29 @@ module.exports = () => {
const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false
interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.reply({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.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
await interaction.deferReply()
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",false,true)
log("command","someone used the 'close' command",[{key:"user",value:interaction.user.username}])
APIEvents.onCommand("close",true,interaction.user,interaction.channel,interaction.guild,new Date())
})
}
+40 -46
View File
@@ -16,71 +16,65 @@ 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)]})
msg.channel.send({embeds:[bot.embeds.commands.deleteEmbed(msg.author)]})
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").NEWcloseTicket(msg.member,msg.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("delete",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").closeManager(msg.member,msg.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:msg.author.username}])
APIEvents.onCommand("delete",permsChecker.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
})
if (!DISABLE.commands.slash.delete) client.on("interactionCreate",(interaction) => {
if (!DISABLE.commands.slash.delete) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "delete") return
//interaction.deferReply()
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.reply({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)]})
}
interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
await interaction.deferReply()
interaction.reply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
interaction.editReply({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("delete",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("../core/ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
log("command","someone used the 'delete' command",[{key:"user",value:interaction.user.username}])
APIEvents.onCommand("delete",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
})
}
+11 -7
View File
@@ -15,11 +15,15 @@ module.exports = () => {
const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix
const helpEmbed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setColor(config.color)
.setTitle("❔ "+l.helpMenu.title)
const header = config.system.ticket_channel ? l.helpMenu.header1.replace("{0}","<#"+config.system.ticket_channel+">") : l.helpMenu.header2
helpEmbed.setDescription(header+"`"+prefix+msgName+" <id>` ➜ _"+l.helpMenu.msgCmd+"_\n\n`"+prefix+"rename <name>` ➜ _"+l.helpMenu.renameCmd+"_\n`"+prefix+"close` ➜ _"+l.helpMenu.closeCmd+"_\n`"+prefix+"delete` ➜ _"+l.helpMenu.deleteCmd+"_\n`"+prefix+"reopen` ➜ _"+l.helpMenu.reopenCmd+"_\n\n`"+prefix+"add <user>` ➜ _"+l.helpMenu.addCmd+"_\n`"+prefix+"remove <user>` ➜ _"+l.helpMenu.removeCmd+"_\n\n`"+prefix+"change <newtype>` ➜ _Change ticket type._")
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:"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
@@ -29,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())
}
}
@@ -48,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())
})
}
+35 -34
View File
@@ -18,30 +18,29 @@ 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
/**@type {discord.PermissionOverwriteManager} */
const overwrites = msg.channel.permissionOverwrites
overwrites.delete(user.id,"Removed user from ticket.")
msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
msg.channel.permissionOverwrites.delete(user.id)
msg.channel.send({embeds:[bot.embeds.commands.removeEmbed(user,msg.author)]})
var loguser = msg.mentions.users.first()
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.tag}])
log("system","user removed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.tag}])
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
})
var loguser = msg.mentions.users.first()
log("command","someone used the 'remove' command",[{key:"user",value:msg.author.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.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,28 +49,30 @@ 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.reply({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.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
await interaction.deferReply()
interaction.channel.permissionOverwrites.delete(user.id)
interaction.reply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
/**@type {discord.PermissionOverwriteManager} */
const overwrites = interaction.channel.permissionOverwrites
overwrites.delete(user.id,"Removed user from ticket.")
interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
var loguser = user
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.tag}])
log("system","user removed from ticket",[{key:"user",value:interaction.user.tag},{key:"ticket",value:interaction.channel.name},{key:"removed_user",value:loguser.tag}])
var loguser = user
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.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())
})
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.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
})
}
+49 -56
View File
@@ -16,80 +16,73 @@ 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)
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>`")]})
if (!newname) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<name>`:\n`"+config.prefix+"rename <name>`")]})
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
if (!prefix) prefix = "noprefix-"
msg.channel.setName(prefix+newname)
msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.tag}])
log("system","ticket renamed",[{key:"user",value:msg.author.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
var name = msg.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
if (!prefix) prefix = "noprefix-"
msg.channel.setName(prefix+newname)
msg.channel.send({embeds:[bot.embeds.commands.renameEmbed(msg.author,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:msg.author.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",(interaction) => {
if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return
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.reply({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.deferReply()
interaction.channel.messages.fetchPinned().then(msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
await interaction.deferReply()
var newname = interaction.options.getString("name")
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
if (!prefix) prefix = "noprefix-"
interaction.channel.setName(prefix+newname)
interaction.reply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.tag}])
log("system","ticket renamed",[{key:"user",value:interaction.user.tag},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
var newname = interaction.options.getString("name")
var name = interaction.channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
if (!prefix) prefix = "noprefix-"
interaction.channel.setName(prefix+newname)
interaction.editReply({embeds:[bot.embeds.commands.renameEmbed(interaction.user,prefix+newname)]})
log("command","someone used the 'rename' command",[{key:"user",value:interaction.user.username}])
log("system","ticket renamed",[{key:"user",value:interaction.user.username},{key:"ticket",value:name},{key:"newname",value:newname}])
APIEvents.onCommand("rename",permsChecker.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
})
}
+19 -28
View File
@@ -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]})
msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]})
require("../core/ticketActions/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author)
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.tag}])
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
})
require("../core/ticketActions/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author,ticketId)
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
//interaction.deferReply()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
interaction.channel.messages.fetchPinned().then(async msglist => {
var firstmsg = msglist.last()
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
if (hiddendata.data.find(h => h.key == "pendingdelete")) return interaction.reply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
await interaction.deferReply()
await interaction.reply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
await interaction.editReply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.tag}])
APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
})
require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user,ticketId)
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())
})
}
}
+103
View File
@@ -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())
})
}
+8 -8
View File
@@ -23,23 +23,23 @@ 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
}
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
if (!id) return msg.channel.send({embeds:[bot.errorLog.invalidArgsMessage(l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]})
if (!id) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds,l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds,l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
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())
})
}
+79 -31
View File
@@ -5,6 +5,8 @@ const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const permsChecker = require("../core/utils/permisssionChecker")
const embed = discord.EmbedBuilder
const storage = bot.storage
const APIEvents = require("../core/api/modules/events")
const DISABLE = require("../core/api/api.json").disable
@@ -16,62 +18,108 @@ 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
}
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 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.unclaimEmbed(msg.author)]})
msg.channel.send({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
var loguser = msg.author
log("command","someone used the 'unclaim' command",[{key:"user",value:msg.author.tag}])
log("system","user unclaimed from ticket",[{key:"user",value:msg.author.tag},{key:"ticket",value:msg.channel.name},{key:"unclaimed_user",value:msg.author.tag}])
const newEmbed = new embed(firstmsg.embeds[0].data)
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())
})
if (ticketData && ticketData.autoclose.enable){
const footerText = l.commands.autocloseTitle.replace("{0}",ticketData.autoclose.inactiveHours+"h")
newEmbed.setFooter({text:footerText})
}else{
newEmbed.setFooter(null)
}
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}
msg.channel.send({embeds:[bot.embeds.commands.unclaimEmbed(msg.author)]})
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.ticket(msg.author.id,msg.guild.id,ticketId),msg.author,msg.channel,msg.guild,new Date())
})
})
if (!DISABLE.commands.slash.unclaim) client.on("interactionCreate",(interaction) => {
if (!DISABLE.commands.slash.unclaim) client.on("interactionCreate",async (interaction) => {
if (!interaction.isChatInputCommand()) return
if (interaction.commandName != "unclaim") return
const user = 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.reply({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
}
await interaction.deferReply()
const unclaimuser = storage.get("claimData",interaction.channel.id)
if (!unclaimuser || unclaimuser == "false") return interaction.editReply({embeds:[bot.errorLog.serverError("This ticket isn't claimed yet!")]})
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.reply({embeds:[bot.errorLog.notInATicket]})
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
if (firstmsg == undefined || firstmsg.author.id != client.user.id) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
//interaction.reply({embeds:[bot.embeds.commands.unclaimEmbed(interaction.user)]})
interaction.reply({embeds:[bot.errorLog.warning("Coming soon!","This feature isn't ready yet!\nIt will become active in the next update!")]})
var loguser = 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:loguser.tag}])
const newEmbed = new embed(firstmsg.embeds[0].data)
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())
})
if (ticketData && ticketData.autoclose.enable){
const footerText = l.commands.autocloseTitle.replace("{0}",ticketData.autoclose.inactiveHours+"h")
newEmbed.setFooter({text:footerText})
}else{
newEmbed.setFooter(null)
}
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled],embeds:[newEmbed]})
}else{
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal],embeds:[newEmbed]})
}
interaction.editReply({embeds:[bot.embeds.commands.unclaimEmbed(interaction.user)]})
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.ticket(interaction.user.id,interaction.guild.id,ticketId),interaction.user,interaction.channel,interaction.guild,new Date())
})
})
}
+48 -27
View File
@@ -1,10 +1,16 @@
{
"main_color":"#ffffff",
"server_id":"server id (for slash cmds)",
"auth_token":"auth token",
"main_adminroles":["discord role id"],
"_DOCUMENTATION":"https://otdocs.dj-dj.be",
"_SUPPORT":"https://discord.dj-dj.be",
"color":"#ffffff",
"serverId":"server id (for slash cmds)",
"token":{
"value":"insert your bot token here",
"fromENV":false
},
"adminRoles":["discord role id"],
"prefix":"!ticket ",
"languagefile":"english",
"languageFile":"english",
"status":{
"enabled":true,
@@ -13,13 +19,11 @@
},
"system":{
"ticket_channel":"channel id",
"max_allowed_tickets":3,
"enable_DM_Messages":true,
"maxAmountOfTickets":3,
"dmMessages":false,
"has@everyoneaccess":false,
"member_role":"member role (this role doesn't have access to tickets)",
"closeMode":"adminonly or normal (select one of the 2)",
"memberRole":"member role (leave empty if you have no member role)",
"closeMode":"adminonly OR normal (select one!)",
"transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!",
@@ -27,10 +31,9 @@
"answerInEphemeralOnOpen":true
},
"SUPPORT":"Take look at our wiki: https://docs.openticket.dj-dj.be or join our discord server: https://discord.dj-dj.be if you need support!",
"options":[
{
"id":"general",
"id":"example-ticket",
"name":"Question",
"description":"Create this ticket if you have a question.",
"icon":"🎫",
@@ -39,8 +42,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!*",
@@ -51,17 +55,30 @@
},
"image":{
"enable":false,
"url":"https://www.dj-dj.be/wp-content/uploads/2022/09/pfp-cropped.png"
"url":"https://www.example.com/catmemes/cat.png"
},
"closedCategory":{
"enable":false,
"id":"category id"
},
"autoclose":{
"enable":false,
"inactiveHours":24
},
"ping":{
"@here":true,
"@everyone":false,
"custom":{
"enable":false,
"roleId":"012345678910"
}
}
},
{
"id":"website",
"id":"example-website",
"name":"Website",
"description":"Go to our website.",
"icon":"✅",
@@ -69,41 +86,45 @@
"type":"website",
"url":"https://www.dj-dj.be"
},
{
"id":"role",
"name":"Verify",
"description":"Click here to get the verify role.",
"icon":"👮🏼",
"label":"get a role",
"id":"example-role",
"name":"Update Ping",
"description":"Click here to get pinged for updates!",
"icon":"📢",
"label":"Update Ping",
"type":"role",
"color":"red",
"roles":["discord role id"],
"mode":"add&remove|remove|add",
"enableDmOnOpen":true
}
],
"messages":[
{
"id":"1",
"id":"example-embed",
"name":"Choose Your Ticket",
"description":"You can click one of the buttons below!",
"dropdown":false,
"enableFooter":false,
"footer":"Open Ticket v3.2.2 - I'm a footer!",
"footer":"Open Ticket v3.5.6 - 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",
"options":["general","apply"],
"options":["example-ticket","example-website","example-role"],
"other":{
"enableTicketExplaination":true,
+1 -1
View File
@@ -4,7 +4,7 @@ const bot = require("../../index")
exports.client = bot.client
exports.config = bot.config
exports.utils = {
log:bot.errorLog.log(),
log:bot.errorLog.log,
storage:bot.storage
}
+4 -2
View File
@@ -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":{
-8
View File
@@ -1,8 +0,0 @@
/** FOR DEVELOPERS ONLY!!
* Don't change anything in this file before reading the documentation!
* visit the api documentation at https://docs.openticket.dj-dj.be
*/
exports.embeddedMode = false
exports.clientLocation = require("../../../index").client
+1 -1
View File
@@ -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 */
/**
*
+16 -10
View File
@@ -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){
try {
const data = fs.readFileSync("./apiDebug.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")
}
if (api.enableAPIdebug || debugMode) {
console.error(theError)
}
try {
const data = fs.readFileSync("./openticketdebug.txt")
const newData = data ? data.toString() : ""
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 })
}
+123 -91
View File
@@ -29,23 +29,23 @@ exports.checker = async () => {
/**@param {"userid"|"roleid"|"channelid"|"serverid"|"categoryid"} mode @param {String} value @param {String} path */
const checkDiscord = (mode,value,path) => {
if (mode == "userid"){
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+"' | this user id is invalid")
}
}else if (mode == "channelid"){
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+"' | this channel id is invalid")
}
}else if (mode == "roleid"){
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+"' | this role id is invalid")
}
}else if (mode == "serverid"){
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+"' | this server id is invalid")
}
}else if (mode == "categoryid"){
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+"' | this category id is invalid")
}
}
@@ -53,9 +53,9 @@ exports.checker = async () => {
/**@param {String} value */
const checkToken = (value) => {
if (value.length < 40){
createError("'auth_token' | your token is invalid")
createError("'token/value' | your token is invalid")
}
if (value.includes(" ")) createError("'auth_token' | your token includes spaces!")
if (value.includes(" ")) createError("'token/value' | your token includes spaces!")
}
/**@param {String} value @param {String} path */
@@ -90,25 +90,25 @@ exports.checker = async () => {
}
if (mode == "userid"){
arrayValue.forEach((value,index) => {
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+":"+index+"' | this user id is invalid")
}
})
}else if (mode == "channelid"){
arrayValue.forEach((value,index) => {
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+":"+index+"' | this channel id is invalid")
}
})
}else if (mode == "roleid"){
arrayValue.forEach((value,index) => {
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+":"+index+"' | this role id is invalid")
}
})
}else if (mode == "serverid"){
arrayValue.forEach((value,index) => {
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
if (value.length < 16 || value.length > 40 || !/^\d+$/.test(value)){
createError("'"+path+":"+index+"' | this server id is invalid")
}
})
@@ -119,24 +119,29 @@ exports.checker = async () => {
if (type == "boolean"){
if (typeof value != "boolean"){
createError("'"+path+"' | invalid type, this must be a boolean!")
}
return true
}else return false
}else if (type == "number"){
if (typeof value != "number"){
createError("'"+path+"' | invalid type, this must be a number!")
}
return true
}else return false
}else if (type == "string"){
if (typeof value != "string"){
createError("'"+path+"' | invalid type, this must be a string!")
}
return true
}else return false
}else if (type == "array"){
if (!Array.isArray(value)){
createError("'"+path+"' | invalid type, this must be an array!")
}
return true
}else return false
}else if (type == "object"){
if (typeof value != "object"){
createError("'"+path+"' | invalid type, this must be an object!")
}
}
return true
}else return false
}else return false
}
const checkButtonColor = (value,path) => {
@@ -174,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)
@@ -256,6 +261,14 @@ exports.checker = async () => {
createError("'"+path+"/closedCategory' | there is no closedCategory object!")
}
//autoclose
if (option.autoclose){
checkType(option.autoclose.enable,"boolean",path/"/autoclose/enable")
checkType(option.autoclose.inactiveHours,"number",path/"/autoclose/id")
}else{
createError("'"+path+"/autoclose' | there is no autoclose object!")
}
}else if (type == "website"){
//url
checkType(option.url,"string",path+"/url")
@@ -337,17 +350,19 @@ exports.checker = async () => {
}
//OPTIONS!!!
var counter = 0
input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}})
if (checkType(input.options,"array",path+"/options")){
var counter = 0
input.options.forEach((option) => {if (!configParser.optionExists(option)){counter++}})
if (counter == input.options.length){
createWarn("'"+path+"/options' | insert the option ids here!")
}else{
input.options.forEach((option,index) => {
if (!configParser.optionExists(option)){
createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!")
}
})
if (counter == input.options.length){
createWarn("'"+path+"/options' | insert the option ids here!")
}else{
input.options.forEach((option,index) => {
if (!configParser.optionExists(option)){
createWarn("'"+path+"/options:"+index+"' | this option doesnt exist!")
}
})
}
}
//other
@@ -387,39 +402,65 @@ exports.checker = async () => {
}
}
//--------------------------|
//--------------------------|
//checker => START HERE |
//--------------------------|
//--------------------------|
//////////////////////////////////////////
//////////////////////////////////////////
/////////!!! CHECKER.JS START !!!/////////
//////////////////////////////////////////
//////////////////////////////////////////
var configArray = ["main_color","server_id","auth_token","main_adminroles","prefix","languagefile","status","system","options","messages"]
var configArray = ["color","serverId","token","adminRoles","prefix","languageFile","status","system","options","messages"]
configArray.forEach((item) => {
if (config[item] == undefined){
throw new Error("\n\nMAIN ERROR: the item '"+item+"' doesn't exist in config.json")
}
})
checkHexColor(config.main_color,"main_color")
checkDiscord("serverid",config.server_id,"server_id")
checkHexColor(config.color,"main_color")
checkDiscord("serverid",config.serverId,"serverId")
if (!require("./api/api.json").disable.checkerjs.token) checkToken(config.auth_token)
if (!require("./api/api.json").disable.checkerjs.token && !config.token.fromENV) checkToken(config.token.value)
checkType(config.main_adminroles,"array","/main_adminroles")
checkDiscordArray("roleid",config.main_adminroles,"main_adminroles")
checkString(config.prefix,1,15,"prefix","prefix")
//languagefile
checkType(config.languagefile,"string","languagefile")
const lf = config.languagefile
checkType(config.adminRoles,"array","/adminRoles")
checkDiscordArray("roleid",config.adminRoles,"adminRoles")
checkString(config.prefix,1,40,"prefix","prefix")
if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian")){
createError("'languagefile' | invalid language, more info in the wiki")
//languagefile
checkType(config.languageFile,"string","languageFile")
const languageList = [
"custom",
"english",
"dutch",
"romanian",
"german",
"arabic",
"spanish",
"portuguese",
"french",
"italian",
"czech",
"danish",
"russian",
"turkish",
"polish",
"slovenian",
"thai",
"norwegian",
"greek",
"ukrainian",
"hungarian",
"indonesian",
"kurdish",
"persian",
"latvian"
]
if (!languageList.some((l) => config.languageFile.startsWith(l))){
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){
@@ -430,28 +471,18 @@ exports.checker = async () => {
//system:
//ticket channel
if (config.system.ticket_channel){
if (config.system.ticket_channel.length < 16 || config.system.ticket_channel.length > 20 || !/^\d+$/.test(config.system.ticket_channel)){
createError("'system/ticket_channel' | this channel id is invalid")
}
}else createWarn("'"+path+"' | you have no ticket channel selected!")
//max tickets
checkType(config.system.max_allowed_tickets,"number","system/max_allowed_tickets")
checkType(config.system.maxAmountOfTickets,"number","system/maxAmountOfTickets")
//enableDMmessages
checkType(config.system.enable_DM_Messages,"boolean","system/enable_DM_Messages")
checkType(config.system.dmMessages,"boolean","system/dmMessages")
//has@everyoneaccess
checkType(config.system["has@everyoneaccess"],"boolean","system/has@everyoneaccess")
//member_role
checkType(config.system.member_role,"string","system/member_role")
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
checkDiscord("roleid",config.system.member_role,"system/member_role")
//memberRole
checkType(config.system.memberRole,"string","system/memberRole")
if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
checkDiscord("roleid",config.system.memberRole,"system/memberRole")
}else{
createWarn("'system/member_role' | You don't have a member role, but it's recommended!")
createWarn("'system/memberRole' | You don't have a member role, but it's recommended!")
}
//closemode
@@ -478,34 +509,35 @@ exports.checker = async () => {
//the end
if (errorList.length > 0 || warnList.length > 0){
console.log("REPORT:\n===========================")
}
warnList.forEach((w) => {
const splitw = w.split("'")
if (splitw.length > 1){
var splitstring = chalk.yellow(splitw[0])+chalk.blue("'"+splitw[1]+"'")+chalk.yellow(splitw[2])
if (splitw[3]){splitstring = splitstring+chalk.yellow(splitw[3])}
if (splitw[4]){splitstring = splitstring+chalk.yellow(splitw[4])}
if (splitw[5]){splitstring = splitstring+chalk.yellow(splitw[5])}
}else {var splitstring = chalk.yellow(splitw[0])}
console.log(splitstring)
})
errorList.forEach((e) => {
const splite = e.split("'")
if (splite.length > 1){
var splitstring = chalk.red(splite[0])+chalk.blue("'"+splite[1]+"'")+chalk.red(splite[2])
}else {var splitstring = chalk.red(splite[0])}
console.log(splitstring)
})
if (isError){
console.log("===========================")
console.log("=> "+chalk.bgRed("your bot doesn't work if you don't fix the above errors!"))
if (isWarn){
console.log("\n=> "+chalk.bgYellow("if you ignore warns, some things may work differently than expected!"))
warnList.forEach((w) => {
const splitw = w.split("'")
if (splitw.length > 1){
var splitstring = chalk.yellow(splitw[0])+chalk.blue("'"+splitw[1]+"'")+chalk.yellow(splitw[2])
if (splitw[3]){splitstring = splitstring+chalk.yellow(splitw[3])}
if (splitw[4]){splitstring = splitstring+chalk.yellow(splitw[4])}
if (splitw[5]){splitstring = splitstring+chalk.yellow(splitw[5])}
}else {var splitstring = chalk.yellow(splitw[0])}
console.log(splitstring)
})
errorList.forEach((e) => {
const splite = e.split("'")
if (splite.length > 1){
var splitstring = chalk.red(splite[0])+chalk.blue("'"+splite[1]+"'")+chalk.red(splite[2])
}else {var splitstring = chalk.red(splite[0])}
console.log(splitstring)
})
if (isError){
console.log("===========================")
console.log("=> "+chalk.bgRed("your bot doesn't work if you don't fix the above errors!"))
if (isWarn){
console.log("\n=> "+chalk.bgYellow("if you ignore warns, some things may work differently than expected!"))
}
console.log(chalk.bold.green("\nDOCUMENTATION => https://otdocs.dj-dj.be\nSUPPORT => https://discord.dj-dj.be\n"))
process.exit(0)
}else if (isWarn){
console.log("===========================")
console.log("=> "+chalk.bgYellow("if you ignore warns, some things may work differently than expected!"))
console.log(chalk.bold.green("\nDOCUMENTATION => https://otdocs.dj-dj.be\nSUPPORT => https://discord.dj-dj.be\n"))
}
process.exit(0)
}else if (isWarn == true && isError == false){
console.log("===========================")
console.log("=> "+chalk.bgYellow("if you ignore warns, some things may work differently than expected!"))
}
}
-53
View File
@@ -1,53 +0,0 @@
const fs = require('fs')
const readline = require("readline")
const rl = readline.createInterface({
input:process.stdin,
output:process.stdout,
terminal:true
})
const ask = async () => {
const chalk = await (await import("chalk")).default
rl.question(chalk.yellow("WARNING: are you sure that there are",chalk.red("no tickets open"),"at the moment? ")+chalk.green("(yes/no)")+"\n",(answer) => {
if (answer != "1" && !answer.toLowerCase().startsWith("yes")){
console.log(chalk.red("invalid answer"))
ask()
return
}
console.log(chalk.green("clearing data..."))
runClear()
rl.close()
})
}
ask()
const runClear = async () => {
const chalk = await (await import("chalk")).default
//console.log(chalk.blue("You can get a node.js warning below, just ignore that, it's not important!"))
const dataPaths = ["./storage/dynamicDB"]
var index = 0
dataPaths.forEach((path) => {
try {
fs.rmSync(path,{recursive:true,force:true})
}catch{
//console.log(path,"doesn't exist")
}
setTimeout(() => {
try{
fs.mkdirSync(path)
}catch{
//console.log(path,"already exists")
}
index++
},500)
})
setInterval(() => {
if (index >= 1){
console.log(chalk.bgGreen("All local data is cleared!"))
process.exit(1)
}
},500)
}
@@ -47,6 +47,17 @@ exports.get = (category,key) => {
const result = tempresult ? tempresult.value : false
return result
}
/**
* @param {String} category
* @returns {[{key:String,value:String}]|false}
*/
exports.getCategory = (category) => {
const currentData = getData()
const result = currentData.filter((v) => v.category == category)
return result
}
/**
* @param {String} category
* @param {String} key
+87
View File
@@ -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")
+17 -3
View File
@@ -1,9 +1,23 @@
/**
==================================================================
ALL DATABASE FILES NEED TO EXPORT THE FOLLOWING FUNCTIONS:
- get(category:String,key:String) => String (value)
- set(category:String,key:String,value:String) => Boolean (success)
- delete(category:String,key:String) => Boolean (success)
- getCategory(category:String) => Array[{key:String,value:String}] (key,value)
==================================================================
*/
try {
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
}
+20 -14
View File
@@ -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,32 +42,38 @@ 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
}
/**@param {String[]} list */
exports.invalidIdChooseFromList = (list) => {
/**@param {String[]} list @param {String|undefined} message */
exports.invalidIdChooseFromList = (list,message) => {
const beforemsg = message ? message+"\n\n" : ""
var x = new embed()
.setColor(c.Red)
.setTitle(":x: "+l.errors.chooseFromListTitle)
.setDescription(l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
.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)
/**@param {String} message @param {String} title */
exports.success = (title,message) => {
var x = new embed()
.setColor(config.main_color)
.setTitle(":white_check_mark: "+title)
.setColor(config.color)
.setTitle("✅ "+title)
.setDescription(message)
return x
@@ -77,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
+1 -1
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
+69 -1
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -15,6 +15,14 @@ const bs = discord.ButtonStyle
exports.firstmsgRowNormal = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(false)
.setStyle(bs.Success)
.setLabel("Claim Ticket")
.setEmoji("📌")
)
.addComponents(
new button()
.setCustomId("OTcloseTicket")
@@ -33,6 +41,66 @@ exports.firstmsgRowNormal = new arb()
)
exports.firstmsgRowDisabled = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(false)
.setStyle(bs.Success)
.setLabel("Claim Ticket")
.setEmoji("📌")
)
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(true)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
exports.firstmsgRowNormalNoClaim = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel("Claim Ticket")
.setEmoji("📌")
)
.addComponents(
new button()
.setCustomId("OTcloseTicket")
.setDisabled(false)
.setStyle(bs.Secondary)
.setLabel(l.buttons.close)
.setEmoji("🔒")
)
.addComponents(
new button()
.setCustomId("OTdeleteTicket")
.setDisabled(false)
.setStyle(bs.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
exports.firstmsgRowDisabledNoClaim = new arb()
.addComponents(
new button()
.setCustomId("OTclaimTicket")
.setDisabled(true)
.setStyle(bs.Secondary)
.setLabel("Claim Ticket")
.setEmoji("📌")
)
.addComponents(
new button()
.setCustomId("OTcloseTicket")
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
+25 -10
View File
@@ -7,7 +7,7 @@ const log = bot.errorLog.log
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
/**
*
@@ -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,12 +47,27 @@ 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
}
/**
*
* @param {discord.User} closer
* @param {Number} time
* @returns {discord.EmbedBuilder}
*/
exports.autocloseSignalEmbed = (closer,time) => {
const embd = new embed()
.setTitle("⏰ This ticket got closed by Autoclose!")
.setColor(mc)
.setFooter({text:closer.username,iconURL:closer.displayAvatarURL()})
.setDescription("This ticket has been inactive for `"+time+"h`!")
return embd
}
/**
*
* @param {discord.User} deleter
@@ -62,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()})
}
/**
@@ -75,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()})
}
/**
@@ -87,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()})
}
/**
@@ -100,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()})
}
/**
@@ -112,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()})
}
/**
@@ -125,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()})
}
@@ -0,0 +1,60 @@
const discord = require('discord.js')
const bot = require('../../../../index')
const client = bot.client
const config = bot.config
const l = bot.language
const log = bot.errorLog.log
const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const embed = discord.EmbedBuilder
const mc = config.color
const permsChecker = require("../../../utils/permisssionChecker")
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
const bs = discord.ButtonStyle
module.exports = () => {
//CLAIM
client.on("interactionCreate",async interaction => {
if (!interaction.isButton()) return
if (interaction.customId != "OTclaimTicket") return
try {
await interaction.deferUpdate()
}catch{}
if (!interaction.guild) return
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
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 newEmbed = new embed(firstmsg.embeds[0].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)]})
})
})
}
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -23,7 +23,7 @@ module.exports = () => {
if (interaction.customId != "OTcloseTicketTrue") return
try {
interaction.deferUpdate()
await interaction.deferUpdate()
} catch{}
if (closeTicketButtonChecker == true) return
@@ -31,18 +31,31 @@ 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)
}
interaction.message.edit({components:[firstcomponents]})
interaction.message.edit({components:firstcomponents})
closeTicketButtonChecker = false
return
}
}
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
const claimdata = storage.get("claimData",interaction.channel.id)
if (claimdata && claimdata != "false"){
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim]})
}else{
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabled]})
}
}else{
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
}
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
/**
* @type {String}
@@ -57,7 +70,7 @@ module.exports = () => {
})
interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",false,true)
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",false,true)
closeTicketButtonChecker = false
})
}
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -56,12 +56,16 @@ 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)
}
interaction.message.edit({components:[firstcomponents]})
interaction.message.edit({components:firstcomponents})
closeTicketButtonChecker = false
return interaction.deferUpdate()
}
@@ -93,7 +97,7 @@ module.exports = () => {
})
//interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"close",reason,true)
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",reason,true)
closeTicketButtonChecker = false
})
}
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -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)
}
@@ -52,7 +56,7 @@ module.exports = () => {
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker = false
})
@@ -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)
}
@@ -92,7 +100,7 @@ module.exports = () => {
await interaction.message.edit({components:[bot.buttons.close.closeCommandRowDisabled]})
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
await require("../../../ticketActions/ticketCloser").NEWcloseTicket(interaction.member,interaction.channel,prefix,"delete",false,true)
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
deleteTicketButtonChecker1 = false
})
@@ -9,7 +9,7 @@ const permissionChecker = require("../../../utils/permisssionChecker")
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -17,12 +17,25 @@ 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()
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
if (hiddendata.length < 1) return interaction.reply({embeds:[bot.errorLog.notInATicket]})
const ticketId = hiddendata.find(d => d.key == "type").value
if (config.system.closeMode == "adminonly"){
if (!permissionChecker.ticket(interaction.user.id,interaction.guild.id,ticketId)){
if (!permissionChecker.sendUserNoPerms(interaction.user)){
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
}
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)
require("../../../ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user,ticketId)
})
}
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -7,4 +7,5 @@ module.exports = () => {
require("./accepted/reopening")()
require("./accepted/deleting")()
require("./accepted/closingReason")()
require("./accepted/claiming")()
}
+35 -15
View File
@@ -8,7 +8,7 @@ const log = bot.errorLog.log
const storage = bot.storage
const hiddendata = bot.hiddenData
const embed = discord.EmbedBuilder
const mc = config.main_color
const mc = config.color
const button = discord.ButtonBuilder
const arb = discord.ActionRowBuilder
@@ -16,64 +16,84 @@ 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{}
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
const claimdata = storage.get("claimData",interaction.channel.id)
if (claimdata && claimdata != "false"){
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim]})
}else{
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal]})
}
}else{
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
}
})
//DELETE
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{}
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
const claimdata = storage.get("claimData",interaction.channel.id)
if (claimdata && claimdata != "false"){
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim]})
}else{
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal]})
}
}else{
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
}
})
//DELETE NO TRANSCRIPT
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]})
})
+9 -4
View File
@@ -4,11 +4,10 @@ if (index.developerConfig){
var config = require("../devconfig.json")
}else{var config = require("../config.json")}
var localLanguage = require("../language/english.json")
const fs = require("fs")
const lfexists = fs.existsSync("./language/"+config.languagefile+".json")
if (lfexists) localLanguage = require("../language/"+config.languagefile+".json")
const lfexists = fs.existsSync("./language/"+config.languageFile+".json")
if (lfexists) localLanguage = require("../language/"+config.languageFile+".json")
const errorLog = async () => {
const chalk = await (await import("chalk")).default
@@ -20,6 +19,12 @@ const successLog = async (language) => {
const chalk = await (await import("chalk")).default
require("./startscreen").headerDataLanguage("sucessfully loaded language "+language,false)
index.actionRecorder.push({
category:"ot.managers.language",
file:"./core/languageManager.js",
time:new Date().getTime(),
type:"language.success"
})
}
if (!localLanguage){
@@ -30,5 +35,5 @@ if (!localLanguage){
runError()
}else{
exports.language = localLanguage
successLog(config.languagefile)
successLog(config.languageFile)
}
+30 -8
View File
@@ -11,13 +11,17 @@ 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
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.interactionCreated"
})
const optionidRaw = interaction.isStringSelectMenu() ? interaction.values[0] : interaction.customId
@@ -28,7 +32,7 @@ module.exports = async () => {
return
}else{
try {
interaction.deferUpdate()
await interaction.deferUpdate()
} catch{}
}
@@ -40,35 +44,53 @@ module.exports = async () => {
const user = interaction.member
if (mode == "add"){
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.type.add"
})
option.roles.forEach((role) => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
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())
})
}else if (mode == "remove"){
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.type.remove"
})
option.roles.forEach((role) => {
interaction.guild.members.cache.find(u => u.id == user.id).roles.remove(role)
log("system","removed role (reaction roles)",[{key:"user",value:interaction.user.tag},{key:"role",value:role}])
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())
})
}else if (mode == "add&remove"){
bot.actionRecorder.push({
category:"ot.managers.reactionroles",
file:"./core/reactionRoles.js",
time:new Date().getTime(),
type:"reactionRoles.type.add&remove"
})
option.roles.forEach((role) => {
if (!interaction.guild.members.cache.find(u => u.id == user.id).roles.cache.has(role)){
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
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())
}
+1 -1
View File
@@ -8,7 +8,7 @@ const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType
module.exports = async () => {
const sid = config.server_id
const sid = config.serverId
const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */
+51 -13
View File
@@ -7,9 +7,10 @@ const configParser = require("../utils/configParser")
const act = discord.ApplicationCommandType
const acot = discord.ApplicationCommandOptionType
module.exports = async () => {
/**@param {Boolean|undefined} invisible*/
module.exports = async (invisible) => {
const chalk = (await import("chalk")).default
const sid = config.server_id
const sid = config.serverId
const ids = configParser.getTicketValuesArray("id")
/**@type {[{name:String,value:String}]} */
@@ -30,17 +31,20 @@ module.exports = async () => {
var readystats = 0
//process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)")
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){
const fs = require("fs")
fs.writeFileSync("./storage/slashcmdEnabled.txt","true")
console.log(chalk.green("\nready!"))
console.log(chalk.blue("you can now start the bot with "+chalk.bgBlue("'npm start'")+"!"))
process.exit(1)
}
},100)
if (!invisible){
setInterval(() => {
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)
}
},100)
}
const fs = require("fs")
fs.writeFileSync("./storage/slashcmdEnabled.txt",require("../../package.json").version)
//slashtranslation
const ST = require("../../language/slashcmds/slash.json").data
@@ -264,4 +268,38 @@ module.exports = async () => {
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++
})
}
+9 -5
View File
@@ -14,6 +14,9 @@ const showFlags = async (chalk) => {
if (process.argv.some((v) => v == "--nochecker")) console.log(chalk.blue("[FLAGS] => disabled checker.js")); isFlag = true
if (process.argv.some((v) => v == "--tsoffline")) console.log(chalk.blue("[FLAGS] => offline check for html transcripts disabled!")); isFlag = true
if (process.argv.some((v) => v == "--debug")) console.log(chalk.blue("[FLAGS] => enabled DEBUG mode")); isFlag = true
if (process.argv.some((v) => v == "--noslash")) console.log(chalk.blue("[FLAGS] => slash commands disabled")); isFlag = true
if (process.argv.some((v) => v == "--localstatus")) console.log(chalk.blue("[FLAGS] => using local livestatus.json")); isFlag = true
if (process.argv.some((v) => v == "--noerrorupload")) console.log(chalk.blue("[FLAGS] => not uploading errors to liveStatus")); isFlag = true
if (!isFlag) console.log(chalk.blue("no flags!"))
}
@@ -22,7 +25,7 @@ exports.run = async () => {
const chalk = await (await import("chalk")).default
console.log(chalk.hex("f8ba00")(logo))
const version = require("../package.json").version
var headertext = "v"+version+" - Support: https://discord.dj-dj.be - Language: "+config.languagefile
var headertext = "v"+version+" - Support: https://discord.dj-dj.be - Language: "+config.languageFile
const spaceamount = (84-headertext.length)/2
var i = 0
while (i < spaceamount){
@@ -48,7 +51,7 @@ exports.headerDataReady = (chalk,status,updatingslash,slashmode) => {
console.log("\n\n"+chalk.red(chalk.underline("STARTING IN SLASH CMD CONFIGURATION MODE!")))
return
}
console.log(chalk.hex("f8ba00")("updating slash cmds: ")+chalk.bold(slashmode))
console.log(chalk.hex("f8ba00")("updating slash cmds: ")+chalk.bold(updatingslash))
}
var languageMSG = ""
@@ -62,14 +65,15 @@ exports.headerDataLanguage = async (message,err) => {
languageErr = err
}
/**
* @param {{total:Number,error:Number,success:Number}} plugins
*/
/**@param {{total:Number,error:Number,success:Number}} plugins*/
exports.headerDataPlugins = async (plugins) => {
const chalk = await (await import("chalk")).default
const lmsg = languageErr ? chalk.red(languageMSG) : languageMSG
console.log(chalk.hex("f8ba00")("language: ")+lmsg)
console.log(chalk.hex("f8ba00")("plugins loaded: ")+chalk.bold(plugins.total+" total ")+"("+plugins.success+"✅ "+plugins.error+"❌)")
console.log("\n"+chalk.bold(chalk.underline("LIVESTATUS:")))
await require("./utils/liveStatus").run(plugins)
console.log("\n"+chalk.bold(chalk.underline("LOGS:")))
}
+383
View File
@@ -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.id+">") : []
//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.id+">" : "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
}
+65
View File
@@ -0,0 +1,65 @@
const discord = require('discord.js')
const bot = require('../../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const l = bot.language
const storage = bot.storage
module.exports = () => {
setInterval(async () => {
try{
const tickets = storage.getCategory("autocloseTickets")
if (!tickets) return
tickets.forEach(async (t) => {
if (t.value == "false" || t.value == 0 || typeof t.value != "number") return
try{
const channel = await client.channels.fetch(t.key,{cache:true})
if (!channel || !channel.isTextBased()) return
const message = (await channel.messages.fetch({limit:10})).first()
if (!message) return
const secondsSLM = Math.round((new Date().getTime() - message.createdTimestamp)/1000)
const hoursSLM = secondsSLM/3600
if (hoursSLM > t.value){
/**@type {discord.Guild|false} */
const guild = client.guilds.cache.find((g) => g.id == channel.guild.id)
if (!guild) return
const clientMember = guild.members.cache.find((m) => m.id == client.user.id)
if (!clientMember) return
var name = channel.name
var prefix = ""
const tickets = config.options
tickets.forEach((ticket) => {
if (name.startsWith(ticket.channelprefix)){
prefix = ticket.channelprefix
}
})
require("./ticketCloser").closeManager(clientMember,channel,prefix,"close","OTautoclose",true)
storage.delete("autocloseTickets",channel.id)
//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]})
}
}catch{
log("system","can't find autoclose channel with ID: "+t.key)
storage.delete("autocloseTickets",t.key)
}
})
}catch{}
},120000)
}
+81 -112
View File
@@ -18,7 +18,7 @@ const pendingDelete = []
* @param {Boolean} nomessage
* @param {String} reason only when closing, not when deleting!
*/
exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) => {
exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
const guild = channel.guild
const user = member.user
const chalk = await (await import("chalk")).default
@@ -35,7 +35,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
const ticketOpenerChannelName = channelname.split(prefix)[1]
//get user that opened the ticket
var getuserID = storage.get("userTicketStorage",channel.id)
var getuserID = storage.get("userFromChannel",channel.id)
try {
var ticketOpener = client.users.cache.find(u => u.id === getuserID)
var isDatabaseError = false
@@ -51,9 +51,14 @@ exports.NEWcloseTicket = 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,39 +68,44 @@ exports.NEWcloseTicket = 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("ticketStorage",getuserID,Number(storage.get("ticketStorage",getuserID)) - 1)
if (!isDatabaseError) storage.set("amountOfUserTickets",getuserID,Number(storage.get("amountOfUserTickets",getuserID)) - 1)
storage.delete("userFromChannel",channel.id)
storage.delete("claimData",channel.id)
storage.delete("autocloseTickets",channel.id)
if (Number(storage.get("amountOfUserTickets",getuserID)) < 0) storage.set("amountOfUserTickets",getuserID,0)
//getID & send DM & send api event
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
require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
//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
}
@@ -119,7 +129,7 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
})
//add main adminroles
config.main_adminroles.forEach((role,index) => {
config.adminRoles.forEach((role,index) => {
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
@@ -127,123 +137,79 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}catch{
log("system","invalid role! At 'config.json => main_adminroles:"+index)
}
})
//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 (!ticketData) return
if (ticketData.closedCategory.enable){
/**@type {discord.CategoryChannel} */
const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory)
try {
channel.setParent(category)
}catch{
bot.errorLog.log("system","failed to move channel to new category!")
}
if (firstmsg.embeds.length < 1 || !firstmsg.embeds[0].description.includes("OTDATA")) return channel.send({embeds:[ticketInfoError]})
}
const hiddendata = bot.hiddenData.readHiddenData(firstmsg.embeds[0].description)
const ticketId = hiddendata.data.find(d => d.key == "type").value
const ticketData = require("../utils/configParser").getTicketById(ticketId,true)
if (!ticketData) return
if (ticketData.closedCategory.enable){
/**@type {discord.CategoryChannel} */
const category = guild.channels.cache.find(c => c.id == ticketData.closedCategory.id && c.type == discord.ChannelType.GuildCategory)
ticketData.adminroles.forEach((role,index) => {
if (!config.adminRoles.includes(role)){
try {
channel.setParent(category)
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.ViewChannel,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages],
deny:[]
})
}catch{
bot.errorLog.log("system","failed to move channel to new category!")
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
}
}
/**
* @type {String[]}
*/
const ticketadmin = ticketData.adminroles
ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
permissionArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.ViewChannel],
deny:[pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
})
}catch{
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
}
}
})
})
channel.permissionOverwrites.set(permissionArray)
if (!nomessage){
//message
var closeButtonRow = new discord.ActionRowBuilder()
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTdeleteTicket1")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Danger)
.setLabel(l.buttons.delete)
.setEmoji("✖️")
)
.addComponents(
new discord.ButtonBuilder()
.setCustomId("OTreopenTicket")
.setDisabled(false)
.setStyle(discord.ButtonStyle.Success)
.setLabel(l.buttons.reopen)
.setEmoji("✔")
)
//message
const embed = new discord.EmbedBuilder()
.setColor(config.main_color)
.setTitle(":lock: "+l.messages.closedTitle+" :lock:")
.setColor(config.color)
.setTitle(":lock: "+l.commands.closeTitle+" :lock:")
.setDescription(l.messages.closedDescription)
channel.send({embeds:[embed],components:[closeButtonRow]})
channel.send({embeds:[embed],components:[bot.buttons.close.closeCommandRow]})
}
log("system","closed a ticket",[{key:"user",value:user.tag},{key:"ticket",value:channel.name}])
log("system","closed a ticket",[{key:"user",value:user.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)
require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason)
const id = hiddendata.data.find(d => d.key == "openerid").value
if (!id) return false
//send api event
require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason)
//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 = []
@@ -276,6 +242,9 @@ exports.NEWcloseTicket = async (member,channel,prefix,mode,reason,nomessage) =>
const deleteHandler = async () => {
if (deleteRequired){
pendingDelete.shift()
//delete HIDDENDATA
storage.delete("HIDDENDATA",channel.id)
await channel.delete()
}
}
+91 -58
View File
@@ -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,25 +47,19 @@ 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) interaction.deferReply({ephemeral:true})
} catch{}
}else if (interaction.isChatInputCommand()){
interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
}else if (interaction.isStringSelectMenu()){
try {
interaction.deferUpdate()
} catch{}
if (interaction.isButton() || interaction.isStringSelectMenu() || interaction.isChatInputCommand()){
try{
await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
}catch{}
}
if (storage.get("ticketStorage",interaction.member.id) == null || storage.get("ticketStorage",interaction.member.id) == "false"|| Number(storage.get("ticketStorage",interaction.member.id)) < config.system.max_allowed_tickets){
const currentUserTicketAmount = storage.get("amountOfUserTickets",interaction.member.id)
if (config.system.maxAmountOfTickets == 0 || !currentUserTicketAmount || currentUserTicketAmount == "false" || Number(currentUserTicketAmount) < config.system.maxAmountOfTickets){
//update storage
storage.set("ticketStorage",interaction.member.id,Number(storage.get("ticketStorage",interaction.member.id))+1)
storage.set("amountOfUserTickets",interaction.member.id,Number(currentUserTicketAmount)+1)
var ticketNumber = interaction.member.user.username
//set ticketName
@@ -84,30 +77,23 @@ module.exports = () => {
const pfb = discord.PermissionFlagsBits
const guild = client.guilds.cache.find(g => g.id == interaction.guild.id)
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
//set @everyone no ticket access
permissionsArray.push({
id:interaction.guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
allow:[],
deny:[pfb.ViewChannel]
})
//add the user that created the ticket
permissionsArray.push({
id:interaction.member.user,
type:"member",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel,pfb.ReadMessageHistory]
})
//add main adminroles
config.main_adminroles.forEach((role,index) => {
config.adminRoles.forEach((role,index) => {
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
@@ -115,11 +101,9 @@ module.exports = () => {
permissionsArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel,pfb.ReadMessageHistory]
})
}catch{
log("system","invalid role! At 'config.json => main_adminroles:"+index)
}
}catch{}
})
//add ticket adminroles
@@ -128,7 +112,7 @@ module.exports = () => {
*/
const ticketadmin = currentTicketOptions.adminroles
ticketadmin.forEach((role,index) => {
if (!config.main_adminroles.includes(role)){
if (!config.adminRoles.includes(role)){
try {
const adminrole = guild.roles.cache.find(r => r.id == role)
if (!adminrole) return
@@ -136,18 +120,35 @@ module.exports = () => {
permissionsArray.push({
id:adminrole,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel,pfb.ReadMessageHistory]
})
}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,pfb.ReadMessageHistory],
deny:[pfb.SendMessages,pfb.AttachFiles,pfb.EmbedLinks]
})
}catch{}
}
})
}
//add member role
if (config.system.member_role != "" && config.system.member_role != " " && config.system.member_role != "false" && config.system.member_role != "null" && config.system.member_role != "0"){
if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
try {
const userrole = guild.roles.cache.find(r => r.id == config.system.member_role)
const userrole = guild.roles.cache.find(r => r.id == config.system.memberRole)
if (userrole){
permissionsArray.push({
id:userrole,
@@ -155,9 +156,7 @@ module.exports = () => {
deny:[pfb.ViewChannel]
})
}
}catch{
log("system","invalid role! At 'config.json => system/member_role")
}
}catch{}
}
//create the channel
@@ -169,26 +168,35 @@ module.exports = () => {
permissionOverwrites:permissionsArray
}).then((ticketChannel) => {
storage.set("userTicketStorage",ticketChannel.id,interaction.member.id)
storage.set("userFromChannel",ticketChannel.id,interaction.member.id)
if (currentTicketOptions.autoclose.enable) storage.set("autocloseTickets",ticketChannel.id,currentTicketOptions.autoclose.inactiveHours)
bot.hiddenData.writeHiddenData(ticketChannel.id,[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
const hiddendata = bot.hiddenData.writeHiddenData("ticketdata",[{key:"type",value:currentTicketOptions.id},{key:"openerid",value:interaction.user.id},{key:"createdms",value:new Date().getTime()}])
var ticketEmbed = new discord.EmbedBuilder()
//.setAuthor({name:interaction.user.id})
.setColor(config.main_color)
.setColor(config.color)
.setTitle(currentTicketOptions.name)
//.setFooter({text:"Ticket Type: "+currentTicketOptions.id})
if (currentTicketOptions.autoclose.enable){
const footerText = l.commands.autocloseTitle.replace("{0}",currentTicketOptions.autoclose.inactiveHours+"h")
ticketEmbed.setFooter({text:footerText})
}
if (currentTicketOptions.ticketmessage.length > 0){
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]
@@ -196,30 +204,55 @@ 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()
.setStyle(discord.ButtonStyle.Link)
.setDisabled(false)
.setEmoji("🎫")
.setLabel("go to ticket")
.setLabel(l.commands.goToTicket)
.setURL(ticketChannel.url)
])
try{
if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.main_color)],components:[channelbutton]})
if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.color)],components:[channelbutton]})
}
catch{log("system","failed to send DM")}
if ((interaction.isButton() && config.system.answerInEphemeralOnOpen) || interaction.isChatInputCommand()) interaction.editReply({embeds:[bot.errorLog.success(l.messages.createdTitle,l.messages.createdDescription)],components:[channelbutton]})
if (((interaction.isButton() || interaction.isStringSelectMenu()) && 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{
interaction.editReply({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]})
try {
if (config.system.enable_DM_Messages){
if (config.system.dmMessages){
interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]})
}
}
@@ -229,4 +262,4 @@ module.exports = () => {
}
}
})
}
}
+38 -13
View File
@@ -6,32 +6,36 @@ const log = bot.errorLog.log
const l = bot.language
const storage = bot.storage
const pfb = discord.PermissionFlagsBits
const permsChecker = require("../utils/permisssionChecker")
/**
*
* @param {discord.Guild} guild
* @param {discord.TextBasedChannel} channel
* @param {discord.User} user
* @param {String} ticketId option id
* @returns
*/
const reopenTicket = (guild,channel,user) => {
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.tag}])
const reopenTicket = (guild,channel,user,ticketId) => {
//check perms
if (config.system.closeMode == "adminonly"){
if (!guild) return
if (!permsChecker.ticket(user.id,guild.id,ticketId)){
permsChecker.sendUserNoPerms(user)
return
}
}
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.username}])
var permissionsArray = []
//set everyone allowed
if (config.system['has@everyoneaccess']){
var everyoneAllowPerms = [pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
var everyoneDenyPerms = []
}else{
var everyoneAllowPerms = []
var everyoneDenyPerms = [pfb.ViewChannel]
}
//set @everyone no ticket access
permissionsArray.push({
id:guild.roles.everyone,
type:"role",
allow:everyoneAllowPerms,
deny:everyoneDenyPerms
allow:[],
deny:[pfb.ViewChannel]
})
channel.permissionOverwrites.cache.forEach((p) => {
@@ -42,11 +46,32 @@ const reopenTicket = (guild,channel,user) => {
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}else{
if (p.id != guild.roles.everyone){
permissionsArray.push({
id:p.id,
type:"role",
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel],
deny:[]
})
}
}
})
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,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),
@@ -64,12 +68,12 @@ 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:msg.member.displayHexColor || "#ffffff",
color:memberColor,
pfp:msg.author.displayAvatarURL()
},
content:msg.content || "",
@@ -91,7 +95,7 @@ exports.compile = (guild,channel,user,messagesInv,data) => {
bot:{
name:data.bot.name || "Open Ticket",
id:Number(data.bot.id) || 0,
pfp:data.bot.pfp || "dj-dj.be/wp-content/uploads/2022/07/profielfoto-blauw-wit.png?size=128"
pfp:data.bot.pfp || "transcripts.dj-dj.be/favicon.png"
},
ticket:{
name:channel.name,
@@ -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.displayName,
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.displayName.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.displayName : "undefined",
id:(replycontentRAW) ? replycontentRAW.author.id : "undefined",
color:replycolor,
pfp:(replycontentRAW) ? replycontentRAW.author.displayName : "",
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.displayName,
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.displayName,
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
}
+5 -5
View File
@@ -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 HTML transcript upload! Reached Ratelimit 429!")
resolve(false)
}
})
@@ -0,0 +1,57 @@
const discord = require('discord.js')
const bot = require("../../../index")
const tsconfig = bot.tsconfig
const tsembeds = require("../embeds")
const tsdb = require("../tsdb")
/**
*
* @param {String} text
* @param {discord.Guild} guild
*/
exports.replacementions = (text,guild) => {
const userregex = /<@([0-9]+)>(\s)?/g
const usertext = text.replace(userregex,(x) => {
var res = userregex.exec(x)
userregex.lastIndex = 0
var member = guild.members.cache.find((m) => m.id == res[1])
var text = member ? member.user.username.replace(/\s/g,"&nbsp;") : res[1]
return "<@"+text+"> "
})
const channelregex = /<#([0-9]+)>(\s)?/g
const channeltext = usertext.replace(channelregex,(x) => {
var res = channelregex.exec(x)
channelregex.lastIndex = 0
var channel = guild.channels.cache.find((c) => c.id == res[1])
var text = channel ? channel.name.replace(/\s/g,"&nbsp;") : res[1]
return "<#"+text+"> "
})
const roleregex = /<@&([0-9]+)>(\s)?/g
const roletext = channeltext.replace(roleregex,(x) => {
var res = roleregex.exec(x)
roleregex.lastIndex = 0
var role = guild.roles.cache.find((r) => r.id == res[1])
var text = role ? role.name.replace(/\s/g,"&nbsp;") : res[1]
var color = role ? ((role.hexColor == "#000000") ? "regular" : role.hexColor) : "regular"
return "<@&"+text+"::"+color+"> "
})
const defaultroleregex = /@(everyone|here)(\s)?/g
const defaultroletext = roletext.replace(defaultroleregex,(x) => {
var res = defaultroleregex.exec(x)
defaultroleregex.lastIndex = 0
var text = res[1]
return "<@&"+text+"::regular> "
})
return defaultroletext
}
@@ -1,67 +0,0 @@
{
"version":"1.0.0",
"otversion":"3.2.2",
"style":{
"enableCustomBackground":false,
"backgroundModus":"color OR image",
"backgroundData":"#ffffff OR https://www.example.com/image.png",
"titleColor":"#ffffff"
},
"bot":{
"name":"DJdj Support Bot",
"id":12345678910,
"pfp":"https://www.example.com/image.png"
},
"ticket":{
"name":"support-DJj123dj",
"id":12345678910,
"guildname":"DJdj Development",
"guildid":12345678910,
"creatorname":"DJj123dj#1706",
"creatorid":12345678910,
"closedbyname":"DJj123dj#1706",
"closedbyid":12345678910,
"closedtime":12345678910,
"openedtime":12345678910,
"messages":1,
"files":1
},
"messages":[
{
"author":{
"name":"DJj123dj#1706",
"id":12345678910,
"color":"#ffffff",
"pfp":"https://www.example.com/image.png"
},
"content":"string or FALSE",
"timestamp":12345678910,
"embeds":[
{
"title":"string or FALSE",
"description":"string or FALSE",
"authorimg":"https://www.example.com/image.png or FALSE",
"authortext":"string or FALSE",
"footerimg":"https://www.example.com/image.png or FALSE",
"footertext":"string or FALSE",
"color":"#ffffff",
"image":"https://www.example.com/image.png or FALSE",
"thumbnail":"https://www.example.com/image.png or FALSE",
"url":"https://www.example.com/image.png or FALSE"
}
],
"files":[
{
"name":"image.png",
"type":"PNG",
"size":"1MB",
"url":"https://www.example.com/image.png"
}
]
}
]
}
+13 -11
View File
@@ -22,8 +22,8 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => {
const embed = new discord.EmbedBuilder()
.setTitle("🧾 "+l.transcripts.title)
.setColor(config.main_color)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setColor(config.color)
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
.setFooter({text:name})
.setDescription("`"+l.transcripts.processed+"...`\n"+l.transcripts.wait+"\n\n"+l.transcripts.estimated+": "+processtime)
@@ -34,17 +34,19 @@ exports.beingprocessed = (name,id,rawprocesstime,user) => {
/**
*
* @param {String} name
* @param {String} id
* @param {String} url
* @param {discord.User} user
* @param {String} name channel name
* @param {String} url transcript url
* @param {discord.User} user transcript closer
* @param {discord.User} creator transcript creator
*/
exports.tsready = (name,id,url,user) => {
exports.tsready = (name,url,user,creator) => {
const embed = new discord.EmbedBuilder()
.setTitle("🧾 "+l.transcripts.title)
.setColor(config.main_color)
.setAuthor({name:user.tag,iconURL:user.displayAvatarURL()})
.setColor(config.color)
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
.setFooter({text:name})
if (creator) embed.setFields([{name:"Ticket Creator", value:"<@"+creator.id+">"}])
if (url){
embed.setURL(url)
@@ -67,12 +69,12 @@ 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 : ""
embed.setDescription("Something went wrong while creating the HTML transcript.\n\n[possible reasons](https://docs.openticket.dj-dj.be/the-system/transcripts/transcript-errors)"+errDesc)
embed.setDescription("Something went wrong while creating the HTML transcript.\n\n[possible reasons](https://otdocs.dj-dj.be/docs/current/docs/system/transcripts)"+errDesc)
return embed
}
+1 -1
View File
@@ -1,3 +1,3 @@
{
"version":"1.0.0"
"version":"2"
}
+102 -33
View File
@@ -14,11 +14,15 @@ const tsdb = require("./tsdb")
const checkAvailability = async () => {
if (process.argv.some((v) => v == "--tsoffline")) return true
const axios = require("axios").default
const res = await axios.get("https://transcripts.dj-dj.be/status.txt")
if (!res || !(res.status == 200) || !res.data) return false
try{
const res = await axios.get("https://apis.dj-dj.be/transcripts/status.json")
if (!res || !(res.status == 200) || !res.data) return false
if ((res.data == "online") || (res.data == "1") || (res.data == "true")) return true
else return false
if (res.data && res.data["v2"] == "online") return true
else return false
}catch{
return false
}
}
/**
@@ -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,
name:client.user.displayName,
id:client.user.id,
pfp:client.user.displayAvatarURL()
pfp:client.user.displayAvatarURL(),
},
ticket:{
creatorid:ticketopener.id,
creatorname:ticketopener.tag,
creatorname:ticketopener.displayName,
creatorpfp:ticketopener.displayAvatarURL(),
openedtime:opentime.getTime(),
closedtime:new Date().getTime()
}
@@ -81,23 +113,48 @@ module.exports = async (messages,guild,channel,user,reason) => {
if (!tc) return
tc.send({embeds:[errembed],files:[attachment]})
}
if (tsconfig.sendTranscripts.enableDM && user){
const embed = tsembeds.tsready(chName,null,user,ticketopener)
try {
ticketopener.send({embeds:[embed],files:[attachment]})
}catch{}
}
return
}
const TSdata = await require("./communication/index").upload(JSONDATA)
if (!TSdata) return false
if (!TSdata){
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
const errembed = tsembeds.tserror(chName,chId,user,"`HTML Transcript API: reached ratelimit`")
if (tsconfig.sendTranscripts.enableChannel){
/**@type {discord.TextChannel|undefined} */
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
if (!tc) return
tc.send({embeds:[errembed],files:[attachment]})
}
if (tsconfig.sendTranscripts.enableDM && user){
const embed = tsembeds.tsready(chName,null,user,ticketopener)
try {
ticketopener.send({embeds:[embed],files:[attachment]})
}catch{}
}
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){
@@ -112,12 +169,12 @@ module.exports = async (messages,guild,channel,user,reason) => {
//ready
setTimeout(() => {
if (msg){
msg.edit({embeds:[tsembeds.tsready(chName,chId,url,user)]})
msg.edit({embeds:[tsembeds.tsready(chName,url,user,ticketopener)]})
}
if (tsconfig.sendTranscripts.enableDM){
if (!user) return
const embed = tsembeds.tsready(chName,chId,url,user)
const embed = tsembeds.tsready(chName,url,user,ticketopener)
try {
ticketopener.send({embeds:[embed]})
}catch{}
@@ -134,10 +191,16 @@ module.exports = async (messages,guild,channel,user,reason) => {
if (!tc) return
tc.send({embeds:[errembed],files:[attachment]})
}
if (tsconfig.sendTranscripts.enableDM && user){
const embed = tsembeds.tsready(chName,null,user,ticketopener)
try {
ticketopener.send({embeds:[embed],files:[attachment]})
}catch{}
}
}
}else{
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
const embed = tsembeds.tsready(chName,chId,false,user)
const embed = tsembeds.tsready(chName,null,user,ticketopener)
if (tsconfig.sendTranscripts.enableChannel){
/**@type {discord.TextChannel|undefined} */
@@ -146,7 +209,13 @@ module.exports = async (messages,guild,channel,user,reason) => {
if (!tc) return
tc.send({embeds:[embed],files:[attachment]})
}
if (tsconfig.sendTranscripts.enableDM && user){
const embed = tsembeds.tsready(chName,null,user,ticketopener)
try {
ticketopener.send({embeds:[embed],files:[attachment]})
}catch{}
}
}
}
asyncmanager(msglist)
asyncmanager()
}
+15 -2
View File
@@ -26,7 +26,20 @@ exports.createTranscript = async (messagecollection,channel,backup) => {
messagecollection.forEach((msg) => {
const timestamp = new Date(msg.createdTimestamp)
if (msg.content){var content = msg.content}else{var content = "*empty message*"}
//empty message handling
if (msg.content){
var content = msg.content
}else if (msg.embeds.length > 0 && msg.attachments.length > 0){
var content = "*this message only has embeds & files*"
}else if (msg.embeds.length > 0){
var content = "*this message only has embeds*"
}else if (msg.attachments.length > 0){
var content = "*this message only has files*"
}else{
var content = "*empty message*"
}
const fileurls = []
const rawfiles = Array.from(msg.attachments)
rawfiles.forEach((file) => {
@@ -34,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")
+4 -4
View File
@@ -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}}} 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}}} 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 */
+24 -38
View File
@@ -2,22 +2,26 @@ 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.toLowerCase() == "red"){
return b.Danger
}else if (color.toLowerCase() == "green"){
return b.Success
}else if (color.toLowerCase() == "blue" || color.toLowerCase() == "blurple"){
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"){
return color
}else if (color.toLowerCase() == "none" || color.toLowerCase() == "false" || color.toLowerCase() == ""){
return b.Secondary
if (color){
if (color.toLowerCase() == "red"){
return b.Danger
}else if (color.toLowerCase() == "green"){
return b.Success
}else if (color.toLowerCase() == "blue" || color.toLowerCase() == "blurple"){
return b.Primary
}else if (color.toLowerCase() == "black" || color.toLowerCase() == "gray" || color.toLowerCase() == "grey"){
return b.Secondary
}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
}
@@ -32,6 +36,12 @@ exports.getOption = getOption
* @returns {discord.ButtonBuilder|false}
*/
exports.getButton = (id) => {
bot.actionRecorder.push({
category:"ot.managers.utils",
file:"./core/utils/getButton.js",
time:new Date().getTime(),
type:"getbutton"
})
const option = getOption(id)
if (!option) return false
if (option.type == "ticket"){
@@ -67,28 +77,4 @@ exports.getButton = (id) => {
}
return button
}
exports.rawButtonData = class {
constructor() {
this.id = ""
this.name = ""
this.description = ""
this.icon = ""
this.label = ""
this.type = ""
this.color = ""
this.enableDmOnOpen = true
this.url = ""
this.roles = ["",""]
this.mode = ""
this.adminroles = ["",""]
this.channelprefix = ""
this.category = ""
this.message = ""
this.ticketmessage = ""
}
}
+10 -3
View File
@@ -11,6 +11,12 @@ const configParser = require("./configParser")
* @returns {discord.StringSelectMenuBuilder|false}
*/
exports.getDropdown = (ids,placeholder) => {
bot.actionRecorder.push({
category:"ot.managers.utils",
file:"./core/utils/getDropdown.js",
time:new Date().getTime(),
type:"getdropdown"
})
const dropdown = new discord.StringSelectMenuBuilder()
.setCustomId("OTdropdownMenu")
.setDisabled(false)
@@ -18,7 +24,7 @@ exports.getDropdown = (ids,placeholder) => {
.setMinValues(1)
.setPlaceholder(placeholder || l.messages.chooseATicket)
.addOptions(
new discord.SelectMenuOptionBuilder()
new discord.StringSelectMenuOptionBuilder()
.setDefault(true)
.setLabel(placeholder || l.messages.chooseATicket)
.setValue("OTChooseTicket")
@@ -28,7 +34,7 @@ exports.getDropdown = (ids,placeholder) => {
const option = configParser.getTicketById(id,true)
const roleoption = configParser.getRoleById(id,true)
if (option){
const selectComponent = new discord.SelectMenuOptionBuilder()
const selectComponent = new discord.StringSelectMenuOptionBuilder()
.setDefault(false)
.setValue("OTnewT"+option.id)
@@ -37,12 +43,13 @@ exports.getDropdown = (ids,placeholder) => {
}else{
if (option.label) selectComponent.setLabel(option.label)
if (option.icon) selectComponent.setEmoji(option.icon)
if (option.description && option.description.length < 100) selectComponent.setDescription(option.description)
}
dropdown.addOptions(selectComponent)
}else if (roleoption){
const selectComponent = new discord.SelectMenuOptionBuilder()
const selectComponent = new discord.StringSelectMenuOptionBuilder()
.setDefault(false)
.setValue("OTnewR"+roleoption.id)
+26 -6
View File
@@ -14,12 +14,18 @@ const l = bot.language
exports.createEmbed = (id) => {
bot.actionRecorder.push({
category:"ot.managers.utils",
file:"./core/utils/getEmbed.js",
time:new Date().getTime(),
type:"getembed"
})
//-----------------------------------
//general importing
const data = require("./configParser").getConfigMessage(id)
/**@type {discord.ButtonBuilder[]}*/
var buttons = []
/**@type {getButton.rawButtonData[]} */
/**@type {import('./configParser').OTAllOptions[]} */
var buttonData = []
data.options.forEach((option) => {
@@ -34,23 +40,37 @@ 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)
}else{
embed.setColor(config.main_color)
embed.setColor(config.color)
}
if (data.other.embedTitleURL.enable) embed.setURL(data.other.embedTitleURL.url)
var description = data.description
if (data.other.enableTicketExplaination){
const chooseCategoryMSG = data.other.customCategoryText.enable ? data.other.customCategoryText.text : l.messages.chooseCategory
const chooseCategoryMSG = data.other.customCategoryText.enable ? data.other.customCategoryText.text : l.messages.chooseATicket
description = description+"\n\n__"+chooseCategoryMSG+"__\n"
var ticketExplainations = []
@@ -63,7 +83,7 @@ exports.createEmbed = (id) => {
}
if (data.other.enableMaxTicketsWarning){
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.max_allowed_tickets)
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.maxAmountOfTickets)
}
if (description) embed.setDescription(description)
+29 -46
View File
@@ -1,66 +1,49 @@
const storage = require("../../index").storage
/**@typedef {{type:String,data:[{key:String,value:String}]}} hiddenData */
/**@typedef {[{key:String,value:String}]} hiddenData */
/**
*
* @param {String} messageContent
* @param {String} channelid
* @returns {hiddenData}
*/
exports.readHiddenData = (messageContent) => {
//ticketdata//type:123|userid:456)
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}
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) => {
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
}
}
+125 -3
View File
@@ -3,13 +3,135 @@ const bot = require('../../index')
const client = bot.client
const config = bot.config
const log = bot.errorLog.log
const axios = require("axios").default
const fs = require("fs")
const loadChalk = async () => {
return await (await import("chalk")).default
}
module.exports = async () => {
//OTLiveStatus
/**@typedef {[{style:[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}],active:{versions:String[],languages:String[],usingPlugins:["yes"|"no"|"both"],usingSlashCommands:["yes"|"no"|"both"],transcripts:["html"|"text"|"both"]}}]} OTLiveStatus */
//OTLiveStatusError
/**@typedef {{bot:{id:String,pfp:String,name:String}, openticket:{version:String,language:String, slashcmds:Boolean,transcripts:false|"text"|"html",config:{system:{},options:{},messages:{},transcripts:{}},plugins:String[],pluginload:{success:Number,error:Number,total:Number}}, details:{actions:[{type:String,category:String,file:String,time:Number}],errortime:Number}, error:String}} OTLiveStatusError */
/**@type {[{type:String, category:String, file:String, time:Number}]} */
exports.actionRecorder = []
//================================================================
//=========================FUNCTIONS==============================
//================================================================
const getSlashEnabled = () => {
if (!fs.existsSync("./storage/slashcmdEnabled.txt")) return false
if (fs.readFileSync("./storage/slashcmdEnabled.txt").toString() == require("../../package.json").version){
return true
}else return false
}
/**
* @param {Boolean} [local=false]
* @returns {Promise<OTLiveStatus|false>}
*/
const getLivestatus = (local) => {
return new Promise((resolve,reject) => {
if (local){
try {
const livestatus = require("../../livestatus.json")
if (!livestatus) return resolve(false)
resolve(livestatus)
}catch{
return resolve(false)
}
}else{
try {
axios.get("https://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)
resolve(livestatus)
})
}catch{
return resolve(false)
}
}
})
}
var globalPluginData = {total:0,error:0,success:0}
//announcer
/**@param {{total:Number,error:Number,success:Number}} pluginData*/
exports.run = async (pluginData) => {
const chalk = await loadChalk()
//LIVESTATUS SOON
globalPluginData = pluginData
const res = await getLivestatus(process.argv.some((v) => v == "--localstatus"))
if (!res) return false
if (res.length == 0) return
/**@type {[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}]} */
const activeStyles = []
res.forEach((announcement) => {
const a = announcement.active
const isLanguage = a.languages.includes(config.languageFile) || a.languages.includes("all")
const isVersion = a.versions.includes(require("../../package.json").version)
var tsenabled = (bot.tsconfig.sendTranscripts.enableChannel || bot.tsconfig.sendTranscripts.enableDM)
var tsmode = bot.tsconfig.sendTranscripts.useHTMLtranscripts ? "html" : "text"
const isTranscript = (a.transcripts.includes("html") && tsmode == "html" && tsenabled) || (a.transcripts.includes("text") && tsmode == "text" && tsenabled) || (a.transcripts.includes("both") && tsenabled)
const isPlugins = (a.usingPlugins.includes("yes") && pluginData.total > 0) || (a.usingPlugins.includes("no") && pluginData.total == 0) || (a.usingPlugins.includes("both"))
const isSlashCMD = (a.usingSlashCommands.includes("yes") && getSlashEnabled()) || (a.usingSlashCommands.includes("no") && !getSlashEnabled()) || (a.usingSlashCommands.includes("both"))
if (!isLanguage || !isVersion || !isTranscript || !isPlugins || !isSlashCMD) return
announcement.style.forEach((s) => activeStyles.push(s))
})
const final = []
activeStyles.forEach((style) => {
const dc = style.descriptionColor
const tempd = style.description.split("\n")
const tc = style.titleColor
const t = "["+style.title+"]"
const tempd2 = []
tempd.forEach((tmpd,i) => {
if (i > 0){
var newtext = tmpd
var i2 = 0
while(i2 < t.length+1){
newtext = " "+newtext
i2++
}
tempd2.push(newtext)
}else{
tempd2.push(tmpd)
}
})
const d = tempd2.join("\n")
var fd = d
if (dc == "normal" || dc == "white") fd = chalk.white(d)
if (dc == "red") fd = chalk.red(d)
if (dc == "yellow") fd = chalk.yellow(d)
if (dc == "green") fd = chalk.green(d)
if (dc == "blue") fd = chalk.blue(d)
if (dc == "gray") fd = chalk.gray(d)
if (dc == "magenta") fd = chalk.magenta(d)
if (dc == "cyan") fd = chalk.cyan(d)
var ft = t
if (tc == "normal" || tc == "white") ft = chalk.white(t)
if (tc == "red") ft = chalk.red(t)
if (tc == "yellow") ft = chalk.yellow(t)
if (tc == "green") ft = chalk.green(t)
if (tc == "blue") ft = chalk.blue(t)
if (tc == "gray") ft = chalk.gray(t)
if (tc == "magenta") ft = chalk.magenta(t)
if (tc == "cyan") ft = chalk.cyan(t)
final.push(ft+" "+fd)
})
console.log(final.join("\n\n"))
}
+71 -2
View File
@@ -12,19 +12,58 @@ 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:"global"
})
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
if (config.main_adminroles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
if (config.adminRoles.some((item)=>{return permsmember.roles.cache.has(item)}) == false && !permsmember.permissions.has("Administrator") && !permsmember.permissions.has("ManageGuild")){
return false
}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
* @returns {Boolean}
*/
exports.sendUserNoPerms = (user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendusernoperms"
})
try {
user.send({embeds:[bot.errorLog.noPermsMessage(user)]})
return true
@@ -39,6 +78,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean}
*/
exports.sendUserNoTicket = (user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendusernoticket"
})
try {
user.send({embeds:[bot.errorLog.notInATicket]})
return true
@@ -53,6 +98,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean}
*/
exports.sendUserNoDelete = (user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendusernodelete"
})
try {
user.send({embeds:[bot.errorLog.noPermsDelete(user)]})
return true
@@ -68,6 +119,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean}
*/
exports.sendChannelNoPerms = (channel,user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendchannelnoperms"
})
try {
channel.send({embeds:[bot.errorLog.noPermsMessage(user)]})
return true
@@ -83,6 +140,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean}
*/
exports.sendChannelNoTicket = (channel,user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendchannelnoticket"
})
try {
channel.send({embeds:[bot.errorLog.notInATicket]})
return true
@@ -98,6 +161,12 @@ exports.sendUserNoPerms = (user) => {
* @returns {Boolean}
*/
exports.sendChannelNoDelete = (channel,user) => {
bot.actionRecorder.push({
category:"ot.managers.permissionChecker",
file:"./core/permissionChecker.js",
time:new Date().getTime(),
type:"sendchannelnodelete"
})
try {
channel.send({embeds:[bot.errorLog.noPermsDelete(user)]})
return true
+255 -56
View File
@@ -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.2.2 - © DJdj Development
Open Ticket v3.5.6 - © 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:
@@ -41,32 +38,26 @@
Send ./openticketdebug.txt when there are errors!
*/
/** discord :)*/
const discord = require("discord.js")
const fs = require('fs')
const {GatewayIntentBits,Partials} = discord
const APIBase = require("./core/api/modules/base")
if (APIBase.embeddedMode){
var tempClient = APIBase.clientLocation
}else{
var tempClient = new discord.Client({
intents:[
GatewayIntentBits.DirectMessages,
GatewayIntentBits.GuildInvites,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.Guilds,
GatewayIntentBits.MessageContent
],
partials:[Partials.Channel,Partials.Message]
})
}
/**@type {discord.Client} */
const client = tempClient
const client = new discord.Client({
intents:[
GatewayIntentBits.DirectMessages,
GatewayIntentBits.GuildInvites,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.Guilds,
GatewayIntentBits.MessageContent
],
partials:[Partials.Channel,Partials.Message]
})
exports.client = client
client.setMaxListeners(50)
client.setMaxListeners(120)
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
@@ -82,30 +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 language = require("./core/languageManager").language
exports.language = language
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language")
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")
const log = this.errorLog.log
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM")
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","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")
}
@@ -116,55 +111,125 @@ 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")
var statusSet = false
this.actionRecorder.push({
category:"ot.managers.djs",
file:"index.js",
time:new Date().getTime(),
type:"client.loggedin.success"
})
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({
category:"ot.managers.djs",
file:"index.js",
time:new Date().getTime(),
type:"client.setstatus.success"
})
const chalk = await (await import("chalk")).default
require("./core/startscreen").run()
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startscreen.success"
})
if (!process.argv[2] || (process.argv[2] && !process.argv[2].startsWith("slash"))){
//normal start
this.errorLog.log("debug","loaded console interface")
require("./core/utils/liveStatus")()
if (config.status.enabled){
setStatus(config.status.type,config.status.text)
//refresh status every 10 minutes
setInterval(() => {
setStatus(config.status.type,config.status.text)
},(60*10*1000))
}
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startmode.normal"
})
var updatingSlash = false
if (fs.existsSync("./storage/slashcmdEnabled.txt")){
/**@type {"true"|"false"} */
/**@type {"true"|"false"|String} */
const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString()
if (data === "true"){require("./core/slashSystem/autoSlashUpdate")(); updatingSlash = true}
}else{fs.writeFileSync("./storage/slashcmdEnabled.txt","false")}
if (data === require("./package.json").version){
require("./core/slashSystem/autoSlashUpdate")()
updatingSlash = true
}else if ((data != require("./package.json").version) && (data != "false")){
require("./core/slashSystem/slashEnable")(true)
updatingSlash = true
}
}else{
if (process.argv.some((v) => v == "--noslash")){
fs.writeFileSync("./storage/slashcmdEnabled.txt","false")
}else{
fs.writeFileSync("./storage/slashcmdEnabled.txt",require("./package.json").version)
require("./core/slashSystem/slashEnable")(true)
updatingSlash = true
}
}
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"slashcmd.autoupdate.success"
})
try {
await client.guilds.cache.find((g) => g.id == config.server_id).members.fetch()
await client.guilds.cache.find((g) => g.id == config.serverId).members.fetch()
}catch{
this.errorLog.log("info","tried to cache user information, failed!")
}
require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,false)
}else{
//slash command activation using node index.js slash (enable|disable)
require("./core/startscreen").headerDataReady(chalk,config.status,updatingSlash,true)
this.errorLog.log("debug","slashmode activated")
if (process.argv[3] == "enable"){
console.log(chalk.green("switching to slashEnable.js"))
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startmode.slash.enable"
})
require("./core/slashSystem/slashEnable")()
}else if (process.argv[3] == "disable"){
console.log(chalk.green("switching to slashDisable.js"))
this.actionRecorder.push({
category:"ot.managers.main",
file:"index.js",
time:new Date().getTime(),
type:"startmode.slash.disable"
})
require("./core/slashSystem/slashDisable")()
}else{
console.log(chalk.bgRed("[SLASH CMD MANAGER]: unknown slash command action!"))
@@ -172,18 +237,53 @@ client.on('ready',async () => {
}
}
//load plugins
//LOAD PLUGINS (after client login)
this.actionRecorder.push({
category:"ot.managers.plugins",
file:"./core/api/pluginlauncher.js",
time:new Date().getTime(),
type:"plugins.loading"
})
require("./core/api/pluginlauncher")()
this.actionRecorder.push({
category:"ot.managers.plugins",
file:"./core/api/pluginlauncher.js",
time:new Date().getTime(),
type:"plugins.success"
})
this.errorLog.log("debug","loading plugins")
})
if (!require("./core/api/api.json").disable.checkerjs.all) require("./core/checker").checker()
//LOAD CHECKER.JS
if (!require("./core/api/api.json").disable.checkerjs.all){
this.actionRecorder.push({
category:"ot.managers.main",
file:"./core/checker.js",
time:new Date().getTime(),
type:"checker.loading"
})
require("./core/checker").checker()
this.errorLog.log("debug","loading checker.js")
this.errorLog.log("debug","checking config...")
this.actionRecorder.push({
category:"ot.managers.main",
file:"./core/checker.js",
time:new Date().getTime(),
type:"checker.success"
})
}
//LOAD COMMANDS & CORE
if (process.argv[2] && process.argv[2].startsWith("slash")){
//do nothing
}else{
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"commands.loading"
})
this.errorLog.log("debug","LOADING COMMANDS")
//commands
require('./commands/ticket')()
@@ -197,23 +297,65 @@ 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",
time:new Date().getTime(),
type:"commands.success"
})
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"core.loading"
})
this.errorLog.log("debug","LOADING CORE")
//core
require('./core/ticketActions/ticketOpener')()
require("./core/reactionRoles")()
require("./core/ticketActions/ticketAutoclose")()
this.errorLog.log("debug","LOADING INTERACTION HANDLERS")
//InteractionHandlers
require("./core/interactionHandlers/handlers/handlers")()
//require("./test")()
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"core.success"
})
}
//LOAD API
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"api.loading"
})
this.errorLog.log("debug","loading api")
const APIEvents = require("./core/api/modules/events")
const APIConfig = require("./core/api/api.json")
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"api.success"
})
//ERROR SYSTEM
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"debugsystem.loading"
})
const debugLog = (debugString) => {
if (!APIConfig.disable.debug.all && !APIConfig.disable.debug.debuglogs){
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
@@ -246,5 +388,62 @@ process.on("uncaughtException",async (error,origin) => {
APIEvents.onError(error.name+": "+error.message,new Date())
})
if (!APIBase.embeddedMode) client.login(config.auth_token)
this.actionRecorder.push({
category:"ot.managers.loader",
file:"./index.js",
time:new Date().getTime(),
type:"debugsystem.success"
})
//PARSE .env FILE FROM DOTENV LIB
//npm i dotenv
//https://github.com/motdotla/dotenv
/**@param {Buffer} src */
const loadFromDotEnv = (src) => {
const LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg
const obj = {}
// Convert buffer to string
let lines = src.toString()
// Convert line breaks to same format
lines = lines.replace(/\r\n?/mg, '\n')
let match
while ((match = LINE.exec(lines)) != null) {
const key = match[1]
// Default undefined or null to empty string
let value = (match[2] || '')
// Remove whitespace
value = value.trim()
// Check if double quoted
const maybeQuote = value[0]
// Remove surrounding quotes
value = value.replace(/^(['"`])([\s\S]*)\1$/mg, '$2')
// Expand newlines if double quoted
if (maybeQuote === '"') {
value = value.replace(/\\n/g, '\n')
value = value.replace(/\\r/g, '\r')
}
// Add to object
obj[key] = value
}
process.env.TOKEN = obj.TOKEN
}
//LOGIN SYSTEM
if (config.token.fromENV){
loadFromDotEnv(fs.readFileSync(".env"))
client.login(process.env.TOKEN)
}else{
client.login(config.token.value)
}
this.errorLog.log("debug","login with token")
+125 -77
View File
@@ -1,87 +1,135 @@
{
"errors": {
"missingArgsTitle": "قيمة غير صالحة!",
"missingArgsDescription": "قيمة مفقودة",
"noPermsTitle": "ليس لديك برمشنات !",
"noPermsDescription": "أنت بحاجة الى برمشن `ADMINISTRATOR` او أن تكون في قائمة المسموح بهم!",
"noPermsDelete": "فقط الإداريين يمكنهم حذف التكت!",
"chooseFromListTitle": "Invalid ID",
"chooseFromListDescription": "قم بأختيار أحد من الأيديات من الأسفل:",
"boterror": "خلل في البوت !",
"notInTicketTitle": "انت لست في تكت!",
"notInTicketDescription": "هذا الأمر لا يعمل خارج التكت!",
"ticketDoesntExist": "هذا التكت لم يعد فعال!",
"roleDoesntExist": "خطاً ,لم تعد الرتبة موجوده!",
"anotherOption": "هذا الخيار ليس التكت و لكنه شيء أخر!",
"maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!",
"maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!",
"somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!"
},
"commands": {
"userAddedTitle": "تم أضافة {0} من المستخدمين في التكت!",
"userRemovedTitle": "تم أزالة {0} من المستخدمين من التكت!",
"renameTitle": "تم تغيير أسم التكت الى {0}!",
"closeTitle": "تم أغلاق التكت!",
"deleteTitle": " جاري حذف التكت...",
"reopenTitle": "إعادة فتح التكت!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"_CREDITS":"deqressing",
"_INFO":"This file is a translation for open ticket 3.5.6",
"ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!",
"maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_"
},
"helpMenu": {
"title": "الأوامر المتاحة:",
"header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n",
"header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n",
"errors": {
"missingArgsTitle": "قيمة غير صالحة!",
"missingArgsDescription": "قيمة مفقودة",
"noPermsTitle": "ليس لديك برمشنات !",
"noPermsDescription": "أنت بحاجة الى برمشن `ADMINISTRATOR` او أن تكون في قائمة المسموح بهم!",
"noPermsDelete": "فقط الإداريين يمكنهم حذف التيكت!",
"chooseFromListTitle": "الايدي غير صحيح!",
"chooseFromListDescription": "قم بأختيار أحد من الأيديات من الأسفل:",
"boterror": "خلل في البوت !",
"notInTicketTitle": "انت لست في تكت!",
"notInTicketDescription": "هذا الأمر لا يعمل خارج التيكت!",
"ticketDoesntExist": "هذا التيكت لم يعد فعال!",
"roleDoesntExist": "خطاً ,لم تعد الرتبة موجوده!",
"anotherOption": "هذا الخيار ليس التيكت و لكنه شيء أخر!",
"maxAmountTitle": "خطأ , تم الوصول الى الحد الأقصى!",
"maxAmountDescription": "لقد وصلت الى الحد الأقصى لعدد التيكتات المسموحة بها!\nSo لا يمكنك فتح واحدة أخرى!",
"somethingWentWrong": "**هناك خطاً!**\nأعد المحاولة لاحقاً!"
},
"commands": {
"userAddedTitle": "تم أضافة {0} من المستخدمين في التيكت!",
"userRemovedTitle": "تم أزالة {0} من المستخدمين من التيكت!",
"renameTitle": "تم تغيير أسم التيكت الى {0}!",
"closeTitle": "تم أغلاق التيكت!",
"deleteTitle": " جاري حذف التيكت...",
"reopenTitle": "إعادة فتح التيكت!",
"claimTitle":"تم تعيين التيكت الى {0}",
"unclaimTitle":"هذا التيكت لم يتم تعيينه لاحد",
"changeTitle":"!تم تغيير نوع التيكت الى {0}",
"msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)",
"renameCmd": "إعادة تسمية التكت. (بدون مسافات)",
"closeCmd": "أغلاق التكت.",
"deleteCmd": "حذف التكت.",
"addCmd": "إضافة مستخدم الى التكت.",
"removeCmd": "إزالة مستخدم من التكت.",
"reopenCmd": "إعادة فتح تكت بعد إغلاقة."
},
"buttons": {
"close": "إغلاق التكت",
"delete": "حذف التكت",
"reopen": "إعادة فتح التكت",
"closeWithReason":"close with reason"
},
"messages": {
"reopenTitle": "تم إعادة فتح التكت بنجاح!",
"reopenDescription": "لا تتردد في فتح التكت مرة أخرى , حظاً موفقاً!",
"closedTitle": "تم إغلاق التكت!",
"closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التكت او إعادة فتحة مجدداً!*",
"createdTitle": "تم إنشاء تكت!",
"createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!",
"statsTitle":"ها هي احصائيات {0}",
"autocloseTitle":"سيتم اغلاق التيكت تلقائيا في {0}",
"autocloseRejectTitle":"تم الغاء اغلاق التيكت تلقائيا",
"autocloseWarn":"هذا يؤثر فقط على التذاكر الغير نشطة",
"newTicketDmTitle": "تكت جديد!",
"closedTicketDmTitle": "تم إغلاق التكت!",
"deletedTicketDmTitle": "تم حذف التكت!",
"closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري",
"deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!",
"reopenTicketDmTitle": "تم إعادة فتح تذكرتك!",
"reopenTicketDmDescription": "تم إعادة فتح التكت!",
"chooseCategory": "أختر الكتقاجوري:",
"gettingdeleted": "يتم حذف التكت...",
"goToTicket":"الذهاب الى التيكت",
"ticketWarning": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!",
"maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_"
},
"helpMenu": {
"title": "الأوامر المتاحة:",
"header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n",
"header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n",
"none": "لا يوجد",
"reason": "سبب",
"msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)",
"renameCmd": "إعادة تسمية التيكت. (بدون مسافات)",
"closeCmd": "أغلاق التيكت.",
"deleteCmd": "حذف التيكت.",
"addCmd": "إضافة مستخدم الى التيكت.",
"removeCmd": "إزالة مستخدم من التيكت.",
"reopenCmd": "إعادة فتح تكت بعد إغلاقة.",
"changeCmd":"تغيير نوع التيكت.",
"claimCmd":"تعيينك لتيكت معين.",
"unclaimCmd":"الغاء التغيين لتيكت معين",
"statsCmd":"اضهار احصائيات التيكت",
"autocloseCmd":"قم بضبط مؤقت لاغلاق التيكت تلقائياً"
},
"buttons": {
"close": "إغلاق التيكت",
"delete": "حذف التيكت",
"reopen": "إعادة فتح التيكت",
"closeWithReason":"اغلاق مع سبب"
},
"messages": {
"closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التيكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التيكت او إعادة فتحة مجدداً!*",
"createdTitle": "تم إنشاء تكت!",
"createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!",
"deletedby":"deleted by",
"closedby":"closed by",
"modalreason":"What is the reason for closing this ticket?",
"chooseATicket": "Choose a ticket"
"newTicketDmTitle": "تكت جديد!",
"closedTicketDmTitle": "تم إغلاق التيكت!",
"deletedTicketDmTitle": "تم حذف التيكت!",
"closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري",
"deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!",
"reopenTicketDmTitle": "تم إعادة فتح تذكرتك!",
"reopenTicketDmDescription": "تم إعادة فتح التيكت!",
"chooseCategory": "أختر الكتقاجوري:",
"gettingdeleted": "يتم حذف التيكت...",
"none": "لا يوجد",
"reason": "سبب",
"createdat":"تم الانشاء في",
"openedby":"تم الانشاء من قبل",
"deletedby":"تم الحذف من قبل",
"closedby":"تم الاغلاق من قبل",
"modalreason":"ماهو سببك لاغلاق التيكت؟",
"chooseATicket": "اختار تيكت معين"
},
"transcripts":{
"title":"Transcript",
"processed":"This transcript is being processed",
"wait":"Please wait!",
"estimated":"Estimated time",
"available":"The transcript is available here"
"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":"هذا المستخدم لم يتم العثور عليه في قاعدة بياناتنا!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"Stragar",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Грешни Аргументи!",
"missingArgsDescription":"Липсват Аргументи",
"noPermsTitle":"Нямате позволение!",
"noPermsDescription":"Трябва ви `ADMINISTRATOR` правомощия или да бъде в списъка с роли!",
"noPermsDelete":"Само админ може да изтрива тикети!",
"chooseFromListTitle":"Грешно ID",
"chooseFromListDescription":"Choose one of the id's below:",
"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":"Changed ticket type to {0}!",
"statsTitle":"Статистика за {0}!",
"autocloseTitle":"Този тикет ще се затвори автоматично след {0}!",
"autocloseRejectTitle":"Този тикет вече няма да се затваря автоматично!",
"autocloseWarn":"Това засяга само неактивни тикети!",
"goToTicket":"отидете на тикет",
"ticketWarning":"Текста е добавен по-долу!",
"maxTicketWarning":"**Предопреждение:** _Ти можеш да създадеш {0} тикети(s) време!_"
},
"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":"Този потребител не може да бъде намерен в базата данни за статистика!"
}
}
+54 -6
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"DJdj Development",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Invalid Arguments!",
"missingArgsDescription":"Missing Argument",
@@ -24,10 +27,17 @@
"closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"claimTitle":"This ticket is claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Delete a ticket.",
"addCmd":"Add a user to the ticket.",
"removeCmd":"Remove a user from the ticket.",
"reopenCmd":"Re-Open a ticket after it was closed."
"reopenCmd":"Re-Open a ticket after it was closed.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
},
"buttons":{
"close":"Close Ticket",
@@ -51,9 +66,6 @@
"closeWithReason":"close with reason"
},
"messages":{
"reopenTitle":"Re-Opened this ticket!",
"reopenDescription":"Feel free to talk again!",
"closedTitle":"Closed this ticket!",
"closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*",
"createdTitle":"Ticket Created!",
"createdDescription":"Your ticket is created, you can detect it by a ping!",
@@ -71,9 +83,11 @@
"none":"none",
"reason":"reason",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"deleted by",
"closedby":"closed by",
"modalreason":"What is the reason for closing this ticket?",
"chooseATicket": "Choose a ticket"
},
@@ -83,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!"
}
}
+98 -50
View File
@@ -1,87 +1,135 @@
{
"_CREDITS":"spyeye_",
"_INFO":"This file is a translation for open ticket 3.5.6",
"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",
"claimTitle":"Nyní jsi převzal ticket {0}",
"unclaimTitle":"Tento ticketu už je převzatý!",
"changeTitle":"Změnil jsi typ ticketu na {0}!",
"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 není nadále převzaný",
"changeTitle":"Typ ticketu byl změněn {0}!",
"ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _Můžeš vytvořit pouze {0} v tuhle chvíli!_"
"statsTitle":"Zde jsou informace o ticketu {0}!",
"autocloseTitle":"Tento ticketu bude automaticky uzavřen za {0}!",
"autocloseRejectTitle":"Tento ticket již nebude automaticky uzavřen!",
"autocloseWarn":"Tato možnost uzavře pouze neaktivní tickety!",
"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.",
"statsCmd":"Zobrazit info o ticketu.",
"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":{
"reopenTitle":"Znovu otevřit ticket!",
"reopenDescription":"Klidně napiš znova!",
"closedTitle":"Zavřít tenhle ticket!",
"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",
"deletedby":"smazano uzivatelem",
"closedby":"zavreno uzivatelem",
"modalreason":"Jakž byl důvod k zavření toho ticketu?",
"chooseATicket": "Vyber ticket"
"none":"Žádný",
"reason":"Důvod",
"createdat":"Otevřeno v",
"openedby":"Otevřel",
"deletedby":"Vymázáno uživatelem",
"closedby":"Uzavřeno uživatelem",
"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":"Globální statistiky",
"ticketTitle":"Ticket statistiky pro {0}",
"userTitle":"Uživatelské statistiky pro {0}",
"systemTitle":"Sytstémov= statistiky",
"versionTitle":"Verze bota",
"ticketsCreated":"Ticketů vytvořeno:",
"ticketsClosed":"Tickety zavřeno:",
"ticketsDeleted":"Ticketu smazáno:",
"ticketsReopened":"Ticketů znovuotevřených:",
"ticketsAutoclosed":"Ticketů automaticky zavřeno:",
"transcriptsCreated":"Záloh ticketů vytvořeno:",
"startupDate":"Datum zapnutí",
"latestUpdate":"Poslední aktualizace",
"ticketCreatedOn":"Ticket založen na",
"ticketCreatedBy":"Ticket vytvořil",
"messagesSent":"Zpráva poslána",
"status":"Status",
"participants":"Účastníci",
"role":"Role",
"switches":{
"globalAdmin":"Globální Admin",
"ticketAdmin":"Ticket Admin",
"member":"Člen",
"open":"Otevřený",
"reopened":"Znovuotevřený",
"closed":"Zavřený",
"autoclosed":"Automaticky zavřený"
},
"errorUserNotFound":"Tento uživatel nebyl nalezen v databázi statistik!"
}
}
+58 -10
View File
@@ -1,5 +1,8 @@
{
"errors": {
"_CREDITS":".the_gamer",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors": {
"missingArgsTitle": "Ugyldigt Argument!",
"missingArgsDescription": "Manglende Argument",
"noPermsTitle": "Ikke tilladelse!",
@@ -24,10 +27,17 @@
"closeTitle": "Lukket denne ticket!",
"deleteTitle": "Sletter denne ticket...",
"reopenTitle": "Genåbnede denne ticket!",
"claimTitle": "Denne ticket er nu krævet til {0}",
"unclaimTitle": "Der gøres ikke krav på denne ticket længere!",
"changeTitle": "Ændrede ticket type til {0}!",
"claimTitle": "Denne ticket bliver nu håndteret af {0}",
"unclaimTitle": "Denne ticket bliver ikke håndteret længere!",
"changeTitle": "Ændrede ticket-type til {0}!",
"statsTitle": "Her er statestikerne til {0}!",
"autocloseTitle": "Denne ticket lukker automatisk om {0}!",
"autocloseRejectTitle": "Denne ticket lukker ikke længere automatisk!",
"autocloseWarn": "Dette har kun effekt på inaktive tickets!",
"goToTicket": "gå til ticket",
"ticketWarning": "Embedet er i meddelelsen nedenfor!",
"maxTicketWarning": "**Warning:** _Du kan kun oprette {0} ticket(s) ad gangen!_"
},
@@ -42,7 +52,12 @@
"deleteCmd": "Slet en ticket.",
"addCmd": "Tilføj en bruger til ticketen.",
"removeCmd": "Fjern en bruger fra ticketen.",
"reopenCmd": "Genåbn en ticket, efter at den var lukket."
"reopenCmd": "Genåbn en ticket, efter at den var lukket.",
"changeCmd": "Skift ticket type.",
"claimCmd": "Håndter en ticket.",
"unclaimCmd": "Afhåndter en ticket.",
"statsCmd": "Se ticket statestiker.",
"autocloseCmd": "Angiv tiden til automatisk at lukke en ticket"
},
"buttons": {
"close": "Luk Ticket",
@@ -51,9 +66,6 @@
"closeWithReason": "Luk med grundlag"
},
"messages": {
"reopenTitle": "Genåbnede denne ticket!",
"reopenDescription": "Snak gerne igen!",
"closedTitle": "Lukket denne ticket!",
"closedDescription": "Kun administratorer kan tale i denne billet nu!\n\n*Klik på knappen nedenfor for at slette eller genåbne denne billet!",
"createdTitle": "Ticket Oprettet!",
"createdDescription": "Din ticket er oprettet, du kan registrere den ved et ping!",
@@ -71,9 +83,11 @@
"none": "intet",
"reason": "grundlag",
"createdat": "lavet af",
"openedby": "åbnet af",
"deletedby": "slettet af",
"closedby": "lukket af",
"modalreason": "Hvad er grunden til at lukke denne ticket?",
"chooseATicket": "Vælg en ticket"
},
@@ -83,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!"
}
}
+53 -5
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"djj123dj",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Onjuiste parameters!",
"missingArgsDescription":"Er missen parameters",
@@ -24,10 +27,17 @@
"closeTitle":"Ticket gesloten!",
"deleteTitle":"Ticket aan het verwijderen...",
"reopenTitle":"Ticket heropend!",
"claimTitle":"Dit ticket is geclaimed door {0}",
"unclaimTitle":"Dit ticket is niet meer geclaimed!",
"changeTitle":"Ticket type veranderd naar {0}!",
"statsTitle":"Hier zijn de stats voor {0}!",
"autocloseTitle":"Dit ticket wordt automatisch gesloten na {0}!",
"autocloseRejectTitle":"Dit ticket wordt niet langer automatisch gesloten!",
"autocloseWarn":"Dit geldt alleen voor inactieve tickets!",
"goToTicket":"ga naar ticket",
"ticketWarning":"De embed is in het bericht hier onder!",
"maxTicketWarning":"**Waarschuwing:** _Je kan maar {0} ticket(s) tegelijkertijd maken!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Verijder een ticket.",
"addCmd":"Voeg een user aan een ticket.",
"removeCmd":"Verwijder een user van een ticket.",
"reopenCmd":"Heropen een ticket nadat het gesloten is."
"reopenCmd":"Heropen een ticket nadat het gesloten is.",
"changeCmd":"Verander ticket type.",
"claimCmd":"Claim een ticket.",
"unclaimCmd":"Unclaim een ticket.",
"statsCmd":"Bekijk ticket stats.",
"autocloseCmd":"Zet een timer om het ticket automatisch te sluiten"
},
"buttons":{
"close":"Sluit Ticket",
@@ -51,9 +66,6 @@
"closeWithReason":"sluit met reden"
},
"messages":{
"reopenTitle":"Ticket heropend!",
"reopenDescription":"Voel vrij om weer te praten!",
"closedTitle":"Ticket gesloten!",
"closedDescription":"Alleen admins kunnen nog praten.\n\n*Klik op de knoppen hieronder voor meer acties!*",
"createdTitle":"Ticket Aangemaakt!",
"createdDescription":"U ticket is gemaakt, je kan het detecteren bij een ping!",
@@ -71,9 +83,11 @@
"none":"geen",
"reason":"reden",
"createdat":"gecreëerd op",
"openedby":"geopend door",
"deletedby":"verwijderd door",
"closedby":"gesloten door",
"modalreason":"Wat is de reden om dit ticket te sluiten?",
"chooseATicket": "Kies een ticket"
},
@@ -83,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!"
}
}
+54 -6
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"DJdj Development",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Invalid Arguments!",
"missingArgsDescription":"Missing Argument",
@@ -24,10 +27,17 @@
"closeTitle":"Closed this ticket!",
"deleteTitle":"Deleting this ticket...",
"reopenTitle":"Re-Opened this ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"claimTitle":"This ticket is claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"ticketWarning":"The embed is in the message below!",
"maxTicketWarning":"**Warning:** _You can only create {0} ticket(s) at a time!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Delete a ticket.",
"addCmd":"Add a user to the ticket.",
"removeCmd":"Remove a user from the ticket.",
"reopenCmd":"Re-Open a ticket after it was closed."
"reopenCmd":"Re-Open a ticket after it was closed.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
},
"buttons":{
"close":"Close Ticket",
@@ -51,9 +66,6 @@
"closeWithReason":"close with reason"
},
"messages":{
"reopenTitle":"Re-Opened this ticket!",
"reopenDescription":"Feel free to talk again!",
"closedTitle":"Closed this ticket!",
"closedDescription":"Only admins can talk in this ticket now!\n\n*Click on the button below to delete or to re-open this ticket!*",
"createdTitle":"Ticket Created!",
"createdDescription":"Your ticket is created, you can detect it by a ping!",
@@ -71,9 +83,11 @@
"none":"none",
"reason":"reason",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"deleted by",
"closedby":"closed by",
"modalreason":"What is the reason for closing this ticket?",
"chooseATicket": "Choose a ticket"
},
@@ -83,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!"
}
}
+106 -58
View File
@@ -1,87 +1,135 @@
{
"_CREDITS":"tostam",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Arguments invalides!",
"missingArgsDescription":"Argument manquant",
"noPermsTitle":"Pas de permissions!",
"noPermsDescription":"Vous avez besoin de la permission `ADMINISTRATOR` ou être dans la liste des rôles autorisés!",
"noPermsDelete":"Seuls les administrateurs peuvent supprimer un ticket!",
"chooseFromListTitle":"Invalid ID",
"missingArgsTitle":"Arguments invalides !",
"missingArgsDescription":"Argument manquant !",
"noPermsTitle":"Tu n'as pas les permissions requises !",
"noPermsDescription":"Vous avez besoin de la permission `ADMINISTRATOR` ou être dans la liste des rôles autorisés !",
"noPermsDelete":"Seuls les staffs peuvent supprimer un ticket !",
"chooseFromListTitle":"ID invalide !",
"chooseFromListDescription":"Choisissez l'un des identifiants ci-dessous:",
"boterror":"Bot Error!",
"notInTicketTitle":"Vous n'êtes pas dans un ticket!",
"notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets!",
"ticketDoesntExist":"Ce ticket n'existe plus!",
"roleDoesntExist":"Ce rôle n'existe plus!",
"anotherOption":"Cette option n'est pas un ticket mais un autre type!",
"maxAmountTitle":"Montant maximum atteint!",
"maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés!\nVous ne pouvez donc pas en créer un nouveau!",
"somethingWentWrong":"**Quelque chose s'est mal passé!**\nVeuillez réessayer une autre fois!"
"boterror":"Erreur du bot !",
"notInTicketTitle":"Vous n'êtes pas dans un ticket !",
"notInTicketDescription":"Cette commande ne fonctionne pas en dehors des tickets !",
"ticketDoesntExist":"Ce ticket n'existe pas !",
"roleDoesntExist":"Ce rôle n'existe pas !",
"anotherOption":"Cette option n'est pas un ticket mais un autre type !",
"maxAmountTitle":"Montant maximum de ticket atteint !",
"maxAmountDescription":"Vous avez atteint le nombre maximum de tickets autorisés !\nVous ne pouvez donc pas en créer un nouveau !",
"somethingWentWrong":"**Quelque chose s'est mal passé !**\nVeuillez réessayer une autre fois !"
},
"commands":{
"userAddedTitle":"{0} a été ajouté à ce ticket!",
"userRemovedTitle":"Supprimé {0} de ce ticket!",
"renameTitle":"Changement du nom en {0}!",
"closeTitle":"Fermé ce ticket!",
"userAddedTitle":"{0} a été ajouté à ce ticket !",
"userRemovedTitle":"{0} a été supprimé de ce ticket !",
"renameTitle":"Changement de nom du ticket en {0} !",
"closeTitle":"Ticket fermé",
"deleteTitle":"Suppression de ce ticket...",
"reopenTitle":"A rouvert ce ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"reopenTitle":"Ticket réouvert",
"claimTitle":"Ce ticket est maintenant réclamé par {0}",
"unclaimTitle":"Ce ticket n'est plus réclamé !",
"changeTitle":"Modification du type de ticket en {0} !",
"ticketWarning":"L'intégration est dans le message ci-dessous!",
"maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_"
"statsTitle":"Voici les statistiques pour {0} !",
"autocloseTitle":"Ce ticket sera automatiquement clôturé après {0} !",
"autocloseRejectTitle":"Ce ticket ne sera plus clôturé automatiquement !",
"autocloseWarn":"Cela n'affecte que les tickets inactifs !",
"goToTicket":"Aller au ticket",
"ticketWarning":"L'intégration est dans le message ci-dessous !",
"maxTicketWarning":"**Attention :** _Vous ne pouvez créer seulement {0} ticket(s) à la fois !_"
},
"helpMenu":{
"title":"Commandes disponibles :",
"header1":"**Allez à {0} pour créer un ticket !**\n\n",
"title":"Commandes disponibles :",
"header1":"**Allez à {0} pour créer un ticket !**\n\n",
"header2":"**Exécutez la commande `/new` ou `/ticket` pour créer un ticket !**\n\n",
"msgCmd":"Faire apparaître une intégration avec des boutons. (administrateurs uniquement)",
"renameCmd":"Renommer un ticket. (sans espaces)",
"closeCmd":"Fermer un ticket.",
"deleteCmd":"Supprimer un billet.",
"addCmd":"Ajouter un utilisateur au ticket.",
"removeCmd":"Supprimer un utilisateur du ticket.",
"reopenCmd":"Rouvrir un ticket après sa clôture."
"msgCmd":"Faire apparaître une intégration avec des boutons (administrateurs uniquement)",
"renameCmd":"Renommer un ticket (sans espaces)",
"closeCmd":"Fermer un ticket",
"deleteCmd":"Supprimer un ticket",
"addCmd":"Ajouter un utilisateur au ticket",
"removeCmd":"Supprimer un utilisateur du ticket",
"reopenCmd":"Réouvrir un ticket après sa clôture",
"changeCmd":"Changer le type de ticket",
"claimCmd":"Réclamer un ticket",
"unclaimCmd":"Annuler la réclamation d'un ticket",
"statsCmd":"Afficher les statistiques des tickets",
"autocloseCmd":"Définir une minuterie pour fermer automatiquement le ticket"
},
"buttons":{
"close":"Fermer le ticket",
"delete":"Supprimer le billet",
"reopen":"Billet de réouverture",
"closeWithReason":"fermer avec une raison"
"delete":"Supprimer le ticket",
"reopen":"Réouvrir le ticket",
"closeWithReason":"Fermer avec une raison"
},
"messages":{
"reopenTitle":"A rouvert ce ticket!",
"reopenDescription":"N'hésitez pas à reparler!",
"closedTitle":"Fermé ce ticket!",
"closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou rouvrir ce ticket !*",
"createdTitle":"Ticket créé !",
"closedDescription":"Seuls les administrateurs peuvent parler dans ce ticket maintenant !\n\n*Cliquez sur le bouton ci-dessous pour supprimer ou réouvrir ce ticket !*",
"createdTitle":"Ticket créé !",
"createdDescription":"Votre ticket est créé, vous pouvez le détecter par un ping !",
"newTicketDmTitle":"Nouveau billet!",
"closedTicketDmTitle":"Billet fermé!",
"deletedTicketDmTitle":"Billet supprimé !",
"closedTicketDmDescription":"Votre billet est fermé !",
"deletedTicketDmDescription":"Votre billet est supprimé !",
"reopenTicketDmTitle":"Billet rouvert!",
"reopenTicketDmDescription":"Votre billet est rouvert !",
"newTicketDmTitle":"Nouveau ticket !",
"closedTicketDmTitle":"Ticket fermé !",
"deletedTicketDmTitle":"Ticket supprimé !",
"closedTicketDmDescription":"Votre ticket est fermé !",
"deletedTicketDmDescription":"Votre ticket est supprimé !",
"reopenTicketDmTitle":"Ticket réouvert !",
"reopenTicketDmDescription":"Votre ticket est réouvert !",
"chooseCategory":"choisissez une catégorie:",
"chooseCategory":"Choisissez une catégorie:",
"gettingdeleted":"Le ticket est en cours de suppression...",
"none":"rien",
"reason":"raison",
"deletedby":"supprimé par",
"closedby":"fermé par",
"modalreason":"Qu’elle est la raison pour fermer ce ticket?",
"none":"Rien",
"reason":"Raison",
"createdat":"Créé à",
"openedby":"Ouvert par",
"deletedby":"Supprimé par",
"closedby":"Fermé par",
"modalreason":"Qu'elle est la raison pour fermer ce ticket ?",
"chooseATicket": "Choisir un ticket"
},
"transcripts":{
"title":"Transcript",
"processed":"Cette transcript est en cours de traitement",
"wait":"S'il vous plait, attendez...",
"estimated":"Temps estime:",
"estimated":"Temps estimé:",
"available":"La transcript est disponible ici"
},
"stats":{
"globalTitle":"Statistiques du serveur",
"ticketTitle":"Statistiques des tickets pour {0}",
"userTitle":"Statistiques des utilisateurs 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 réouverts",
"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":"Réouvert",
"closed":"Fermé",
"autoclosed":"Fermé automatiquement"
},
"errorUserNotFound":"Cet utilisateur est introuvable dans la base de données de statistiques !"
}
}
}
+57 -9
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"david.3",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Ungültiges Argument!",
"missingArgsDescription":"Fehlendes Argument!",
@@ -24,12 +27,19 @@
"closeTitle":"Dieses Ticket schließen!",
"deleteTitle":"Löschen Sie dieses Ticket!",
"reopenTitle":"Öffne dieses Ticket erneut!",
"claimTitle":"Das Ticket wurde beansprucht von {0}",
"unclaimTitle":"Das Ticket wrid nicht mehr beansprucht",
"changeTitle":"Ticket Typ wurde geändert auf {0}!",
"claimTitle":"Dieses Ticket wurde beansprucht von {0}",
"unclaimTitle":"Dieses Ticket wird nichtmehr beansprucht.",
"changeTitle":"Ticket Typ wurde geändert zu {0}!",
"statsTitle":"Hier sind die Stats für {0}!",
"autocloseTitle":"Dieses Ticket wird automatisch geschlossen in {0}!",
"autocloseRejectTitle":"Dieses Ticket wird nichtmehr automatisch geschlossen",
"autocloseWarn":"Dies betrifft nur inaktive Tickets!",
"goToTicket":"Geh zu deinem Ticket",
"ticketWarning":"Die Einbettung befindet sich in der Nachricht unten!",
"maxTicketWarning":"**Warnung:** _Sie können nur {0} ticket(s) erstellen zu einer Zeit!_"
"maxTicketWarning":"**Warnung:** _Es können maximal {0} Tickets zur gleichen Zeit geöffnet sein!_"
},
"helpMenu":{
"title":"Hilfe Menu:",
@@ -42,7 +52,12 @@
"deleteCmd":"Ein Ticket löschen.",
"addCmd":"Fügen Sie dem Ticket einen Benutzer hinzu.",
"removeCmd":"Entfernen eines Benutzers aus dem Ticket.",
"reopenCmd":"Öffnen Sie ein Ticket erneut, nachdem es geschlossen wurde."
"reopenCmd":"Öffnen Sie ein Ticket erneut, nachdem es geschlossen wurde.",
"changeCmd":"Ticket Typ ändern",
"claimCmd":"Ticket beanspruchen",
"unclaimCmd":"Ticket nicht mehr beanspruchen.",
"statsCmd":"Ticket Stats",
"autocloseCmd":"Timer wurde gesetzt auf automatisches schließen des Tickets"
},
"buttons":{
"close":"Ticket schließen",
@@ -51,9 +66,6 @@
"closeWithReason":"Geschlossen mit dem Grund"
},
"messages":{
"reopenTitle":"Dieses Ticket wiedereröffnet!",
"reopenDescription":"Sie können gerne weiterreden!",
"closedTitle":"Dieses Ticket geschlossen!",
"closedDescription":"Nur Admins können jetzt in diesem Ticket sprechen!\n\n*Klicken Sie auf die Schaltfläche unten, um dieses Ticket zu löschen oder erneut zu öffnen!*",
"createdTitle":"Ticket erstellt!",
"createdDescription":"Ihr Ticket ist erstellt, Sie können es durch einen Ping erkennen!",
@@ -71,9 +83,11 @@
"none":"none",
"reason":"Grund",
"createdat":"Erstellt um",
"openedby":"Geöffnet um",
"deletedby":"Gelöscht von",
"closedby":"Geschlossen von",
"modalreason":"Was ist der Grund?",
"chooseATicket": "Wähle ein passendes Thema!"
},
@@ -83,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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"ꙅoᴎɒᎸɘƚꙅ#3744",
"_INFO":"This file is a translation for open ticket 3.5.6",
"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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"Snowy",
"_INFO":"This file is a translation for open ticket 3.5.6",
"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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"erxg",
"_INFO":"This file is a translation for open ticket 3.5.6",
"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!"
}
}
+55 -7
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"maurizio26",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Argomenti non validi!",
"missingArgsDescription":"Argomenti mancanti",
@@ -24,10 +27,17 @@
"closeTitle":"Ticket chiuso!",
"deleteTitle":"Eliminando questo ticket...",
"reopenTitle":"Ri-aperto questo ticket!",
"claimTitle":"Questo ticket è ora gestito da {0}",
"claimTitle":"Questo ticket adesso è gestito da {0}",
"unclaimTitle":"Questo ticket non è più gestito!",
"changeTitle":"Cambiato il tipo di ticket in {0}!",
"changeTitle":"Ticket cambiato in {0}!",
"statsTitle":"Queste sono le stats per {0}!",
"autocloseTitle":"Questo ticket sarà eliminato direttamente dopo {0}!",
"autocloseRejectTitle":"Questo ticket non sarà più chiuso automaticamente!",
"autocloseWarn":"Questo vale solo per i ticket inattivi!",
"goToTicket":"vai al ticket",
"ticketWarning":"L'embed è nel messaggio sotto!",
"maxTicketWarning":"*Attenzione:* Tu puoi creare solo {0} ticket alla volta!"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Elimina un ticket.",
"addCmd":"Aggiungi un utente al ticket.",
"removeCmd":"Rimuovi un utente da un ticket.",
"reopenCmd":"Ri-apri un ticket dopo averlo chiuso."
"reopenCmd":"Ri-apri un ticket dopo averlo chiuso.",
"changeCmd":"Cambia tipo di ticket.",
"claimCmd":"Gestisci un ticket.",
"unclaimCmd":"Lascia la gestione del ticket.",
"statsCmd":"Vedi le statistiche dei ticket.",
"autocloseCmd":"Imposta il timer dell'autochiusura dei ticket"
},
"buttons":{
"close":"Chiudi",
@@ -51,9 +66,6 @@
"closeWithReason":"chiudi con motivo"
},
"messages":{
"reopenTitle":"Ticket ri-aperto!",
"reopenDescription":"Sentiti libero di parlare nuovamente!",
"closedTitle":"Ticket chiuso!",
"closedDescription":"Solo gli amministratori possono parlare in questo ticket ora!\n\n*Clicca sul pulsante sotto per eliminare o ri-aprire questo ticket!*",
"createdTitle":"Ticket creato!",
"createdDescription":"Il tuo ticket è stato creato, puoi capirlo dal ping!",
@@ -71,9 +83,11 @@
"none":"nessuno",
"reason":"motivo",
"createdat":"creato il",
"openedby":"aperto da",
"deletedby":"eliminato da",
"closedby":"chiuso da",
"modalreason":"Quale è il motivo per chiudere questo ticket?",
"chooseATicket": "Scegli un ticket"
},
@@ -83,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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"raze.hama",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"ئه‌وه‌ی هه‌ڵتبژاردوه‌ نادروسته‌",
"missingArgsDescription":"ئه‌وه‌ی هه‌ڵتبژاردوه‌ ناردوسته‌",
"noPermsTitle":"هیچ مۆڵەتێک نییە!",
"noPermsDescription":"پێویستت بە مۆڵەتی ئه‌دمین ستره‌یته‌ر هەیە یان ده‌بێت لە لیستی ڕۆڵە ڕێگەپێدراوەکاندا بیت!",
"noPermsDelete":"تەنها ئەدمینەکان دەتوانن بلیت بسڕنەوە!",
"chooseFromListTitle":"ناسنامەی نادروست",
"chooseFromListDescription":"یەکێک لەم ناسنامانه‌ی خوارەوە هەڵبژێرە:",
"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":"**Go to {0} to create a ticket!**\n\n",
"header2":"**فەرمانەکە جێبەجێ بکە `/new` or `/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":"ئەم بەکارهێنەرە لە بنکەدراوەی ئامارەکاندا نادۆزرێتەوە!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"Ronalds1398",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Nepareizi argumenti!",
"missingArgsDescription":"Trūkst argumentu!",
"noPermsTitle":"Nav atļauju!",
"noPermsDescription":"Jums ir nepieciešama `ADMINISTRATOR` atļauja vai jābūt atļautajām lomām!",
"noPermsDelete":"Tikai administratori var izdzēst biļetes!",
"chooseFromListTitle":"Nederīgs ID",
"chooseFromListDescription":"Izvēlieties vienu no zemāk esošajiem ID:",
"boterror":"Bota kļūda!",
"notInTicketTitle":"Jūs neesat biļetē!",
"notInTicketDescription":"Šī komanda nedarbojas ārpus biļetēm!",
"ticketDoesntExist":"Šāda biļete vairs nepastāv!",
"roleDoesntExist":"Šāda loma vairs nepastāv!",
"anotherOption":"Tas nav biļete, bet citas veida!",
"maxAmountTitle":"Sasniegta maksimālā summa!",
"maxAmountDescription":"Jūs esat sasniedzis maksimālo atļauto biļešu skaitu!\nTāpēc jūs nevarat izveidot jaunu!",
"somethingWentWrong":"**Kaut kas nogāja greizi!**\nLūdzu, mēģiniet vēlreiz!"
},
"commands":{
"userAddedTitle":"Pievienots {0} šai biļetei!",
"userRemovedTitle":"Noņemts {0} no šīs biļetes!",
"renameTitle":"Pārdēvēts uz {0}!",
"closeTitle":"Biļete aizvērta!",
"deleteTitle":"Dzēšam biļeti",
"reopenTitle":"Atkārtoti atveram biļeti!",
"claimTitle":"Šo biļeti ņēma {0}",
"unclaimTitle":"Šī biļete nav piešķirta nevienam!",
"changeTitle":"Biļetes veids mainīts uz {0}!",
"statsTitle":"Šeit ir statistika par {0}!",
"autocloseTitle":"Šī biļete tiks automātiski aizvērta pēc {0}!",
"autocloseRejectTitle":"Šī biļete vairs netiks automātiski aizvērta!",
"autocloseWarn":"Tas attiecas tikai uz neaktīvām biļetēm!",
"goToTicket":"doties uz biļeti",
"ticketWarning":"Iegults ir zemāk esošajā ziņā!",
"maxTicketWarning":"**Brīdinājums:** _Jūs varat izveidot tikai tik daudz biļetes vienlaikus: {0}!_"
},
"helpMenu":{
"title":"Pieejamie komandu:",
"header1":"**Dodieties uz {0}, lai izveidotu biļeti!**\n\n",
"header2":"**Izpildiet komandu `/new` vai `/ticket`, lai izveidotu biļeti!**\n\n",
"msgCmd":"Izveidojiet iegultni ar pogām. (tikai administratoriem)",
"renameCmd":"Pārdēvējiet biļeti. (bez atstarpēm)",
"closeCmd":"Aizveriet biļeti.",
"deleteCmd":"Dzēst biļeti.",
"addCmd":"Pievienojiet lietotāju biļetei.",
"removeCmd":"Noņemt lietotāju no biļetes.",
"reopenCmd":"Atveriet atkārtoti aizvērtu biļeti.",
"changeCmd":"Mainiet biļetes veidu.",
"claimCmd":"Paņemiet biļeti.",
"unclaimCmd":"Atsakieties no biļetes.",
"statsCmd":"Apskatiet biļetes statistiku.",
"autocloseCmd":"Iestatiet taimeri, lai automātiski aizvērtu biļeti"
},
"buttons":{
"close":"Aizveriet biļeti",
"delete":"Dzēst biļeti",
"reopen":"Atveriet biļeti",
"closeWithReason":"Aizveriet ar iemeslu"
},
"messages":{
"closedDescription":"Pašlaik šajā biļetē var runāt tikai administratori!\n\n*Nospiediet zemāk esošo pogu, lai dzēstu vai atkārtoti atveriet šo biļeti!*",
"createdTitle":"Biļete izveidota!",
"createdDescription":"Jūsu biļete ir izveidota, to varat atpazīt, izmantojot pingu!",
"newTicketDmTitle":"Jauna biļete!",
"closedTicketDmTitle":"Biļete aizvērta!",
"deletedTicketDmTitle":"Biļete dzēsta!",
"closedTicketDmDescription":"Jūsu biļete ir aizvērta!",
"deletedTicketDmDescription":"Jūsu biļete ir dzēsta!",
"reopenTicketDmTitle":"Biļete atkārtoti atvērta!",
"reopenTicketDmDescription":"Jūsu biļete ir atkārtoti atvērta!",
"chooseCategory":"izvēlieties kategoriju:",
"gettingdeleted":"Biļete tiek dzēsta...",
"none":"nav",
"reason":"iemērs",
"createdat":"izveidots",
"openedby":"atvēris",
"deletedby":"dzēsts",
"closedby":"aizvērts",
"modalreason":"Kāds ir šīs biļetes aizvēršanas iemesls?",
"chooseATicket": "Izvēlieties biļeti"
},
"transcripts":{
"title":"Transkripcija",
"processed":"Šī transkripcija tiek apstrādāta",
"wait":"Lūdzu, uzgaidiet!",
"estimated":"Apmēramais laiks",
"available":"Transkripcija pieejama šeit"
},
"stats":{
"globalTitle":"Globālā statistika",
"ticketTitle":"Biļetes statistika priekš {0}",
"userTitle":"Lietotāja statistika priekš {0}",
"systemTitle":"Sistēmas statistika",
"versionTitle":"Bota versija",
"ticketsCreated":"Biļetes izveidotas",
"ticketsClosed":"Biļetes aizvērtas",
"ticketsDeleted":"Biļetes dzēstas",
"ticketsReopened":"Biļetes atkārtoti atvērtas",
"ticketsAutoclosed":"Biļetes automātiski aizvērtas",
"transcriptsCreated":"Transkripcijas izveidotas",
"startupDate":"Palaišanas datums",
"latestUpdate":"Pēdējā atjaunināšana",
"ticketCreatedOn":"Biļete izveidota",
"ticketCreatedBy":"Biļete izveidota",
"messagesSent":"Ziņojumi nosūtīti",
"status":"Statuss",
"participants":"Dalībnieki",
"role":"Loma",
"switches":{
"globalAdmin":"Globālais Administrātors",
"ticketAdmin":"Biļešu Administrātors",
"member":"Dalībnieks",
"open":"Atvērts",
"reopened":"Atkārtoti atvērts",
"closed":"Aizvērts",
"autoclosed":"Automātiski aizvērts"
},
"errorUserNotFound":"Lietotājs nav atrasts mūsu datubāzē!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"noonenook",
"_INFO":"This file is a translation for open ticket 3.5.6",
"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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"sasanwm",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"آرگومان‌های گم شده!",
"missingArgsDescription":"آرگومان گم شده",
"noPermsTitle":"شما دسترسی نداری!",
"noPermsDescription":"شما نیاز به دسترسی `ADMINISTRATOR` دارید یا باید در لیست رول‌های مجاز باشید!",
"noPermsDelete":"فقط ادمین ها میتونند یک تیکت رو حذف کنند!",
"chooseFromListTitle":"ایدی نامعتبر",
"chooseFromListDescription":"یکی از ایدی‌های زیر رو انتخاب کن:",
"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":"این یوزر در دیتابیس آمار پیدا نمیشه!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"mkevas",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Nieprawidłowe argumenty!",
"missingArgsDescription":"Brakujący argument",
"noPermsTitle":"Brak permisji!",
"noPermsDescription":"Musisz mieć uprawnienia `ADMINISTRATOR` lub być na liście dozwolonych ról!",
"noPermsDelete":"Tylko administratorzy mogą usunąć zgłoszenie!",
"chooseFromListTitle":"Błędne ID",
"chooseFromListDescription":"Wybierz jeden z poniższych identyfikatorów:",
"boterror":"Błąd bota!",
"notInTicketTitle":"Nie jesteś w tickecie!",
"notInTicketDescription":"To polecenie nie działa poza ticketami!",
"ticketDoesntExist":"Ten ticket już nie istnieje!",
"roleDoesntExist":"Ta rola już nie istnieje!",
"anotherOption":"Ta opcja nie jest ticketem, ale innym typem!",
"maxAmountTitle":"Maksymalna liczba osiągnięta!",
"maxAmountDescription":"Osiągnąłeś maksymalną dozwoloną liczbę ticketów!\nWięc nie możesz stworzyć nowego!",
"somethingWentWrong":"**Coś poszło nie tak!**\nSpróbuj ponownie innym razem!"
},
"commands":{
"userAddedTitle":"Dodano {0} do tego ticketa!",
"userRemovedTitle":"Usunięto {0} z tego ticketa!",
"renameTitle":"Zmieniono nazwę na {0}!",
"closeTitle":"Zamknięto ten ticket!",
"deleteTitle":"Usuwanie tego zgłoszenia..",
"reopenTitle":"Ponownie otwarto ten ticket!",
"claimTitle":"Ten ticket został odebrany przez {0}",
"unclaimTitle":"Nie można już odebrać tego biletu!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Oto statystyki dotyczące {0}!",
"autocloseTitle":"Ten ticket zostanie automatycznie zamknięty po {0}!",
"autocloseRejectTitle":"Ten ticket nie będzie już automatycznie zamykany!",
"autocloseWarn":"Dotyczy to tylko nieaktywnych biletów!",
"goToTicket":"Przejdź do ticketa",
"ticketWarning":"Osadzenie znajduje się w wiadomości poniżej!",
"maxTicketWarning":"**Ostrzeżenie:** _Możesz utworzyć tylko {0} bilet(ów) na raz!_"
},
"helpMenu":{
"title":"Dostępne polecenia:",
"header1":"**Przejdź do {0}, aby utworzyć zgłoszenie!**\n\n",
"header2":"**Uruchom polecenie `/new` lub `/ticket`, aby utworzyć zgłoszenie!**\n\n",
"msgCmd":"Odradzaj osadzanie za pomocą przycisków. (tylko administratorzy)",
"renameCmd":"Zmień nazwę zgłoszenia. (bez spacji)",
"closeCmd":"Zamknij ticket.",
"deleteCmd":"Skasuj ticket.",
"addCmd":"Dodaj użytkownika do zgłoszenia.",
"removeCmd":"Usuń użytkownika ze zgłoszenia.",
"reopenCmd":"Otwórz ponownie ticket po jego zamknięciu.",
"changeCmd":"Zmień typ ticketa.",
"claimCmd":"Odbierz ticket.",
"unclaimCmd":"Zrezygnuj z ticketa.",
"statsCmd":"Pokaż statystyki zgłoszenia.",
"autocloseCmd":"Ustaw timer, aby automatycznie zamykał ticket."
},
"buttons":{
"close":"Zamknij",
"delete":"Skasuj",
"reopen":"Otworz ponownie",
"closeWithReason":"Zamknij z powodem"
},
"messages":{
"closedDescription":"Tylko admini mogą teraz rozmawiać w tym zgłoszeniu!\n\n*Kliknij przycisk poniżej, aby usunąć lub ponownie otworzyć ten ticket!*",
"createdTitle":"Ticket Created!",
"createdDescription":"Twój ticket został utworzony, możesz go wykryć za pomocą pingu!",
"newTicketDmTitle":"Nowy Ticket!",
"closedTicketDmTitle":"Ticket Zamknięty!",
"deletedTicketDmTitle":"Ticket Skasowany!",
"closedTicketDmDescription":"Twój ticket jest zamknięty!",
"deletedTicketDmDescription":"Twój ticket został skasowany!",
"reopenTicketDmTitle":"Ticket otwarty!",
"reopenTicketDmDescription":"Twój ticket został ponownie otwarty!",
"chooseCategory":"Wybierz kategorię:",
"gettingdeleted":"Ticket jest usuwany..",
"none":"brak",
"reason":"powód",
"createdat":"utworzony",
"openedby":"otwarte przez",
"deletedby":"skasowane przez",
"closedby":"zamknięte przez",
"modalreason":"Jaki jest powód zamknięcia tego zgłoszenia?",
"chooseATicket": "Wybierz zgłoszenie"
},
"transcripts":{
"title":"Transkrypcja",
"processed":"Ta transkrypcja jest przetwarzana",
"wait":"Proszę czekać!",
"estimated":"Szacowany czas",
"available":"Transkrypcja jest dostępna tutaj"
},
"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!"
}
}
+56 -9
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"quiradon",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Argumentos inválidos!",
"missingArgsDescription":"Argumento ausente",
@@ -24,10 +27,17 @@
"closeTitle":"Fechado este ticket!",
"deleteTitle":"Excluindo este ticket...",
"reopenTitle":"Reabriu este ticket!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"claimTitle":"Esse ticket foi reinvidicado {0}",
"unclaimTitle":"Esse ticket não foi reinvidicado!",
"changeTitle":"Tipo de ticket alterado para {0}!",
"statsTitle":"Aqui estão as estatísticas para {0}!",
"autocloseTitle":"Este ticket vai fechar altomaticamente após {0}!",
"autocloseRejectTitle":"Este ticket não será mais fechado automaticamente!",
"autocloseWarn":"Isso apenas afeta tickets inativos!",
"goToTicket":"ir para ticket",
"ticketWarning":"A incorporação está na mensagem abaixo!",
"maxTicketWarning":"**Cuidado:** _Você só pode criar {0} ticket(s) de cada vez!!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Excluir um ticket.",
"addCmd":"Adicionar um usuário ao ticket.",
"removeCmd":"Remover um usuário do ticket.",
"reopenCmd":"Reabra um ticket depois que ele foi fechado."
"reopenCmd":"Reabra um ticket depois que ele foi fechado.",
"changeCmd":"Mudar tipo de ticket",
"claimCmd":"Resgatar Ticket",
"unclaimCmd":"Desresgatar Ticket",
"statsCmd":"Olhar status do ticket",
"autocloseCmd":"Definir tempo para fechar ticket automaticamente."
},
"buttons":{
"close":"Fechar Ticket",
@@ -51,9 +66,6 @@
"closeWithReason":"fechado com motivo"
},
"messages":{
"reopenTitle":"Reabriu este ticket!",
"reopenDescription":"Sinta-se à vontade para falar novamente!",
"closedTitle":"Fechado este ticket!",
"closedDescription":"Somente administradores podem falar neste ticket agora!\n\n*Clique no botão abaixo para excluir ou reabrir este ticket!*",
"createdTitle":"Ticket criado!",
"createdDescription":"Seu ticket foi criado, você pode detectá-lo com um ping!",
@@ -71,11 +83,12 @@
"none":"vazio",
"reason":"motivo",
"createdat":"Criado por:",
"openedby":"Aberto por:",
"deletedby":"deletado por",
"closedby":"fechado por",
"modalreason":"Qual o motivo de fechar o ticket?",
"chooseATicket": "Fechar Ticket"
},
"transcripts":{
@@ -84,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!"
}
}
+56 -8
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"Sanke#6086",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Argumente Invalide",
"missingArgsDescription":"Argument Lipsa",
@@ -24,10 +27,17 @@
"closeTitle":"Ticket inchis!",
"deleteTitle":"Se sterge ticket-ul...",
"reopenTitle":"Ticket Re-deschis!",
"claimTitle":"This ticket is now claimed to {0}",
"unclaimTitle":"This ticket isn't claimed anymore!",
"changeTitle":"Changed ticket type to {0}!",
"claimTitle":"Acest ticket a primit claim de la {0}",
"unclaimTitle":"Acest ticket nu mai este detinut!",
"changeTitle":"A fost schimbat tipul ticket-ului la {0}!",
"statsTitle":"Acestea sunt informatiile pentru {0}!",
"autocloseTitle":"Acest ticket va fi inchis automat dupa {0}!",
"autocloseRejectTitle":"Acest ticket nu va mai fi inchis automat!",
"autocloseWarn":"Aceasta optiune afecteaza numai ticketele inactive!",
"goToTicket":"Mergi la ticket",
"ticketWarning":"Embed-ul se afla in mesajul de mai jos!",
"maxTicketWarning":"**Avertizare:** _Poti creea doar {0} tickete active!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Sterge un ticket.",
"addCmd":"Adauga un utilizator in ticket.",
"removeCmd":"Sterge un utilizator din ticket.",
"reopenCmd":"Re-deschide un ticket dupa ce a fost deschis."
"reopenCmd":"Re-deschide un ticket dupa ce a fost deschis.",
"changeCmd":"Schimba categoria ticket-ului.",
"claimCmd":"Revendica un ticket",
"unclaimCmd":"Anuleaza revendicarea unui ticket.",
"statsCmd":"Afiseasa informatiile ticket-ului.",
"autocloseCmd":"Seteaza un cronometru pentru inchiderea ticket-ului."
},
"buttons":{
"close":"Inchide ticket-ul",
@@ -51,9 +66,6 @@
"closeWithReason":"Inchide cu motiv"
},
"messages":{
"reopenTitle":"Ticket Re-deschis!",
"reopenDescription":"Poti vorbi din nou!",
"closedTitle":"Ticket inchis!",
"closedDescription":"Doar adminii pot vorbi in acest ticket acum!\n\n*Apasa pe butonul de mai jos pentru a re-deschide ori sterge ticket-ul!*",
"createdTitle":"Ticket Creat!",
"createdDescription":"Ticket-ul tau a fost creat, poti sa il vezi in canalul pe care ai fost mentionat!",
@@ -71,9 +83,11 @@
"none":"niciunul",
"reason":"Motiv",
"createdat":"Creat la",
"openedby":"Deschis de",
"deletedby":"Sters de",
"closedby":"Inchis de",
"modalreason":"Care este motivul pentru inchiderea acestui ticket?",
"chooseATicket": "Alege un ticket"
},
@@ -83,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!"
}
}
+55 -7
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"apexo & ander",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Неверные аргументы!",
"missingArgsDescription":"Отсутствует аргумент",
@@ -24,10 +27,17 @@
"closeTitle":"Закрыл этот тикет!",
"deleteTitle":"Удаляем этот тикет...",
"reopenTitle":"Открываем заново этот тикет!",
"claimTitle":"Этот тикет теперь взят {0}",
"unclaimTitle":"Этот тикет никем не взят!",
"changeTitle":"Изменён тип тикета на {0}!",
"statsTitle":"Здесь статистика для {0}!",
"autocloseTitle":"Этот тикет будет закрыт автоматически после {0}!",
"autocloseRejectTitle":"Этот тикет больше не будет закрыт автоматически!",
"autocloseWarn":"Это касается только неактивных тикетов!",
"goToTicket":"перейти в тикет",
"ticketWarning":"embed ниже сообщения!",
"maxTicketWarning":"**Предупреждение:** _Вы можете создать только {0} тикет(а/ов) в этот раз!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Удалить тикет.",
"addCmd":"Добавить пользователя в тикет.",
"removeCmd":"Удалить пользователя из тикета.",
"reopenCmd":"Открыть заново тикет после того, как он был закрыт."
"reopenCmd":"Открыть заново тикет после того, как он был закрыт.",
"changeCmd":"Поменять тип тикета.",
"claimCmd":"Взять тикет.",
"unclaimCmd":"Снять тикет.",
"statsCmd":"Посмотреть статистику тикета.",
"autocloseCmd":"Установить таймер, чтобы автоматически закрыть тикет"
},
"buttons":{
"close":"Закрыть тикет",
@@ -51,9 +66,6 @@
"closeWithReason":"закрыть с причиной"
},
"messages":{
"reopenTitle":"Открыл заново этот тикет!",
"reopenDescription":"Не стесняйтесь обращаться снова!",
"closedTitle":"Закрыл этот тикет!",
"closedDescription":"Только админы теперь могут писать в этом тикете!\n\n*Нажмите на кнопку ниже, чтобы удалить или заново окрыть тикет!*",
"createdTitle":"Тикет создан!",
"createdDescription":"Ваш тикет создан, вы можете обнаружить его по пингу!",
@@ -71,17 +83,53 @@
"none":"отсутствует",
"reason":"причина",
"createdat":"создан",
"openedby":"открыт",
"deletedby":"удалён",
"closedby":"закрыт",
"modalreason":"Какая причина закрытия этого тикета?",
"chooseATicket": "Выберите тикет"
},
"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":"Участник не найден в базе данных статистики!"
}
}
}
+67 -15
View File
@@ -2,6 +2,7 @@
"examples":{
"en-GB":"english",
"en-US":"english",
"no": "Norwegian",
"nl":"dutch",
"ro":"romanian",
"de":"german",
@@ -10,14 +11,18 @@
"es-ES":"spanish",
"it":"italian",
"ru":"russian",
"tr": "Türkçe",
"ar": "Arabic",
"th": "Thailand",
"MISSING":"arabic,portuguese",
"NOTAVAILABLE":"arabic,portuguese,czech"
"MISSING":"portuguese",
"NOTAVAILABLE":"portuguese,czech"
},
"data":{
"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 +30,15 @@
"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.",
"ar": "قائمة للكوماندات المتاحة",
"th": "List คำสั่งที่สามารถใช้งานได้"
},
"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 +46,15 @@
"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.",
"ar": "أنشاء أيمبد مع الأزرار.",
"th": "เรียก Embed และปุ่มต่างๆ"
},
"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 +62,15 @@
"fr":"Fermer un ticket.",
"es-ES":"Cierra un ticket.",
"it":"Chiudi un ticket.",
"ru":"Закрыть тикет"
"ru":"Закрыть тикет",
"tr": "Bileti kapat.",
"ar": "اغلاق تيكت.",
"th": "ปิดห้องติดต่อ"
},
"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 +78,15 @@
"fr":"Supprimer un ticket.",
"es-ES":"Elimina un ticket.",
"it":"Elimina un ticket.",
"ru":"Удалить тикет"
"ru":"Удалить тикет",
"tr": "Bileti sil.",
"ar": "حذف تيكت.",
"th": "ลบห้องติดต่อ"
},
"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 +94,15 @@
"fr":"Re-ouvrir un ticket.",
"es-ES":"Re-abre un ticket.",
"it":"Ri-Apri un ticket.",
"ru":"Открыть заново тикет"
"ru":"Открыть заново тикет",
"tr": "Bileti yeniden aç.",
"ar": "اعادة فتح تيكت.",
"th": "เปิดห้องติดต่อใหม่อีกครั้ง"
},
"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 +110,15 @@
"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.",
"ar": "اضافة مستخدم اخر الى تيكت معين.",
"th": "เพิ่มผู้ใช้เข้ามาในห้องติดต่อ"
},
"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 +126,15 @@
"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.",
"ar": "ازالة مستخدم من تيكت معين.",
"th": "ลบผู้ใช้ออกจากห้องติดต่อ"
},
"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 +142,15 @@
"fr":"Créer un ticket",
"es-ES":"Crear un ticket.",
"it":"Crea un ticket",
"ru":"Создать тикет"
"ru":"Создать тикет",
"tr": "Bilet oluştur",
"ar": "انشاء تيكت.",
"th": "สร้างห้องติดต่อใหม่"
},
"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 +158,15 @@
"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.",
"ar": "اعادة تسمية التيكت.",
"th": "แก้ไชชื่อห้องติดต่อ"
},
"claim":{
"en-GB":"Claim a ticket.",
"en-US":"Claim a ticket.",
"no":"Overta ticket.",
"nl":"Claim een ticket.",
"ro":" ",
"de":" ",
@@ -133,11 +174,15 @@
"fr":" ",
"es-ES":" ",
"it":" ",
"ru":"Взять тикет"
"ru":"Взять тикет",
"tr":"Bilet talep et.",
"ar": "تعيين التيكت",
"th": "รับเรื่อง"
},
"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 +190,15 @@
"fr":" ",
"es-ES":" ",
"it":" ",
"ru":"Снять тикет"
"ru":"Снять тикет",
"tr":"Bileti iptal et.",
"ar": "ازالة التعيين من شخص الى التيكت",
"th": "ยกเลิกการรับเรื่อง"
},
"category":{
"en-GB":"Change ticket type.",
"en-US":"Change ticket type.",
"no":"Endre ticket type.",
"nl":"Verander ticket type.",
"ro":" ",
"de":" ",
@@ -157,7 +206,10 @@
"fr":" ",
"es-ES":" ",
"it":" ",
"ru":"Изменить тип тикета"
"ru":"Изменить тип тикета",
"tr":"Bilet türünü değiştir.",
"ar": "تغيير نوع التيكت",
"th": "เปลี่ยนประเภทห้องติดต่อ"
}
}
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"n1kkec",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Napačen argument!",
"missingArgsDescription":"Argument manka",
"noPermsTitle":"Nimas dovoljenja!",
"noPermsDescription":"Potrebuješ dovoljenje `ADMINISTRATOR` ali pa biti v listi dovoljenih role!",
"noPermsDelete":"Samo admini lahko izbrišejo ticket!",
"chooseFromListTitle":"Napačen ID",
"chooseFromListDescription":"Izberi eden izmed ID-jev:",
"boterror":"NAPAKA Bota!",
"notInTicketTitle":"Nisi v ticketu!",
"notInTicketDescription": "Ta ukaz ne deluje zunaj ticket-ov!",
"ticketDoesntExist": "Ta ticket ne obstaja več!",
"roleDoesntExist": "Ta vloga ne obstaja več!",
"anotherOption": "Ta možnost ni ticket, ampak druga vrsta!",
"maxAmountTitle": "Najvišji doseženi znesek!",
"maxAmountDescription": "Dosegli ste največje dovoljeno število ticket-ov!\nTako da ne morete ustvariti nove!",
"somethingWentWrong": "**Nekaj je šlo narobe!**\nProsimo, poskusite znova drugič!"
},
"commands":{
"userAddedTitle": "Dodan {0} v ta ticket!",
"userRemovedTitle": "Odstranjeo {0} iz tega ticket-!",
"renameTitle": "Spremenjeno ime na {0}!",
"closeTitle": "Zaprl ta ticket!",
"deleteTitle": "Brisanje ticketa...",
"reopenTitle": "Ponovno odprl ta ticket!",
"claimTitle":"Ticket je claimal {0}",
"unclaimTitle":"Ticket ni več claiman!",
"changeTitle":"Changed ticket type to {0}!",
"statsTitle":"Statistike za {0}!",
"autocloseTitle":"Ticket so avtomatsko zapru po {0}!",
"autocloseRejectTitle":"Ticket se nebo avtomatsko zapru!",
"autocloseWarn":"To ima efekt samo na inactive ticketih!",
"goToTicket":"pojdi v ticket",
"ticketWarning": "Opozorilo je v spodnjem sporočilu!",
"maxTicketWarning": "**Opozorilo:** _Naenkrat lahko ustvarite le {0} ticketov!_"
},
"helpMenu":{
"title": "Razpoložljivi ukazi:",
"header1": "**Izberite {0} in ustvarite ticket!**\n\n",
"header2": "**Zaženi ukaz `/new` ali `/ticket` za ustvarjanje ticket-a!**\n\n",
"msgCmd": "Ustvari vstavek z gumbi. (samo za administratorje)",
"renameCmd": "Preimenujte ticket. (brez presledkov)",
"closeCmd": "Zapri ticket.",
"deleteCmd": "Izbriši ticket.",
"addCmd": "Dodaj uporabnika v ticket.",
"removeCmd": "Odstrani uporabnika z ticket-a.",
"reopenCmd": "Ponovno odprite ticket, ko je bila zaprta.",
"changeCmd":"Spremeni tip ticketa.",
"claimCmd":"Claimaj ticket.",
"unclaimCmd":"Unclaimaj ticket.",
"statCmds":"Statistike ticketa.",
"autocloseCmd":"Nastavi timer da avtomatsko zapre ticket"
},
"buttons":{
"close":"Zapri Ticket",
"delete":"Izbrisi Ticket",
"reopen":"Odpri Ticket",
"closeWithReason":"Zapri z razlogom"
},
"messages":{
"closedDescription": "V tem ticket-u lahko zdaj govorijo samo administratorji!\n\n*Kliknite na spodnji gumb za brisanje ali ponovno odprtje te ticket!*",
"createdTitle": "Ticket ustvarjen!",
"createdDescription": "Vaš ticket je ustvarjen, lahko jo odkrijete s pingom!",
"newTicketDmTitle": "Nov ticket!",
"closedTicketDmTitle": "Ticket zaprt!",
"deletedTicketDmTitle": "Izbrisan ticket!",
"closedTicketDmDescription": "Vaš ticket je zaprta!",
"deletedTicketDmDescription": "Vaš ticket je izbrisan!",
"reopenTicketDmTitle": "Ticket je ponovno odprt!",
"reopenTicketDmDescription": "Vaš ticket je ponovno odprt!",
"chooseCategory": "izberite kategorijo:",
"gettingdeleted": "Ticket se briše...",
"none": "ni",
"reason": "razlog",
"createdat":"ustvarjeno ob",
"openedby":"odprto od",
"deletedby": "izbrisano s",
"closedby": "zaprl",
"modalreason": "Kakšen je razlog za zaprtje tega ticket?",
"chooseATicket": "Izberi ticket"
},
"transcripts":{
"naslov": "Transkript",
"obdelano": "Ta prepis se obdeluje",
"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!"
}
}
+56 -8
View File
@@ -1,4 +1,7 @@
{
"_CREDITS":"redactado & josuens",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"¡Argumentos inválidos!",
"missingArgsDescription":"Argumento faltante.",
@@ -24,10 +27,17 @@
"closeTitle":"Cerró este ticket!",
"deleteTitle":"Eliminando este ticket...",
"reopenTitle":"Re-abrió este boleto!",
"claimTitle":"Este ticket será atendido por {0}",
"unclaimTitle":"¡Este ticket ya no está reservado!",
"changeTitle":"¡Cambiando el tipo de ticket a {0}!",
"claimTitle":"Este ticket fué reclamado por {0}",
"unclaimTitle":"¡Este ticket se encuentra desatendido!",
"changeTitle":"¡Cambiado el tipo de ticket a {0}!",
"statsTitle":"¡Aquí están las estadísticas para {0}!",
"autocloseTitle":"¡Este ticket será cerrado después de {0}!",
"autocloseRejectTitle":"¡Cierre automático del ticket desactivado!",
"autocloseWarn":"¡Esto solo afecta tickets inactivos!",
"goToTicket":"ir al ticket",
"ticketWarning":"La inserción está en el mensaje a continuación!",
"maxTicketWarning":"**Advertencia:** _Solo puedes crear {0} ticket(s) a la vez!_"
},
@@ -42,7 +52,12 @@
"deleteCmd":"Eliminar un ticket.",
"addCmd":"Agregar un usuario al ticket.",
"removeCmd":"Eliminar un usuario del ticket.",
"reopenCmd":"Re-Abre un ticket después de que este se vea cerrado."
"reopenCmd":"Re-Abre un ticket después de que este se vea cerrado.",
"changeCmd":"Cambia el tipo de ticket.",
"claimCmd":"Reclama un ticket.",
"unclaimCmd":"Desatiende un ticket.",
"statsCmd":"Mira las estadísticas de los tickets.",
"autocloseCmd":"Establece un temporizador para cerrar el ticket."
},
"buttons":{
"close":"Cerrar ticket.",
@@ -51,9 +66,6 @@
"closeWithReason":"cerrar con razón"
},
"messages":{
"reopenTitle":"¡Ticket Re-Abierto!",
"reopenDescription":"¡Siéntete libre de hablar de nuevo!",
"closedTitle":"¡Ticket cerrado!",
"closedDescription":"¡Solo admins pueden hablar ahora en este ticket!\n\n*¡Presiona en el botón de abajo para eliminar o re-abrir el ticket!*",
"createdTitle":"¡Ticket creado!",
"createdDescription":"¡Ticket creado, también te he mencionado en él!",
@@ -71,9 +83,11 @@
"none":"Ninguna.",
"reason":"Razón",
"createdat":"creado el",
"openedby":"abierto por",
"deletedby":"eliminado por",
"closedby":"cerrado por",
"modalreason":"Cúal es la razón para cerrar este ticket?",
"chooseATicket": "Elije un ticket"
},
@@ -83,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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"modshd",
"_INFO":"This file is a translation for open ticket 3.5.6",
"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":"ไม่พบผู้ใช้ในฐานข้อมูลสถิติ"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"Hydra#0009",
"_INFO":"This file is a translation for open ticket 3.5.6",
"errors":{
"missingArgsTitle":"Geçersiz argümanlar!",
"missingArgsDescription":"Eksik argüman!",
"noPermsTitle":"Bunun için yetkin yok!",
"noPermsDescription":"Bunu yapmak için 'ADMİNİSTRAR'rolüne ihtiyacınız var, veya izin verilen roller listesinde olun!",
"noPermsDelete":"Sadece adminler bileti silebilir!",
"chooseFromListTitle":"Geçersiz Kimlik",
"chooseFromListDescription":"Aşağıdaki kimliklerden birini seçin:",
"boterror":"Bot Hatası!",
"notInTicketTitle":"Bir biletin yok!",
"notInTicketDescription":"Bu komut bilet dışında kullanılamaz!",
"ticketDoesntExist":"Bu bilet artık yok!",
"roleDoesntExist":"Bu rol artık yok!",
"anotherOption":"Bu seçenek bir bilet değil, başka bir türdür!",
"maxAmountTitle":"Ulaşabileceğin maksimum tutara ulaştın!",
"maxAmountDescription":"İzin verilen maksimum bilet sayısına ulaştınız!\nHhayır yeni bir tane oluşturamazsın!",
"somethingWentWrong":"**Bir şeyler ters gitti!**\n lütfen başka bir zaman tekrar deneyin!"
},
"commands":{
"userAddedTitle":"Bilete {0} adlı kullanıcı eklendi!",
"userRemovedTitle":"Biletten {0} adlı kullanıcı çıkarıldı !",
"renameTitle":"Bilet ismi {0} olarak değştirildi!",
"closeTitle":"Bilet Kapatıldı!",
"deleteTitle":"Bilet siliniyor...",
"reopenTitle":"Bilet Yeniden Açıldı!",
"claimTitle":"Bu bilet artık talep edildi. {0}",
"unclaimTitle":"Tu bilet artık talep edilmiyor!",
"changeTitle":"Bu bilet türü {0} olarak değiştirildi!",
"statsTitle":"Here are the stats for {0}!",
"autocloseTitle":"This ticket will be closed automatically after {0}!",
"autocloseRejectTitle":"This ticket will no longer be closed automatically!",
"autocloseWarn":"This only affects inactive tickets!",
"goToTicket":"go to ticket",
"ticketWarning":"Gömme aşağıdaki mesajda yer almaktadır!",
"maxTicketWarning":"**Uyarı:** _You can only create {0} ticket(s) at a time!_"
},
"helpMenu":{
"title":"Kullanılabilir Komutlar:",
"header1":"**Bilet oluşturmak için {0} kanalını kullan!**\n\n",
"header2":"**Bilet oluşturmak için `/new` veya `/ticket' komutunu çalıştırın!**\n\n",
"msgCmd":"Gömülü bilet mesajı gönderir. (sadece yöneticiler)",
"renameCmd":"Bilet adını değiştirir. (boşluk olmadan)",
"closeCmd":"Bileti kapatır.",
"deleteCmd":"Bileti siler.",
"addCmd":"Bilete kullanıcı ekler.",
"removeCmd":"Biletten kullanıcı çıkarır.",
"reopenCmd":"Bilet kapandıktan sonra tekrar açar.",
"changeCmd":"Change ticket type.",
"claimCmd":"Claim a ticket.",
"unclaimCmd":"Unclaim a ticket.",
"statsCmd":"View ticket stats.",
"autocloseCmd":"Set timer to automatically close ticket"
},
"buttons":{
"close":"Bileti Kapat",
"delete":"Bileti Sil",
"reopen":"Bileti Yeniden Aç",
"closeWithReason":"Bu bileti neden kapatıyorsun ?"
},
"messages":{
"closedDescription":"Bu bilette artık sadece yöneticiler konuşabilir!\n\n* Bu bileti silmek veya yeniden açmak için aşağıdaki butona tıklayın!*",
"createdTitle":"Talep Oluşturuldu!",
"createdDescription":"Your ticket is created, you can detect it by a ping!",
"newTicketDmTitle":"Yeni Bilet!",
"closedTicketDmTitle":"Bilet Kapatıldı!",
"deletedTicketDmTitle":"Bilet Silindi!",
"closedTicketDmDescription":"Senin biletin kapatıldı!",
"deletedTicketDmDescription":"Senin biletin silindi!",
"reopenTicketDmTitle":"Bilet yeniden açıldı!",
"reopenTicketDmDescription":"Senin biletin yeniden açıldı!",
"chooseCategory":"Bir kategori seç:",
"gettingdeleted":"Bu bilet siliniyor...",
"none":"yok",
"reason":"sebep",
"createdat":"created at",
"openedby":"opened by",
"deletedby":"Silen kişi",
"closedby":"Kapatan kişi",
"modalreason":"Bu biletin kapanmasının sebebi nedir?",
"chooseATicket": "Bir bilet seçin"
},
"transcripts":{
"title":"Transkript",
"processed":"Bu transkript işleniyor",
"wait":"Lütfen Bekleyiniz!",
"estimated":"Tahmini Süre",
"available":"Transkript burada mevcuttur"
},
"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!"
}
}
+135
View File
@@ -0,0 +1,135 @@
{
"_CREDITS":"ander",
"_INFO":"Цей файл є перекладом для open ticket 3.5.6",
"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
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Some files were not shown because too many files have changed in this diff Show More