Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b7674f1a5 | ||
|
|
7de9339da3 | ||
|
|
e2e1e19bc8 | ||
|
|
5f19adf561 | ||
|
|
1bb70745ea | ||
|
|
589bbe5cd5 | ||
|
|
447fddea56 | ||
|
|
bf7a003799 | ||
|
|
6115ab1cc8 | ||
|
|
c2307fd1ed | ||
|
|
2a3850c3cc | ||
|
|
688c40ce7b | ||
|
|
dee2a21be9 | ||
|
|
d7ae040d60 | ||
|
|
7b6202985a | ||
|
|
a2f2c601a5 | ||
|
|
b27016df2e | ||
|
|
6341f2f71b | ||
|
|
56a5b9c7d0 | ||
|
|
f608cb71ce | ||
|
|
7c7c325307 | ||
|
|
832021d72a | ||
|
|
030554a7f5 | ||
|
|
ada5ea0c5d | ||
|
|
fb6b891835 | ||
|
|
739ad81f3f | ||
|
|
a6f67a9452 | ||
|
|
56a6540663 | ||
|
|
5f8812d261 | ||
|
|
7a3dcf4c42 | ||
|
|
7cebd4dd6a | ||
|
|
27912a0c37 | ||
|
|
67871d885a | ||
|
|
1bd0d013ed | ||
|
|
a074a17519 | ||
|
|
67af96ef5c | ||
|
|
a041f28cf7 | ||
|
|
a8c9c2ea8d | ||
|
|
8748301b04 | ||
|
|
2d7a7b5728 | ||
|
|
0807ca884c | ||
|
|
0ead037fa8 | ||
|
|
4287c11bf1 | ||
|
|
69fdc7ccf0 | ||
|
|
6c213306b6 | ||
|
|
4096e8196d | ||
|
|
94ee890848 | ||
|
|
4dced819a3 | ||
|
|
1159af9fa9 | ||
|
|
67d429c52b | ||
|
|
f67af805c1 | ||
|
|
944032f690 | ||
|
|
ee248e86bc | ||
|
|
b171bce62b | ||
|
|
df0bce0189 | ||
|
|
2630aa899f | ||
|
|
dba370d66e | ||
|
|
d0bcf26b93 | ||
|
|
65f82171d3 | ||
|
|
6e730f058d | ||
|
|
4702c633ec | ||
|
|
dc14a39c4e | ||
|
|
05c97909d4 | ||
|
|
b3c4c2f6e8 | ||
|
|
e0e678bee0 | ||
|
|
1b01b1703f | ||
|
|
26539360c6 | ||
|
|
627c461f64 | ||
|
|
2e40dc0468 | ||
|
|
fa57b9a93f | ||
|
|
930452155b | ||
|
|
e70f22162d | ||
|
|
d5b0a0f3c6 | ||
|
|
c43081e05d | ||
|
|
8c4bf735f1 | ||
|
|
3a20c4707b | ||
|
|
9a7e563c57 | ||
|
|
72b4f43a25 | ||
|
|
5fec028cc9 | ||
|
|
81300303e5 | ||
|
|
8a1ea1c856 | ||
|
|
8a9d63bf8b | ||
|
|
208b365276 | ||
|
|
abb64a0575 | ||
|
|
c930140540 | ||
|
|
294c4d3f2b | ||
|
|
28e7d48e7e | ||
|
|
bad278e681 | ||
|
|
2e2542d064 | ||
|
|
2c48da45ae | ||
|
|
e1232a559e | ||
|
|
3d58475461 | ||
|
|
f702b199da | ||
|
|
ea1604a805 | ||
|
|
f8bc3d9e12 | ||
|
|
af35f83291 | ||
|
|
39fec94ead | ||
|
|
1b8468330e | ||
|
|
b698c89a89 | ||
|
|
7ed2d7bcc7 | ||
|
|
f2ddaa5fd4 | ||
|
|
fc50a8e83f | ||
|
|
5bece3357d | ||
|
|
97d1489558 | ||
|
|
a211cef1f6 | ||
|
|
ae002e168b | ||
|
|
86a5a1a2ca | ||
|
|
23ebc14b8b | ||
|
|
3a5768a1b1 | ||
|
|
33c3803ca8 | ||
|
|
f3613fb674 | ||
|
|
f1dc8cbcf5 | ||
|
|
a365c4b69f | ||
|
|
687372481a | ||
|
|
1bc8bde922 | ||
|
|
4b8074c520 | ||
|
|
1d5830975f | ||
|
|
95bc1f4fbf | ||
|
|
bfc02611c7 | ||
|
|
e4c1e2559e | ||
|
|
69b669956e | ||
|
|
893a7c5b1f | ||
|
|
ed9c98e2f0 | ||
|
|
62d950b1a6 | ||
|
|
69de612d1e | ||
|
|
5494e112c0 | ||
|
|
cd2c08303e | ||
|
|
a8619e448a | ||
|
|
c990257c02 | ||
|
|
e7f05b4ed5 | ||
|
|
697594b311 | ||
|
|
6823b96114 | ||
|
|
0845390569 | ||
|
|
568b2c9bee | ||
|
|
034247ea99 | ||
|
|
ad10a98f33 | ||
|
|
8aee358081 | ||
|
|
e2f237e7b6 | ||
|
|
210923d29e | ||
|
|
a69f2ee5a1 | ||
|
|
ffa075d177 | ||
|
|
e7a331b969 | ||
|
|
6b32fc9d5d | ||
|
|
7603dbcc47 | ||
|
|
512e564c60 | ||
|
|
5a731e6336 | ||
|
|
d02bf2b826 | ||
|
|
2603a7bdd0 | ||
|
|
c1ba677b82 | ||
|
|
7e6ac6a4b9 | ||
|
|
0ee9a312eb | ||
|
|
d282a516e6 | ||
|
|
9638179d45 | ||
|
|
30d45ddc39 | ||
|
|
2c08ca7245 | ||
|
|
3d5b1f6e8d | ||
|
|
edc8d4bc44 | ||
|
|
c57507cea9 | ||
|
|
ace46deb52 | ||
|
|
fc09858f92 | ||
|
|
1b7767641e | ||
|
|
76d491d27c | ||
|
|
06b57f18f1 | ||
|
|
5f5699f160 | ||
|
|
702f225983 | ||
|
|
aab5a9c241 | ||
|
|
59e756210e | ||
|
|
a8bb210eca | ||
|
|
e3ee51d9fb | ||
|
|
a6e107c12a | ||
|
|
a49b53e2d6 | ||
|
|
0bbde2018c | ||
|
|
15825d0da6 | ||
|
|
9d19c7053b | ||
|
|
09f9944cf7 | ||
|
|
6cd6799712 | ||
|
|
44515fc6b4 | ||
|
|
4c947b138f | ||
|
|
428f4a9e92 | ||
|
|
a274576589 | ||
|
|
2410743a46 | ||
|
|
89a44f3f2f | ||
|
|
1728c3653a | ||
|
|
62a1f0f8c1 | ||
|
|
8875c9ff01 | ||
|
|
9b378caff5 | ||
|
|
821a49cb0b | ||
|
|
ebacb92b99 | ||
|
|
e1eb3f252b | ||
|
|
49405b848e | ||
|
|
5dcd36d290 | ||
|
|
d00a26a1e0 | ||
|
|
8c9eddd4a1 | ||
|
|
046cef0088 | ||
|
|
0f143c7ebb | ||
|
|
4cc12eb727 | ||
|
|
e3e5c04096 | ||
|
|
eddbcf9acd | ||
|
|
3c2f39df9c | ||
|
|
ca4532931b | ||
|
|
14ad1f48f3 | ||
|
|
fa8741aef8 | ||
|
|
130fd98d0c | ||
|
|
a9770ec66c | ||
|
|
f163769de4 | ||
|
|
07de112f32 | ||
|
|
8e7a98b810 | ||
|
|
92c1e8fce0 | ||
|
|
4e73626072 | ||
|
|
943e7b6fef | ||
|
|
af8d6351af |
@@ -0,0 +1,128 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
support@dj-dj.be.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
https://www.contributor-covenant.org/faq. Translations are available at
|
||||||
|
https://www.contributor-covenant.org/translations.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# Contributing
|
||||||
|
## Translation
|
||||||
|
### Step 1: checking
|
||||||
|
1. [Check if the language isn't already in open ticket!](/language/)
|
||||||
|
2. Check if the current translation is up-to-date!
|
||||||
|
3. Can you edit/write JSON?
|
||||||
|
|
||||||
|
If there is translation missing & you can write json, then go to the next step!
|
||||||
|
|
||||||
|
### Step 2: translating
|
||||||
|
**RULES:**
|
||||||
|
- Always upload 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 one is optional & will be added by us if you don't do it!
|
||||||
|
1. add `yourlanguage.json` to the `/language/` directory
|
||||||
|
2. (OPTIONAL) add your discord name & tag 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 an 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!
|
||||||
|
|
||||||
|
<br>
|
||||||
|
CONTRIBUTING GUIDELINES - Last updated: 23/3/2023<br>
|
||||||
|
© DJdj Development<br><br>
|
||||||
|
Website: https://www.dj-dj.be <br>
|
||||||
|
Discord: https://discord.dj-dj.be <br>
|
||||||
|
Email: support@dj-dj.be <br>
|
||||||
|
Open Ticket website: https://openticket.dj-dj.be
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report bugs to help us improve open ticket!
|
||||||
|
title: "[BUG] your bug"
|
||||||
|
labels: bug
|
||||||
|
assignees: DJj123dj
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Device:**
|
||||||
|
- Device: [e.g. Macbook pro, raspberry pi, HP Probook]
|
||||||
|
- OS: [e.g. MacOS, Ubuntu, Windows,...]
|
||||||
|
- Node.js version:
|
||||||
|
- Open Ticket Version:
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
Please include the `openticketdebug.txt` file in your report!
|
||||||
|
This is a file that we can see what happend!
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
name: Plugin
|
||||||
|
about: Show your plugin to the developers from open ticket!
|
||||||
|
title: "[PLUGIN] your plugin"
|
||||||
|
labels: plugin
|
||||||
|
assignees: DJj123dj
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Plugin Name:**
|
||||||
|
What's the name of your plugin?
|
||||||
|
|
||||||
|
**Description:**
|
||||||
|
Tell a little bit about what the plugin does!
|
||||||
|
Also tell how to use the plugin, like if there is additional setup needed!
|
||||||
|
|
||||||
|
**NPM libraries:**
|
||||||
|
List all the libraries needed for this plugin to work!
|
||||||
|
*The default open ticket libraries are not required!*
|
||||||
|
|
||||||
|
**Author:**
|
||||||
|
- github account [e.g. DJj123dj]
|
||||||
|
- discord account [e.g. Wumpus#1234]
|
||||||
|
|
||||||
|
**Compatible versions:**
|
||||||
|
[e.g. from v2.2.1 until v3.0.1]
|
||||||
|
|
||||||
|
**File:**
|
||||||
|
Please attach the plugin file to this issue!
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Supported Versions
|
||||||
|
|
||||||
|
Support for Open Ticket is only available for the versions specified below!
|
||||||
|
|
||||||
|
✅ Supported
|
||||||
|
🟧 Partially Supported
|
||||||
|
❌ Not Supported
|
||||||
|
|
||||||
|
| Version | Supported |
|
||||||
|
|-----------|-------------------|
|
||||||
|
| 3.4.4 | ✅ |
|
||||||
|
| 3.4.2 | ✅ |
|
||||||
|
| 3.4.1 | 🟧 |
|
||||||
|
| < 3.4.1 | ❌ |
|
||||||
|
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
You can report Vulnerabilities, errors & bugs in the following ways:
|
||||||
|
|
||||||
|
- Creating an issue on github
|
||||||
|
- Creating a ticket in our discord server
|
||||||
|
- Reporting the bug in DM on discord (DJj123dj#1706)
|
||||||
|
- Emailing support@dj-dj.be
|
||||||
|
|
||||||
|
If your report an error, be clear about what is going on.
|
||||||
|
Specify the version & language of the bot together with when the error happend. (for example: when I click the close button)
|
||||||
|
Send screenshots from the error if possible, and send openticketdebug.txt (or a screenshot of it) to us.
|
||||||
|
Don't just report the error and never reply again! It can be possible that we need you for more information!
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
Visit [Contributing.md](/.github/CONTRIBUTING.md) for rules about translating & adding features!
|
||||||
|
|
||||||
|
<br>
|
||||||
|
SECURITY POLICY - Last updated: 9/11/2023<br>
|
||||||
|
© DJdj Development<br><br>
|
||||||
|
Website: https://www.dj-dj.be <br>
|
||||||
|
Discord: https://discord.dj-dj.be <br>
|
||||||
|
Email: support@dj-dj.be <br>
|
||||||
|
Open Ticket website: https://openticket.dj-dj.be
|
||||||
+21
-1
@@ -1,2 +1,22 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
devconfig.json
|
||||||
|
devconfig1.json
|
||||||
|
devconfig2.json
|
||||||
|
devconfig3.json
|
||||||
|
devconfig4.json
|
||||||
|
devconfig5.json
|
||||||
|
.DS_Store
|
||||||
|
openticketdebug.txt
|
||||||
|
developerChangelog.md
|
||||||
|
storage/dynamicDB/
|
||||||
|
storage/slashcmdEnabled.txt
|
||||||
|
storage/database.json
|
||||||
|
storage/tsdatabase.json
|
||||||
|
storage/.DS_Store
|
||||||
|
.vscode/
|
||||||
|
livestatus.json
|
||||||
|
test.js
|
||||||
|
devtsconfig.json
|
||||||
|
plugins/*
|
||||||
|
!plugins/example.plugin.js
|
||||||
@@ -1,68 +1,78 @@
|
|||||||
# open-ticket
|
# Coming Soon: OPEN TICKET v4.0 🎉
|
||||||
[](https://discord.com/invite/26vT9wt3n3)
|
Open Ticket v4 is open ticket, but writting from the ground up! For the first time ever!
|
||||||
[](https://github.com/DJj123dj/open-ticket/releases/tag/v1.3.2)
|
There will be a massive improvement with the API that allows for plugins 30 times more advanced than the current ones! It will also be more stable and faster!
|
||||||
[](#packages)
|
|
||||||
[](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
|
|
||||||
|
|
||||||
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
|
It is expected to have a public beta release somewhere around 30 September!
|
||||||
|
<hr>
|
||||||
|
|
||||||
<img src="logo.png" alt="Open Ticket logo" style="height: 200px; width:200px;"/>
|
<img src="https://www.dj-dj.be/wp-content/uploads/2023/02/open-ticket-cropped.png" alt="Open Ticket" width="600px">
|
||||||
|
|
||||||
[](https://github.com/DJj123dj/open-ticket/discussions/3)
|
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v3.4.4) []() [](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE) [](https://docs.openticket.dj-dj.be)
|
||||||
|
|
||||||
[](./documentation/Q&A.md)
|
### Open Ticket
|
||||||
|
Open Ticket is the most customisable discord ticket bot that you will ever find! There are more than 150 options to customise in the config! This includes html transcripts, unlimited amount of tickets, custom embeds & more! Did you know that even the html transcripts are highly customisable? Don't wait and check it out! If you're having trouble setting the bot up, feel free to join our support server and we will help you further!
|
||||||
|
|
||||||
## features
|
Take a look at all the features and discover the possibilities!
|
||||||
- discord interaction buttons
|
### [Documentation](https://docs.openticket.dj-dj.be/quick-start)
|
||||||
- transcripts
|
|
||||||
- add/remove users from ticket
|
|
||||||
- custom colors & name
|
|
||||||
- create custom ticket names, icons & colors
|
|
||||||
- create url buttons for websites
|
|
||||||
- uses discord.js 13
|
|
||||||
- configure your own ticket options
|
|
||||||
- remove credits if you want
|
|
||||||
- up to 6 tickets at the same time
|
|
||||||
- change all bot messages
|
|
||||||
|
|
||||||
## installation
|
## Features
|
||||||
**You need `node.js 16` to run this project!**
|
- **🎉 NEW! html transcripts V2!**
|
||||||
|
- 🔒 close, ❌ delete & ✅ re-open tickets
|
||||||
|
- 🇬🇧 translation in 19 different languages
|
||||||
|
- 📄 very advanced customisation
|
||||||
|
- 🆗 buttons or 🔽 dropdowns!
|
||||||
|
- 🆒 plugins
|
||||||
|
- ∞ unlimited tickets & unlimited messages
|
||||||
|
- ➕➖ add/remove users from a ticket
|
||||||
|
- /slash & text commands
|
||||||
|
|
||||||
You can clone or download this project.
|
<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>
|
||||||
|
|
||||||
### packages
|
## preview
|
||||||
- chalk => version `latest`
|
Images coming soon<br>
|
||||||
- discord.js => version `latest`
|
You can already see some images at our [documentation!](https://docs.openticket.dj-dj.be)
|
||||||
- express => version `latest`
|
|
||||||
- node-localstorage => version `latest`
|
|
||||||
|
|
||||||
You can install all of them by running `npm install`
|
|
||||||
|
|
||||||
## running
|
## credits
|
||||||
you can run `node index.js` but i would recommend you to use `npm start`
|
DJdj Development Team
|
||||||
|
|Main Developer|Developer |Support Team|Designer|
|
||||||
|
|--------------|------------|-----------|---------|
|
||||||
|
|djj123dj |sankedev |DJ-Lite |vuur_draak|
|
||||||
|
|
||||||
if there are any errors, you can open an **issue on github** or **contact me in the discord server**.
|
Translators
|
||||||
|
|Language |Translator |
|
||||||
|
|--------------|-------------------------|
|
||||||
|
|Dutch |djj123dj |
|
||||||
|
|Romanian |sankedev |
|
||||||
|
|French |sankedev |
|
||||||
|
|Spanish |redactado & josuens |
|
||||||
|
|German |david.3 |
|
||||||
|
|Italian |maurizio26 |
|
||||||
|
|Czech |t0miiis#3022 |
|
||||||
|
|Arabic |Sarcastic#9318 |
|
||||||
|
|Danish |.the_gamer |
|
||||||
|
|Portuguese |quiradon |
|
||||||
|
|Russian |apexo |
|
||||||
|
|Turkish |Hydra#0009 |
|
||||||
|
|Polish |mkevas |
|
||||||
|
|Slovenian |n1kkec |
|
||||||
|
|Thai |modshd |
|
||||||
|
|Norwegian |noonenook |
|
||||||
|
|Greek |stefanos#5739 |
|
||||||
|
|Ukrainian |anderskiy |
|
||||||
|
|
||||||
### config
|
## links
|
||||||
Our config documentation is moved to another file:
|
current version: _v3.4.4_
|
||||||
[click here to view](./documentation/CONFIG.md)
|
</br>changelog: [click here](https://docs.openticket.dj-dj.be/other/changelog)
|
||||||
|
</br>documentation: [click here](https://docs.openticket.dj-dj.be/quick-start)
|
||||||
|
|
||||||
### intents & permissions
|
© 2023 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.dj-dj.be) | [terms of service](https://www.dj-dj.be/terms)
|
||||||
In the discord developer portal in the "bot" panel you will find 3 switches under the title "Gateaway Intents". The following switches should always be turned on
|
|
||||||
- `SERVER MEMBERS INTENT`
|
|
||||||
- `MESSAGE CONTENT INTENT`
|
|
||||||
|
|
||||||
To work the best, the bot needs `ADMINISTRATOR` permissions.
|
|
||||||
You can also configure your own permissions
|
|
||||||
|
|
||||||
## v1.4.0 announcement
|
|
||||||
Hello everyone, soon open-ticket v1.4.0 will be launched, it contains a lot of new features. You can view them below.
|
|
||||||
[click here to view the announcement](https://github.com/DJj123dj/open-ticket/discussions/3)
|
|
||||||
|
|
||||||
## information
|
|
||||||
|
|
||||||
_v1.3.2_
|
|
||||||
|
|
||||||
changelog: [click here](./documentation/CHANGELOG.md)
|
|
||||||
|
|
||||||
© 2022 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.com/invite/26vT9wt3n3)
|
|
||||||
|
|||||||
-214
@@ -1,214 +0,0 @@
|
|||||||
module.exports = async () => {
|
|
||||||
const chalk = await (await import("chalk")).default
|
|
||||||
const config = require("./config.json")
|
|
||||||
var errorList = []
|
|
||||||
var isError = false
|
|
||||||
var warnList = []
|
|
||||||
var isWarn = false
|
|
||||||
const createError = (message) => {
|
|
||||||
isError = true
|
|
||||||
errorList.push("open-ticket ERROR: "+message)
|
|
||||||
}
|
|
||||||
const createWarn = (message) => {
|
|
||||||
isWarn = true
|
|
||||||
warnList.push("open-ticket WARNING: "+message)
|
|
||||||
}
|
|
||||||
|
|
||||||
//checker
|
|
||||||
|
|
||||||
//token
|
|
||||||
if (config.auth_token.includes(" ")){
|
|
||||||
createError("invalid token | there are spaces in your token!")
|
|
||||||
}
|
|
||||||
if (config.auth_token.length < 40){
|
|
||||||
createError("invalid token | length not correct!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//color
|
|
||||||
if (!config.main_color.startsWith("#")){
|
|
||||||
createError("color not detected | 'main_color' doesn't start with a '#'!")
|
|
||||||
}
|
|
||||||
if (config.main_color.length > 7 || config.main_color.length < 7){
|
|
||||||
createError("color not detected | 'main_color' is not a valid hex color!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//admin
|
|
||||||
if (config.botperms_role.includes(" ")){
|
|
||||||
createError("invalid role id | 'botperms_role' is not a valid role id!")
|
|
||||||
}
|
|
||||||
if (config.botperms_role.length > 20|| config.botperms_role.length < 16){
|
|
||||||
createError("invalid role id | 'botperms_role' is not a valid role id!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//prefix
|
|
||||||
if (config.prefix == ""){
|
|
||||||
createError("no prefix | 'prefix' is empty!")
|
|
||||||
}
|
|
||||||
if (config.prefix.length > 3){
|
|
||||||
createWarn("long prefix | your prefix is a little bit long!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//status
|
|
||||||
if (config.status.enabled && (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING" && config.status.type != "CUSTOM")){
|
|
||||||
createError("status error | 'status/type' is invalid!")
|
|
||||||
}
|
|
||||||
if (config.status.enabled && config.status.text.length < 1){
|
|
||||||
createError("status error | 'status/text' must be at least 1 character long!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//ticketchannel
|
|
||||||
if (config.system.ticket_channel.includes(" ")){
|
|
||||||
createWarn("invalid channel id | 'system/ticket_channel' is not a valid channel id!")
|
|
||||||
}
|
|
||||||
if (config.system.ticket_channel.length < 1){
|
|
||||||
createWarn("no ticket channel | 'system/ticket_channel' is empty")
|
|
||||||
}else if (config.system.ticket_channel.length > 20|| config.system.ticket_channel.length < 16){
|
|
||||||
createWarn("invalid channel id | 'system/ticket_channel' is not a valid channel id!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//maxticket
|
|
||||||
if (config.system.max_allowed_tickets < 1){
|
|
||||||
createWarn("no tickets | if 'system/max_allowed_tickets' is under 1 you can't create any ticket")
|
|
||||||
}
|
|
||||||
|
|
||||||
//category
|
|
||||||
if (config.system.enable_category == true && config.system.ticket_category.includes(" ")){
|
|
||||||
createError("invalid category id | 'system/ticket_category' is not a valid category id!")
|
|
||||||
}
|
|
||||||
if (config.system.enable_category && config.system.ticket_category.length > 20 || config.system.ticket_category.length < 16){
|
|
||||||
createError("invalid category id | 'system/ticket_category' is not a valid category id!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//everyoneaccess
|
|
||||||
if (config.system["has@everyoneaccess"] == true){
|
|
||||||
createWarn("access | everyone has access to the tickets!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//memberrole
|
|
||||||
if (config.system.member_role.includes(" ")){
|
|
||||||
createError("invalid role id | 'system/member_role' is not a valid role id!")
|
|
||||||
}
|
|
||||||
if (config.system.member_role.length > 20){
|
|
||||||
createError("invalid role id | 'system/member_role' is not a valid role id!")
|
|
||||||
}
|
|
||||||
if (config.system.member_role == "" || config.system.member_role == " " || config.system.member_role == "false" || config.system.member_role == "null" || config.system.member_role == "0"){
|
|
||||||
createWarn("no member role | 'system/member_role' is not valid so technically everyone can view a ticket!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//transcript
|
|
||||||
if (config.system.enable_transcript && config.system.transcript_channel.includes(" ")){
|
|
||||||
createError("invalid channel id | 'system/transcript_channel' is not a valid channel id!")
|
|
||||||
}
|
|
||||||
if (config.system.enable_transcript && config.system.transcript_channel.length > 20 || config.system.transcript_channel.length < 16){
|
|
||||||
createError("invalid channel id | 'system/transcript_channel' is not a valid channel id!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//messages
|
|
||||||
if (config.messages.general.nopermissions.length < 1){
|
|
||||||
createError("no message | 'messages/general/nopermissions' is empty!")
|
|
||||||
}
|
|
||||||
if (config.messages.ticket.newTicketEmbed.length < 1){
|
|
||||||
createError("no message | 'messages/ticket/newTicketEmbed' is empty!")
|
|
||||||
}
|
|
||||||
if (config.messages.dm.alreadyCreated.length < 1){
|
|
||||||
createError("no message | 'messages/dm/alreadyCreated' is empty!")
|
|
||||||
}
|
|
||||||
if (config.messages.dm.newTicket.length < 1){
|
|
||||||
createError("no message | 'messages/dm/newTicket' is empty!")
|
|
||||||
}
|
|
||||||
if (config.messages.dm.closeTicket.length < 1){
|
|
||||||
createError("no message | 'messages/dm/closeTicket' is empty!")
|
|
||||||
}
|
|
||||||
|
|
||||||
//layout
|
|
||||||
const checkLayout = (layout,layoutname,color,footer,thumbnail) => {
|
|
||||||
if (color){
|
|
||||||
if (!layout.customColor.startsWith("#")){
|
|
||||||
createError("color not detected | 'layout/"+layoutname+"/customColor' doesn't start with a '#'!")
|
|
||||||
}
|
|
||||||
if (layout.customColor.length > 7 || layout.customColor.length < 7){
|
|
||||||
createError("color not detected | 'layout/"+layoutname+"/customColor' is not a valid hex color!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (footer){
|
|
||||||
if (layout.footer.length < 1){
|
|
||||||
createError("no footer | 'layout/"+layoutname+"/footer' doesn't have a footer!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (thumbnail){
|
|
||||||
if (!layout.thumbnailURL.startsWith("https://") && !layout.thumbnailURL.startsWith("http://")){
|
|
||||||
createError("thumbnail | the thumbnail url in 'layout/"+layoutname+"/thumbnailURL' is not a valid url!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
checkLayout(config.layout.ticketEmbed,"ticketEmbed",config.layout.ticketEmbed.customColorEnabled,config.layout.ticketEmbed.footerEnabled,config.layout.ticketEmbed.thumbnailEnabled)
|
|
||||||
checkLayout(config.layout.ticketMsg,"ticketMsg",config.layout.ticketMsg.customColorEnabled,config.layout.ticketMsg.footerEnabled,config.layout.ticketMsg.thumbnailEnabled)
|
|
||||||
checkLayout(config.layout.transcripts,"transcripts",config.layout.transcripts.customColorEnabled,false,config.layout.transcripts.thumbnailEnabled)
|
|
||||||
|
|
||||||
const checkOption = (ticket,ticketname,enabled,urlmode) => {
|
|
||||||
if (enabled){
|
|
||||||
if (ticket.icon.length > 0){
|
|
||||||
const emojiRegex = /\p{Emoji}/u
|
|
||||||
const isEmoji = emojiRegex.test(ticket.icon)
|
|
||||||
if (isEmoji == false){
|
|
||||||
createWarn("invalid emoji | 'options/"+ticketname+"/icon' is not a valid emoji (code can be wrong)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (ticket.description.length < 1){
|
|
||||||
createWarn("no description | 'options/"+ticketname+"/description' is empty")
|
|
||||||
}
|
|
||||||
if (ticket.name.length < 1){
|
|
||||||
createWarn("no description | 'options/"+ticketname+"/name' is empty")
|
|
||||||
}
|
|
||||||
if (ticket.channel_prefix.length < 1){
|
|
||||||
createWarn("no description | 'options/"+ticketname+"/channel_prefix' is empty")
|
|
||||||
}
|
|
||||||
if (ticket.isURL == true && ticket.color != "red" && ticket.color != "blue" && ticket.color != "green" && ticket.color != "gray" && ticket.color != "none"){
|
|
||||||
createWarn("invalid button color | 'options/"+ticketname+"/color' must be one of (red,green,blue,gray,none)")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (urlmode && (!ticket.url.startsWith("https://") && !ticket.url.startsWith("http://"))){
|
|
||||||
createError("url invalid | the url in 'options/"+ticketname+"/url' is not a valid url!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
checkOption(config.options.ticket1,"ticket1",config.options.ticket1.enabled,config.options.ticket1.isURL)
|
|
||||||
checkOption(config.options.ticket2,"ticket2",config.options.ticket2.enabled,config.options.ticket2.isURL)
|
|
||||||
checkOption(config.options.ticket3,"ticket3",config.options.ticket3.enabled,config.options.ticket3.isURL)
|
|
||||||
checkOption(config.options.ticket4,"ticket4",config.options.ticket4.enabled,config.options.ticket4.isURL)
|
|
||||||
checkOption(config.options.ticket5,"ticket5",config.options.ticket5.enabled,config.options.ticket5.isURL)
|
|
||||||
checkOption(config.options.ticket6,"ticket6",config.options.ticket6.enabled,config.options.ticket6.isURL)
|
|
||||||
|
|
||||||
//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])
|
|
||||||
}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!"))
|
|
||||||
}
|
|
||||||
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!"))
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
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 add.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.add) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"add")) return
|
||||||
|
var user = msg.mentions.users.first()
|
||||||
|
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)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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}])
|
||||||
|
|
||||||
|
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 (!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)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
interaction.channel.permissionOverwrites.create(user.id, { ViewChannel:true, AddReactions:true,AttachFiles:true, EmbedLinks:true, SendMessages:true})
|
||||||
|
interaction.editReply({embeds:[bot.embeds.commands.addEmbed(user,interaction.user)]})
|
||||||
|
|
||||||
|
var loguser = user
|
||||||
|
log("command","someone used the 'add' command",[{key:"user",value:interaction.user.username}])
|
||||||
|
log("system","user added to ticket",[{key:"user",value:interaction.user.username},{key:"ticket",value:interaction.channel.name},{key:"added_user",value:loguser.username}])
|
||||||
|
|
||||||
|
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||||
|
APIEvents.onTicketAdd(interaction.user,loguser,interaction.channel,interaction.guild,new Date(),{status:"open",name:interaction.channel.name,ticketOptions:ticketData})
|
||||||
|
APIEvents.onCommand("add",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,131 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const permsChecker = require("../core/utils/permisssionChecker")
|
||||||
|
|
||||||
|
const APIEvents = require("../core/api/modules/events")
|
||||||
|
const DISABLE = require("../core/api/api.json").disable
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
bot.errorLog.log("debug","COMMANDS: loaded change.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.change) client.on("messageCreate", 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)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.change) client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "change") return
|
||||||
|
if (!interaction.channel.isTextBased()) return
|
||||||
|
|
||||||
|
if (!interaction.guild) return
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
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
|
||||||
|
|
||||||
|
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.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
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 embed = discord.EmbedBuilder
|
||||||
|
const storage = bot.storage
|
||||||
|
|
||||||
|
const APIEvents = require("../core/api/modules/events")
|
||||||
|
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", 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)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||||
|
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
hiddendata.push({key:"claimedby",value: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 newEmbed = new embed(firstmsg.embeds[0].data)
|
||||||
|
.setFooter({text:"claimed by: "+msg.author.username,iconURL:msg.author.displayAvatarURL()})
|
||||||
|
|
||||||
|
if (firstmsg.components[0].components[1] && firstmsg.components[0].components[1].disabled){
|
||||||
|
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowDisabledNoClaim],embeds:[newEmbed]})
|
||||||
|
}else{
|
||||||
|
firstmsg.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim],embeds:[newEmbed]})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
msg.channel.send({embeds:[bot.embeds.commands.claimEmbed(claimingUser,msg.author)]})
|
||||||
|
|
||||||
|
log("command","someone used the 'claim' command",[{key:"user",value:msg.author.username}])
|
||||||
|
log("system","user claimed to ticket",[{key:"user",value:msg.author.username},{key:"ticket",value:msg.channel.name},{key:"claimed_user",value:claimingUser.username}])
|
||||||
|
|
||||||
|
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||||
|
APIEvents.onTicketClaim(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
||||||
|
APIEvents.onCommand("claim",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
})
|
||||||
|
|
||||||
|
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)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return interaction.reply({content:":x: "+l.errors.noPermsTitle,ephemeral:true})
|
||||||
|
}
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||||
|
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
hiddendata.push({key:"claimedby",value: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 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.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
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 close.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.close) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"close")) return
|
||||||
|
|
||||||
|
const args = msg.content.substring((config.prefix+"close").length).split(" ")
|
||||||
|
args.shift()
|
||||||
|
/**@type {String|false} */
|
||||||
|
var tempreason = args.join(" ")
|
||||||
|
if (!tempreason || tempreason == " " || tempreason == " "){
|
||||||
|
tempreason = false
|
||||||
|
}
|
||||||
|
const reason = tempreason
|
||||||
|
|
||||||
|
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.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]})
|
||||||
|
|
||||||
|
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",async(interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "close") return
|
||||||
|
|
||||||
|
//interaction.deferReply()
|
||||||
|
|
||||||
|
const reason = interaction.options.getString("reason") ? interaction.options.getString("reason") : false
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||||
|
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't close a ticket while it's being deleted!")]})
|
||||||
|
|
||||||
|
const descriptionReason = reason ? "**"+l.messages.reason+":** "+reason : false
|
||||||
|
interaction.editReply({embeds:[bot.embeds.commands.closeEmbed(interaction.user,descriptionReason)],components:[bot.buttons.close.closeCommandRow]})
|
||||||
|
|
||||||
|
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())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = require("../config.json")
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
client.on("messageCreate",(msg) => {
|
|
||||||
var args = msg.content.split(" ")
|
|
||||||
if (args[0] == config.prefix+"resetdatabase" || args[0] == config.prefix+"resetdb"){
|
|
||||||
const databaseEmbed = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle("How to reset the database:")
|
|
||||||
.setDescription("1: Go to the folder `./storage` in your bot's directory.\n\n2: If posible remove the folders\n`./tickets`, `./transcripts` & `./userTickets`\nfrom the folder `./storage`\n\n3: Restart the bot")
|
|
||||||
.setFooter({text:"if it doesn't work, create an issue on github or DM me on discord!"})
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[databaseEmbed]})
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"resetdatabase (user:"+msg.author.username+")")}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const 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 delete.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.delete) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"delete")) return
|
||||||
|
|
||||||
|
if (!msg.guild) return
|
||||||
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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").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.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.delete) client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "delete") return
|
||||||
|
|
||||||
|
if (!interaction.guild) return
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return interaction.reply({embeds:[bot.errorLog.noPermsDelete(interaction.user)]})
|
||||||
|
}
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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").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.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
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 APIEvents = require("../core/api/modules/events")
|
||||||
|
const DISABLE = require("../core/api/api.json").disable
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
bot.errorLog.log("debug","COMMANDS: loaded help.js")
|
||||||
|
|
||||||
|
const msgName = config.system.showSlashcmdsInHelp ? "message" : "msg"
|
||||||
|
const prefix = config.system.showSlashcmdsInHelp ? "/" : config.prefix
|
||||||
|
|
||||||
|
const helpEmbed = new discord.EmbedBuilder()
|
||||||
|
.setColor(config.color)
|
||||||
|
.setTitle("❔ "+l.helpMenu.title)
|
||||||
|
|
||||||
|
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`"}
|
||||||
|
])
|
||||||
|
|
||||||
|
var otherprefix = prefix.endsWith(" ") ? prefix.substring(0,prefix.length-1) : prefix
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.help) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix)) return
|
||||||
|
var args = msg.content.split(config.prefix)
|
||||||
|
|
||||||
|
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.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") && !args[1].startsWith("change") && !args[1].startsWith("claim") && !args[1].startsWith("unclaim")){
|
||||||
|
msg.channel.send({embeds:[helpEmbed]})
|
||||||
|
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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.help) client.on("interactionCreate",(interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "help") return
|
||||||
|
|
||||||
|
interaction.reply({embeds:[helpEmbed]})
|
||||||
|
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())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
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 remove.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.remove) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"remove")) return
|
||||||
|
var user = msg.mentions.users.first()
|
||||||
|
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)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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.username}])
|
||||||
|
log("system","user removed from ticket",[{key:"user",value:msg.author.username},{key:"ticket",value:msg.channel.name},{key:"removed_user",value:loguser.username}])
|
||||||
|
|
||||||
|
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||||
|
APIEvents.onTicketRemove(msg.author,loguser,msg.channel,msg.guild,new Date(),{status:"open",name:msg.channel.name,ticketOptions:ticketData})
|
||||||
|
APIEvents.onCommand("remove",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.remove) client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "remove") return
|
||||||
|
const user = interaction.options.getUser("user")
|
||||||
|
|
||||||
|
if (!interaction.guild) return
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
interaction.channel.permissionOverwrites.delete(user.id)
|
||||||
|
interaction.editReply({embeds:[bot.embeds.commands.removeEmbed(user,interaction.user)]})
|
||||||
|
|
||||||
|
var loguser = user
|
||||||
|
|
||||||
|
log("command","someone used the 'remove' command",[{key:"user",value:interaction.user.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())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
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 rename.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.rename) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"rename")) return
|
||||||
|
|
||||||
|
if (!msg.guild) return
|
||||||
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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>`")]})
|
||||||
|
|
||||||
|
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.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.rename) client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "rename") return
|
||||||
|
|
||||||
|
if (!interaction.guild) return
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
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.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
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 reopen.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.reopen) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"reopen")) return
|
||||||
|
|
||||||
|
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.find(h => h.key == "pendingdelete")) return msg.channel.send({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
||||||
|
|
||||||
|
msg.channel.send({embeds:[bot.embeds.commands.reopenEmbed(msg.author)],components:[bot.buttons.close.openRowNormal]})
|
||||||
|
|
||||||
|
require("../core/ticketActions/ticketReopener").reopenTicket(msg.guild,msg.channel,msg.author)
|
||||||
|
|
||||||
|
log("command","someone used the 'reopen' command",[{key:"user",value:msg.author.username}])
|
||||||
|
APIEvents.onCommand("reopen",true,msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.reopen) client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "reopen") return
|
||||||
|
|
||||||
|
await interaction.deferReply()
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||||
|
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
if (hiddendata.find(h => h.key == "pendingdelete")) return interaction.editReply({embeds:[bot.errorLog.warning("Warning!","You can't re-open a ticket while it's being deleted!")]})
|
||||||
|
|
||||||
|
await interaction.editReply({embeds:[bot.embeds.commands.reopenEmbed(interaction.user)],components:[bot.buttons.close.openRowNormal]})
|
||||||
|
|
||||||
|
require("../core/ticketActions/ticketReopener").reopenTicket(interaction.guild,interaction.channel,interaction.user)
|
||||||
|
|
||||||
|
log("command","someone used the 'reopen' command",[{key:"user",value:interaction.user.username}])
|
||||||
|
APIEvents.onCommand("reopen",true,interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
})
|
||||||
|
}
|
||||||
+53
-225
@@ -1,242 +1,70 @@
|
|||||||
const discord = require('discord.js')
|
const discord = require('discord.js')
|
||||||
const bot = require('../index')
|
const bot = require('../index')
|
||||||
const client = bot.client
|
const client = bot.client
|
||||||
const config = require("../config.json")
|
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 = () => {
|
module.exports = () => {
|
||||||
client.on("messageCreate", msg => {
|
bot.errorLog.log("debug","COMMANDS: loaded ticket.js")
|
||||||
if (msg.content == config.prefix+"ticket msg"){
|
|
||||||
if (msg.member.roles.cache.has(config.botperms_role) == false){
|
/**@type {String[]} */
|
||||||
msg.channel.send({content:config.messages.general.nopermissions})
|
var msgIds = []
|
||||||
|
config.messages.forEach((msg) => {
|
||||||
|
msgIds.push(msg.id)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.msg) client.on("messageCreate", msg => {
|
||||||
|
if (msg.content.startsWith(config.prefix+"msg"||config.prefix+"message")){
|
||||||
|
|
||||||
|
if (!msg.guild) return
|
||||||
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(msg.author)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentTicketButtons = 0
|
const id = msg.content.split(config.prefix+"msg")[1].substring(1) ? msg.content.split(config.prefix+"msg")[1].substring(1) : false
|
||||||
var ticketButton = new discord.MessageActionRow()
|
|
||||||
var ticketButton2 = new discord.MessageActionRow()
|
|
||||||
|
|
||||||
const getColor = (color) => {
|
if (!id) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds,l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
|
||||||
if (color.toLowerCase() == "red"){
|
if (!msgIds.includes(id)) return msg.channel.send({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds,l.errors.missingArgsDescription+" `<id>`:\n`"+config.prefix+"msg <id>`")]})
|
||||||
return "DANGER"
|
|
||||||
}else if (color.toLowerCase() == "green"){
|
|
||||||
return "SUCCESS"
|
|
||||||
}else if (color.toLowerCase() == "blue" || color.toLowerCase() == "blurple"){
|
|
||||||
return "PRIMARY"
|
|
||||||
}else if (color.toLowerCase() == "black" || color.toLowerCase() == "gray" || color.toLowerCase() == "grey"){
|
|
||||||
return "SECONDARY"
|
|
||||||
}else if (color == "DANGER" || color == "SECONDARY" || color == "SUCCESS" || color == "PRIMARY"){
|
|
||||||
return color
|
|
||||||
}else if (color.toLowerCase() == "none" || color.toLowerCase() == "false" || color.toLowerCase() == ""){
|
|
||||||
return "SECONDARY"
|
|
||||||
}else return "SECONDARY"
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket1.enabled){
|
|
||||||
if (currentTicketButtons < 4){
|
|
||||||
var localTicketButton = ticketButton
|
|
||||||
}else{
|
|
||||||
var localTicketButton = ticketButton2
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTicketButtons = currentTicketButtons + 1
|
const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
|
||||||
|
|
||||||
if (config.options.ticket1.isURL == false){
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(config.options.ticket1.color))
|
|
||||||
.setEmoji(config.options.ticket1.icon)
|
|
||||||
)
|
|
||||||
}else{
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("LINK")
|
|
||||||
.setEmoji(config.options.ticket1.icon)
|
|
||||||
.setURL(config.options.ticket1.url)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (config.options.ticket2.enabled){
|
|
||||||
if (currentTicketButtons < 4){
|
|
||||||
var localTicketButton = ticketButton
|
|
||||||
}else{
|
|
||||||
var localTicketButton = ticketButton2
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTicketButtons = currentTicketButtons + 1
|
|
||||||
|
|
||||||
if (config.options.ticket2.isURL == false){
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket2")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(config.options.ticket2.color))
|
|
||||||
.setEmoji(config.options.ticket2.icon)
|
|
||||||
)
|
|
||||||
}else{
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("LINK")
|
|
||||||
.setEmoji(config.options.ticket2.icon)
|
|
||||||
.setURL(config.options.ticket2.url)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket3.enabled){
|
|
||||||
if (currentTicketButtons < 4){
|
|
||||||
var localTicketButton = ticketButton
|
|
||||||
}else{
|
|
||||||
var localTicketButton = ticketButton2
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTicketButtons = currentTicketButtons + 1
|
|
||||||
|
|
||||||
if (config.options.ticket3.isURL == false){
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket3")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(config.options.ticket3.color))
|
|
||||||
.setEmoji(config.options.ticket3.icon)
|
|
||||||
)
|
|
||||||
}else{
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("LINK")
|
|
||||||
.setEmoji(config.options.ticket3.icon)
|
|
||||||
.setURL(config.options.ticket3.url)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket4.enabled){
|
|
||||||
if (currentTicketButtons < 4){
|
|
||||||
var localTicketButton = ticketButton
|
|
||||||
}else{
|
|
||||||
var localTicketButton = ticketButton2
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTicketButtons = currentTicketButtons + 1
|
|
||||||
|
|
||||||
if (config.options.ticket4.isURL == false){
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket4")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(config.options.ticket4.color))
|
|
||||||
.setEmoji(config.options.ticket4.icon)
|
|
||||||
)
|
|
||||||
}else{
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("LINK")
|
|
||||||
.setEmoji(config.options.ticket4.icon)
|
|
||||||
.setURL(config.options.ticket4.url)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket5.enabled){
|
|
||||||
if (currentTicketButtons < 4){
|
|
||||||
var localTicketButton = ticketButton
|
|
||||||
}else{
|
|
||||||
var localTicketButton = ticketButton2
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTicketButtons = currentTicketButtons + 1
|
|
||||||
|
|
||||||
if (config.options.ticket5.isURL == false){
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket5")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(config.options.ticket5.color))
|
|
||||||
.setEmoji(config.options.ticket5.icon)
|
|
||||||
)
|
|
||||||
}else{
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("LINK")
|
|
||||||
.setEmoji(config.options.ticket5.icon)
|
|
||||||
.setURL(config.options.ticket5.url)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket6.enabled){
|
|
||||||
if (currentTicketButtons < 4){
|
|
||||||
var localTicketButton = ticketButton
|
|
||||||
}else{
|
|
||||||
var localTicketButton = ticketButton2
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTicketButtons = currentTicketButtons + 1
|
|
||||||
|
|
||||||
if (config.options.ticket6.isURL == false){
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket6")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle(getColor(config.options.ticket6.color))
|
|
||||||
.setEmoji(config.options.ticket6.icon)
|
|
||||||
)
|
|
||||||
}else{
|
|
||||||
localTicketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("LINK")
|
|
||||||
.setEmoji(config.options.ticket6.icon)
|
|
||||||
.setURL(config.options.ticket6.url)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var categorylist = ""
|
|
||||||
if (config.options.ticket1.enabled){categorylist = categorylist+"\n"+config.options.ticket1.icon+": **"+config.options.ticket1.name+"**\n"+config.options.ticket1.description}
|
|
||||||
|
|
||||||
if (config.options.ticket2.enabled){categorylist = categorylist+"\n\n"+config.options.ticket2.icon+": **"+config.options.ticket2.name+"**\n"+config.options.ticket2.description}
|
|
||||||
|
|
||||||
if (config.options.ticket3.enabled){categorylist = categorylist+"\n\n"+config.options.ticket3.icon+": **"+config.options.ticket3.name+"**\n"+config.options.ticket3.description}
|
|
||||||
|
|
||||||
if (config.options.ticket4.enabled){categorylist = categorylist+"\n\n"+config.options.ticket4.icon+": **"+config.options.ticket4.name+"**\n"+config.options.ticket4.description}
|
|
||||||
|
|
||||||
if (config.options.ticket5.enabled){categorylist = categorylist+"\n\n"+config.options.ticket5.icon+": **"+config.options.ticket5.name+"**\n"+config.options.ticket5.description}
|
|
||||||
|
|
||||||
if (config.options.ticket6.enabled){categorylist = categorylist+"\n\n"+config.options.ticket6.icon+": **"+config.options.ticket6.name+"**\n"+config.options.ticket6.description}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var ticketEmbed = new discord.MessageEmbed()
|
|
||||||
if (config.layout.ticketMsg.customColorEnabled){
|
|
||||||
ticketEmbed.setColor(config.layout.ticketMsg.customColor)
|
|
||||||
}else{ticketEmbed.setColor(config.main_color)}
|
|
||||||
|
|
||||||
if (config.layout.ticketMsg.footerEnabled){
|
|
||||||
ticketEmbed.setFooter({text:config.layout.ticketMsg.footer})
|
|
||||||
}
|
|
||||||
if (config.layout.ticketMsg.thumbnailEnabled){
|
|
||||||
ticketEmbed.setThumbnail(config.layout.ticketMsg.thumbnailURL)
|
|
||||||
}
|
|
||||||
|
|
||||||
ticketEmbed.setDescription("**Create a ticket:**\nClick one of the buttons below to create a ticket.\n\n__choose a category:__"+categorylist+"\n\n**watch out:**_You can only create "+config.system.max_allowed_tickets+" ticket(s) at a time!_")
|
|
||||||
|
|
||||||
|
msg.channel.send({embeds:[embed],components:componentRows})
|
||||||
|
|
||||||
if (currentTicketButtons <= 4){
|
log("command","someone used the 'message' command",[{key:"user",value:msg.author.username},{key:"id",value:id}])
|
||||||
var embedComponents = [ticketButton]
|
APIEvents.onCommand("message",permsChecker.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
}else{var embedComponents = [ticketButton,ticketButton2]}
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[ticketEmbed],components:embedComponents})
|
|
||||||
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"ticket msg (user:"+msg.author.username+")")}
|
|
||||||
if (config.logs){console.log("[system] created ticket message")}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.msg) client.on("interactionCreate", (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "message") return
|
||||||
|
|
||||||
|
if (!interaction.guild) return
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const id = interaction.options.getString("id")
|
||||||
|
|
||||||
|
if (!msgIds.includes(id)) return interaction.reply({embeds:[bot.errorLog.invalidIdChooseFromList(msgIds)]})
|
||||||
|
|
||||||
|
const {embed,componentRows} = require("../core/utils/getEmbed").createEmbed(id)
|
||||||
|
|
||||||
|
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.username},{key:"id",value:id}])
|
||||||
|
|
||||||
|
APIEvents.onCommand("message",permsChecker.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = require("../config.json")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
client.on("messageCreate",msg => {
|
|
||||||
var args = msg.content.split(" ")
|
|
||||||
if (args[0] == config.prefix+"ticket" && (args[1] == undefined ||args[1] == "" ||args[1] == null)){
|
|
||||||
var TicketHelpMsg = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setTitle("Ticket commands")
|
|
||||||
|
|
||||||
const prefix = config.prefix
|
|
||||||
TicketHelpMsg.setDescription("**Go to <#"+config.system.ticket_channel+"> to create a ticket!**\n\n`"+prefix+"ticket msg` ➜ _Admin command._\n`"+prefix+"ticket rename` ➜ _Rename a ticket (no spaces)._\n`"+prefix+"ticket close` ➜ _Close a ticket._\n`"+prefix+"ticket add <user>` ➜ _Add a user to the ticket._\n`"+prefix+"ticket remove <user>` ➜ _Remove a user from the ticket._\n`"+prefix+"resetdatabase` ➜ _Steps to reset the database._\n`"+prefix+"resetdb` ➜ _Also database stuff._")
|
|
||||||
|
|
||||||
if (config.credits){
|
|
||||||
TicketHelpMsg.setFooter({text:"Open-Ticket by DJdj Development | view on github for source code"})
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[TicketHelpMsg]})
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"ticket help (user:"+msg.author.username+")")}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("messageCreate",msg => {
|
|
||||||
var args = msg.content.split(" ")
|
|
||||||
if (args[0] == config.prefix+"ticket" && args[1] == "close"){
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
var firstmsg = msglist.last()
|
|
||||||
|
|
||||||
if (firstmsg == undefined){
|
|
||||||
msg.channel.send({content:"I didn't find the close button!"})
|
|
||||||
}
|
|
||||||
if (firstmsg.author.id != client.user.id){
|
|
||||||
msg.channel.send({content:"You are not in a ticket!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var CloseMsg = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setDescription("Click [here]("+firstmsg.url+") to close this ticket.")
|
|
||||||
.setTitle("Close this ticket:")
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[CloseMsg]})
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"ticket close (user:"+msg.author.username+")")}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("messageCreate",msg => {
|
|
||||||
var args = msg.content.split(" ")
|
|
||||||
if (args[0] == config.prefix+"ticket" && args[1] == "rename"){
|
|
||||||
|
|
||||||
if (msg.member.roles.cache.has(config.botperms_role) == false && msg.author.id != "779742674932072469"){
|
|
||||||
msg.channel.send({content:config.messages.general.nopermissions})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[2] == null || args[2] == undefined || args[2] == "" || args[2] == false){
|
|
||||||
msg.channel.send({content:"Not enough parameters!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var name = args[2]
|
|
||||||
var oldname = msg.channel.name
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
if (msglist.last().author.id == client.user.id){
|
|
||||||
msg.channel.send({content:"The name from the ticket is changed!"}).then(rmsg => {
|
|
||||||
rmsg.channel.setName(name)
|
|
||||||
if (config.logs){console.log("[system] renamed a ticket (name:"+oldname+",newname:"+name+")")}
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
msg.channel.send({content:"You are not in a ticket!"})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"ticket rename (user:"+msg.author.username+")")}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("messageCreate",msg => {
|
|
||||||
var args = msg.content.split(" ")
|
|
||||||
if (args[0] == config.prefix+"ticket" && args[1] == "add"){
|
|
||||||
|
|
||||||
if (msg.member.roles.cache.has(config.botperms_role) == false && msg.author.id != "779742674932072469"){
|
|
||||||
msg.channel.send({content:config.messages.general.nopermissions})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetch().then(msglist => {
|
|
||||||
if (msglist.last().author.id != client.user.id){
|
|
||||||
msg.channel.send({content:"You are not in a ticket!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[2] == null || args[2] == undefined || args[2] == "" || args[2] == false){
|
|
||||||
msg.channel.send({content:"Not enough parameters!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var user = msg.mentions.users.first()
|
|
||||||
if (!user){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.permissionOverwrites.create(user.id, { VIEW_CHANNEL:true, ADD_REACTIONS:true,ATTACH_FILES:true, EMBED_LINKS:true, SEND_MESSAGES:true})
|
|
||||||
if (config.logs){console.log("[system] added user to ticket (name:"+user.username+",ticket:"+msg.channel.name+")")}
|
|
||||||
|
|
||||||
})
|
|
||||||
var loguser = msg.mentions.users.first()
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"ticket add "+loguser.username+" (user:"+msg.author.username+")")}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("messageCreate",msg => {
|
|
||||||
var args = msg.content.split(" ")
|
|
||||||
if (args[0] == config.prefix+"ticket" && args[1] == "remove"){
|
|
||||||
|
|
||||||
if (msg.member.roles.cache.has(config.botperms_role) == false && msg.author.id != "779742674932072469"){
|
|
||||||
msg.channel.send({content:config.messages.general.nopermissions})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
if (msglist.last().author.id != client.user.id){
|
|
||||||
msg.channel.send({content:"You aren't in a ticket!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[2] == null || args[2] == undefined || args[2] == "" || args[2] == false){
|
|
||||||
msg.channel.send({content:"Not enough parameters!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var user = msg.mentions.users.first()
|
|
||||||
if (!user){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.permissionOverwrites.delete(user.id)
|
|
||||||
if (config.logs){console.log("[system] removed user from ticket (name:"+user.username+",ticket:"+msg.channel.name+")")}
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
var loguser = msg.mentions.users.first()
|
|
||||||
if (config.logs){console.log("[command] "+config.prefix+"ticket remove "+loguser.username+" (user:"+msg.author.username+")")}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,309 +0,0 @@
|
|||||||
const discord = require('discord.js')
|
|
||||||
const bot = require('../index')
|
|
||||||
const client = bot.client
|
|
||||||
const config = require("../config.json")
|
|
||||||
|
|
||||||
const ticketStorage = bot.TicketStorage
|
|
||||||
const userTicketStorage = bot.userTicketStorage
|
|
||||||
const transcriptStorage = bot.transcriptStorage
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
|
|
||||||
var closeButton = new discord.MessageActionRow()
|
|
||||||
.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("closeTicket")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setLabel("Close Ticket")
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
//ticket button click / create ticket
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
|
|
||||||
if (interaction.isButton() == false){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (interaction.customId == "newTicket1"||interaction.customId == "newTicket2"||interaction.customId == "newTicket3"||interaction.customId == "newTicket4"||interaction.customId == "newTicket5"||interaction.customId == "newTicket6"){
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (ticketStorage.getItem(interaction.member.id) == null ||ticketStorage.getItem(interaction.member.id) == "false"|| Number(ticketStorage.getItem(interaction.member.id)) < config.system.max_allowed_tickets){
|
|
||||||
|
|
||||||
try{
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
interaction.member.send(config.messages.dm.newTicket)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{console.log("can't send DM to member || member doesn't allow dm's")}
|
|
||||||
|
|
||||||
|
|
||||||
//update storage
|
|
||||||
ticketStorage.setItem(interaction.member.id,Number(ticketStorage.getItem(interaction.member.id))+1)
|
|
||||||
var ticketNumber = interaction.member.user.username
|
|
||||||
|
|
||||||
//set ticketName
|
|
||||||
if (interaction.customId == "newTicket1"){
|
|
||||||
var ticketName = config.options.ticket1.channel_prefix+ticketNumber
|
|
||||||
var logsname = config.options.ticket1.name
|
|
||||||
}else if (interaction.customId == "newTicket2"){
|
|
||||||
var ticketName = config.options.ticket2.channel_prefix+ticketNumber
|
|
||||||
var logsname = config.options.ticket2.name
|
|
||||||
}else if (interaction.customId == "newTicket3"){
|
|
||||||
var ticketName = config.options.ticket3.channel_prefix+ticketNumber
|
|
||||||
var logsname = config.options.ticket3.name
|
|
||||||
}else if (interaction.customId == "newTicket4"){
|
|
||||||
var ticketName = config.options.ticket4.channel_prefix+ticketNumber
|
|
||||||
var logsname = config.options.ticket4.name
|
|
||||||
}else if (interaction.customId == "newTicket5"){
|
|
||||||
var ticketName = config.options.ticket5.channel_prefix+ticketNumber
|
|
||||||
var logsname = config.options.ticket5.name
|
|
||||||
}else if (interaction.customId == "newTicket6"){
|
|
||||||
var ticketName = config.options.ticket6.channel_prefix+ticketNumber
|
|
||||||
var logsname = config.options.ticket6.name
|
|
||||||
}
|
|
||||||
|
|
||||||
//set category
|
|
||||||
if (config.system.enable_category){
|
|
||||||
var Category = config.system.ticket_category
|
|
||||||
}else{var Category = null}
|
|
||||||
|
|
||||||
var permissionsArray = []
|
|
||||||
|
|
||||||
//set everyone allowed
|
|
||||||
if (config.system['has@everyoneaccess']){
|
|
||||||
var everyoneAllowPerms = ["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
|
|
||||||
var everyoneDenyPerms = []
|
|
||||||
}else{
|
|
||||||
var everyoneAllowPerms = []
|
|
||||||
var everyoneDenyPerms = ["VIEW_CHANNEL"]
|
|
||||||
}
|
|
||||||
permissionsArray.push({
|
|
||||||
id:interaction.member.id,
|
|
||||||
type:"member",
|
|
||||||
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
|
|
||||||
})
|
|
||||||
permissionsArray.push({
|
|
||||||
id:config.botperms_role,
|
|
||||||
type:"role",
|
|
||||||
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
|
|
||||||
})
|
|
||||||
permissionsArray.push({
|
|
||||||
id:interaction.guild.id,
|
|
||||||
type:"role",
|
|
||||||
allow:everyoneAllowPerms,
|
|
||||||
deny:everyoneDenyPerms
|
|
||||||
})
|
|
||||||
if (config.system.member_role == "" || config.system.member_role == " " || config.system.member_role == "false" || config.system.member_role == "null" || config.system.member_role == "0"){
|
|
||||||
permissionsArray.push({
|
|
||||||
id:config.system.member_role,
|
|
||||||
type:"role",
|
|
||||||
deny:["VIEW_CHANNEL"]
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
//create the channel
|
|
||||||
interaction.guild.channels.create(ticketName,{
|
|
||||||
type:"GUILD_TEXT",
|
|
||||||
parent:Category,
|
|
||||||
permissionOverwrites:permissionsArray
|
|
||||||
}).then(tChannel => {
|
|
||||||
userTicketStorage.setItem(tChannel.id,interaction.member.id)
|
|
||||||
|
|
||||||
|
|
||||||
var ticketEmbed = new discord.MessageEmbed()
|
|
||||||
if (config.layout.ticketEmbed.customColorEnabled){
|
|
||||||
ticketEmbed.setColor(config.layout.ticketEmbed.customColor)
|
|
||||||
}else{ticketEmbed.setColor(config.main_color)}
|
|
||||||
|
|
||||||
if (config.layout.ticketEmbed.footerEnabled){
|
|
||||||
ticketEmbed.setFooter({text:"config.layout.ticketEmbed.footer"})
|
|
||||||
}
|
|
||||||
if (config.layout.ticketEmbed.thumbnailEnabled){
|
|
||||||
ticketEmbed.setThumbnail(config.layout.ticketEmbed.thumbnailURL)
|
|
||||||
}
|
|
||||||
ticketEmbed.setTitle("You created a ticket!")
|
|
||||||
ticketEmbed.setDescription(config.messages.ticket.newTicketEmbed)
|
|
||||||
|
|
||||||
tChannel.send({content:"<@"+interaction.member.id+"> <@&"+config.botperms_role+">",embeds:[ticketEmbed],components:[closeButton]}).then(firstmsg => {
|
|
||||||
firstmsg.pin()
|
|
||||||
})
|
|
||||||
if (config.logs){console.log("[system] created a new ticket (name:"+logsname+",user:"+interaction.user.username+")")}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}else{
|
|
||||||
try {
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
interaction.member.send(config.messages.dm.alreadyCreated)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{console.log("can't send DM to member || member doesn't allow dm's")}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
//closeBAR
|
|
||||||
var closeBar = new discord.MessageActionRow()
|
|
||||||
.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("closeTicketTrue")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setEmoji("✅")
|
|
||||||
)
|
|
||||||
.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("closeTicketFalse")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setEmoji("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (interaction.isButton() == false){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (interaction.customId == "closeTicket"){
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.message.edit({components:[closeBar]})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (interaction.isButton() == false){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (interaction.customId == "closeTicketFalse"){
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
interaction.message.edit({components:[closeButton]})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
if (interaction.isButton() == false){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (interaction.customId == "closeTicketTrue"){
|
|
||||||
interaction.deferUpdate()
|
|
||||||
interaction.channel.messages.fetch().then(messages => {
|
|
||||||
var transcriptArray = []
|
|
||||||
messages.forEach(msg => {
|
|
||||||
if (msg.author.id != client.user.id){
|
|
||||||
transcriptArray.push("["+msg.author.username+"]: "+msg.content)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
var getuserID = userTicketStorage.getItem(interaction.channel.id)
|
|
||||||
var getusernameStep1 = client.users.cache.find(u => u.id === getuserID)
|
|
||||||
if (getusernameStep1 == null || getusernameStep1 == undefined || getusernameStep1 == false || getusernameStep1 == ""){
|
|
||||||
var getuserNAME = ":usernotfound:"
|
|
||||||
}else {
|
|
||||||
var getuserNAME = getusernameStep1.username
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (config.system.enable_transcript){
|
|
||||||
var transcript = transcriptArray.reverse().join("\n")
|
|
||||||
transcriptStorage.setItem(interaction.channel.id,transcript)
|
|
||||||
|
|
||||||
//transcript color & thumbnail
|
|
||||||
if (config.layout.transcripts.customColorEnabled){
|
|
||||||
var transcriptColor = config.layout.transcripts.customColor
|
|
||||||
}else{var transcriptColor = config.main_color}
|
|
||||||
|
|
||||||
if (config.layout.transcripts.thumbnailEnabled){
|
|
||||||
var transcriptThumbnail = config.layout.transcripts.thumbnailURL
|
|
||||||
}else{var transcriptThumbnail = ""}
|
|
||||||
|
|
||||||
var splittedTranscript = [transcript.slice(0,2000)]
|
|
||||||
if (transcript.length > 4000){
|
|
||||||
splittedTranscript.push(transcript.slice(2000,4000))
|
|
||||||
splittedTranscript.push(transcript.slice(4000))
|
|
||||||
}else if (transcript.length > 2000){
|
|
||||||
splittedTranscript.push(transcript.slice(2000))
|
|
||||||
}
|
|
||||||
var transcriptEmbed = new discord.MessageEmbed()
|
|
||||||
.setColor(transcriptColor)
|
|
||||||
.setAuthor({name:interaction.channel.name + " - ticket created by "+getuserNAME})
|
|
||||||
.setTitle("There is a new transcript!")
|
|
||||||
.setDescription(splittedTranscript[0])
|
|
||||||
.setFooter({text:"ticket closed by "+interaction.member.user.username})
|
|
||||||
.setThumbnail(transcriptThumbnail)
|
|
||||||
|
|
||||||
if (transcript.length > 4000){
|
|
||||||
var transcriptEmbed2 = new discord.MessageEmbed()
|
|
||||||
.setColor(transcriptColor)
|
|
||||||
.setAuthor({name:interaction.channel.name + " - ticket created by "+getuserNAME})
|
|
||||||
.setTitle("transcript #2")
|
|
||||||
.setDescription(splittedTranscript[1])
|
|
||||||
.setFooter("ticket closed by "+interaction.member.user.username)
|
|
||||||
.setThumbnail(transcriptThumbnail)
|
|
||||||
|
|
||||||
var transcriptEmbed3 = new discord.MessageEmbed()
|
|
||||||
.setColor(transcriptColor)
|
|
||||||
.setAuthor({name:interaction.channel.name + " - ticket created by "+getuserNAME})
|
|
||||||
.setTitle("transcript #3")
|
|
||||||
.setDescription(splittedTranscript[1])
|
|
||||||
.setFooter({text:"ticket closed by "+interaction.member.user.username})
|
|
||||||
.setThumbnail(transcriptThumbnail)
|
|
||||||
|
|
||||||
client.channels.cache.find(ch => ch.id == config.system.transcript_channel).send({embeds:[transcriptEmbed,transcriptEmbed2,transcriptEmbed3]})
|
|
||||||
|
|
||||||
}else if (transcript.length > 2000){
|
|
||||||
var transcriptEmbed2 = new discord.MessageEmbed()
|
|
||||||
.setColor(transcriptColor)
|
|
||||||
.setAuthor({name:interaction.channel.name + " - ticket created by "+getuserNAME})
|
|
||||||
.setTitle("transcript #2")
|
|
||||||
.setDescription(splittedTranscript[1])
|
|
||||||
.setFooter({text:"ticket closed by "+interaction.member.user.username})
|
|
||||||
.setThumbnail(transcriptThumbnail)
|
|
||||||
|
|
||||||
client.channels.cache.find(ch => ch.id == config.system.transcript_channel).send({embeds:[transcriptEmbed,transcriptEmbed2]})
|
|
||||||
}else{
|
|
||||||
client.channels.cache.find(ch => ch.id == config.system.transcript_channel).send({embeds:[transcriptEmbed]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
interaction.channel.delete()
|
|
||||||
if (config.logs){console.log("[system] closed a ticket (name:"+interaction.channel.name+",user:"+interaction.user.username+")")}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ticketStorage.setItem(getuserID,Number(ticketStorage.getItem(getuserID)) - 1)
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (config.system.enable_DM_Messages){
|
|
||||||
interaction.member.send(config.messages.dm.closeTicket)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch{console.log("can't send DM to member || member doesn't allow dm's")}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
process.on('unhandledRejection',error => {
|
|
||||||
console.log("ERROR: "+error)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
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 embed = discord.EmbedBuilder
|
||||||
|
const storage = bot.storage
|
||||||
|
|
||||||
|
const APIEvents = require("../core/api/modules/events")
|
||||||
|
const DISABLE = require("../core/api/api.json").disable
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
bot.errorLog.log("debug","COMMANDS: loaded unclaim.js")
|
||||||
|
|
||||||
|
if (!DISABLE.commands.text.unclaim) client.on("messageCreate",msg => {
|
||||||
|
if (!msg.content.startsWith(config.prefix+"unclaim")) return
|
||||||
|
|
||||||
|
if (!msg.guild) return
|
||||||
|
if (!permsChecker.command(msg.author.id,msg.guild.id)){
|
||||||
|
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!")]})
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(msg.channel.id)
|
||||||
|
if (hiddendata.length < 1) return msg.channel.send({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
hiddendata.push({key:"claimedby",value:"false"})
|
||||||
|
bot.hiddenData.writeHiddenData(msg.channel.id,hiddendata)
|
||||||
|
storage.set("claimData",msg.channel.id,"false")
|
||||||
|
|
||||||
|
msg.channel.messages.fetchPinned().then(msglist => {
|
||||||
|
/**@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 newEmbed = new embed(firstmsg.embeds[0].data)
|
||||||
|
|
||||||
|
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||||
|
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.command(msg.author.id,msg.guild.id),msg.author,msg.channel,msg.guild,new Date())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!DISABLE.commands.slash.unclaim) client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return
|
||||||
|
if (interaction.commandName != "unclaim") return
|
||||||
|
|
||||||
|
if (!interaction.guild) return
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
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!")]})
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||||
|
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
hiddendata.push({key:"claimedby",value:"false"})
|
||||||
|
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
|
||||||
|
storage.set("claimData",interaction.channel.id,"false")
|
||||||
|
|
||||||
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
|
/**@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)
|
||||||
|
|
||||||
|
const ticketData = require("../core/utils/configParser").getTicketById(ticketId,true)
|
||||||
|
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.command(interaction.user.id,interaction.guild.id),interaction.user,interaction.channel,interaction.guild,new Date())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
+133
-116
@@ -1,132 +1,149 @@
|
|||||||
{
|
{
|
||||||
"bot_name":"Wumpus",
|
"color":"#ffffff",
|
||||||
"main_color":"#fffff",
|
"serverId":"server id (for slash cmds)",
|
||||||
"auth_token":"the bot's auth token",
|
"token":{
|
||||||
"botperms_role":"the id from an admin role (they can do admin things with the bot)",
|
"value":"insert your bot token here",
|
||||||
"prefix":"!",
|
"fromENV":false
|
||||||
"logs":true,
|
},
|
||||||
|
"adminRoles":["discord role id"],
|
||||||
|
"prefix":"!ticket ",
|
||||||
|
"languageFile":"english",
|
||||||
|
|
||||||
"credits":true,
|
|
||||||
"status":{
|
"status":{
|
||||||
"enabled":true,
|
"enabled":true,
|
||||||
"type":"PLAYING | LISTENING | WATCHING | CUSTOM",
|
"type":"PLAYING",
|
||||||
"text":"!ticket"
|
"text":"!ticket help"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system":{
|
"system":{
|
||||||
"ticket_channel":"id of the channel with the !ticket msg",
|
"maxAmountOfTickets":3,
|
||||||
"max_allowed_tickets":5,
|
"dmMessages":false,
|
||||||
"enable_DM_Messages":true,
|
|
||||||
|
|
||||||
"enable_category":false,
|
"memberRole":"member role (leave empty if you have no member role)",
|
||||||
"ticket_category":"the id of a category for the tickets",
|
"closeMode":"adminonly OR normal (select one!)",
|
||||||
|
|
||||||
"has@everyoneaccess":false,
|
"transcripts":"!!!! ALL SETTINGS FOR TRANSCRIPTS ARE LOCATED IN: transcriptconfig.json !!!!",
|
||||||
"member_role":"this role doesn't have access to tickets",
|
|
||||||
|
|
||||||
"enable_transcript":false,
|
"showSlashcmdsInHelp":false,
|
||||||
"transcript_channel":"the channel for transcripts"
|
"answerInEphemeralOnOpen":true
|
||||||
},
|
},
|
||||||
|
|
||||||
"messages":{
|
"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!",
|
||||||
"general":{
|
"options":[
|
||||||
"nopermissions":"**You don't have permissions to run this command!**"
|
{
|
||||||
},
|
"id":"general",
|
||||||
"dm":{
|
|
||||||
"alreadyCreated":"**You currently have as many open tickets as the maximum allowed!**",
|
|
||||||
"newTicket":"You created a new ticket in our server, the staff will come and help you soon!",
|
|
||||||
"closeTicket":"**Your ticket is closed!**"
|
|
||||||
},
|
|
||||||
"ticket":{
|
|
||||||
"newTicketEmbed":"You created a ticket!\n\n_Click on the close button below to close this ticket_"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"layout":{
|
|
||||||
"transcripts":{
|
|
||||||
"customColorEnabled":false,
|
|
||||||
"customColor":"#ffffff",
|
|
||||||
"thumbnailEnabled":false,
|
|
||||||
"thumbnailURL":"https://www.example.com/path/to/image.png"
|
|
||||||
},
|
|
||||||
"ticketMsg":{
|
|
||||||
"customColorEnabled":false,
|
|
||||||
"customColor":"#ffffff",
|
|
||||||
"footerEnabled":false,
|
|
||||||
"footer":"We are using open-tickets from DJj123dj",
|
|
||||||
"thumbnailEnabled":false,
|
|
||||||
"thumbnailURL":"https://www.example.com/path/to/image.png"
|
|
||||||
},
|
|
||||||
"ticketEmbed":{
|
|
||||||
"customColorEnabled":false,
|
|
||||||
"customColor":"#ffffff",
|
|
||||||
"footerEnabled":false,
|
|
||||||
"footer":"This is embed in the start of a ticket.",
|
|
||||||
"thumbnailEnabled":false,
|
|
||||||
"thumbnailURL":"https://www.example.com/path/to/image.png"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"options":{
|
|
||||||
"ticket1":{
|
|
||||||
"enabled":true,
|
|
||||||
"icon":"🎫",
|
|
||||||
"description":"Create a general ticket.",
|
|
||||||
"name":"Ticket",
|
|
||||||
"channel_prefix":"ticket-",
|
|
||||||
"color":"red | green | blue | gray | none",
|
|
||||||
"isURL":false,
|
|
||||||
"url":"https://www.example.com/a/random/path/to/a/website"
|
|
||||||
},
|
|
||||||
"ticket2":{
|
|
||||||
"enabled":false,
|
|
||||||
"icon":"💼",
|
|
||||||
"description":"Do you want to apply? Then click here!",
|
|
||||||
"name":"Apply",
|
|
||||||
"channel_prefix":"apply-",
|
|
||||||
"color":"red | green | blue | gray | none",
|
|
||||||
"isURL":false,
|
|
||||||
"url":"https://www.example.com/a/random/path/to/a/website"
|
|
||||||
},
|
|
||||||
"ticket3":{
|
|
||||||
"enabled":false,
|
|
||||||
"icon":"❓",
|
|
||||||
"description":"Click here if you have a question about the server.",
|
|
||||||
"name":"Question",
|
"name":"Question",
|
||||||
"channel_prefix":"question-",
|
"description":"Create this ticket if you have a question.",
|
||||||
"color":"red | green | blue | gray | none",
|
"icon":"🎫",
|
||||||
"isURL":false,
|
"label":"question",
|
||||||
"url":"https://www.example.com/a/random/path/to/a/website"
|
"type":"ticket",
|
||||||
|
|
||||||
|
"color":"gray",
|
||||||
|
"adminroles":["role id"],
|
||||||
|
"readonlyAdminroles":["role id"],
|
||||||
|
"channelprefix":"question-",
|
||||||
|
"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!*",
|
||||||
|
|
||||||
|
"thumbnail":{
|
||||||
|
"enable":false,
|
||||||
|
"url":"https://www.example.com/catmemes/cat.png"
|
||||||
|
},
|
||||||
|
"image":{
|
||||||
|
"enable":false,
|
||||||
|
"url":"https://www.dj-dj.be/wp-content/uploads/2022/09/pfp-cropped.png"
|
||||||
|
},
|
||||||
|
|
||||||
|
"closedCategory":{
|
||||||
|
"enable":false,
|
||||||
|
"id":"category id"
|
||||||
|
},
|
||||||
|
|
||||||
|
"autoclose":{
|
||||||
|
"enable":false,
|
||||||
|
"inactiveHours":24
|
||||||
|
},
|
||||||
|
|
||||||
|
"ping":{
|
||||||
|
"@here":true,
|
||||||
|
"@everyone":false,
|
||||||
|
"custom":{
|
||||||
|
"enable":false,
|
||||||
|
"roleId":"012345678910"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
"ticket4":{
|
{
|
||||||
"enabled":false,
|
"id":"website",
|
||||||
"icon":"🛒",
|
"name":"Website",
|
||||||
"description":"Buy something in our shop.",
|
"description":"Go to our website.",
|
||||||
"name":"Shop",
|
"icon":"✅",
|
||||||
"channel_prefix":"shop-",
|
"label":"click here",
|
||||||
"color":"red | green | blue | gray | none",
|
"type":"website",
|
||||||
"isURL":false,
|
|
||||||
"url":"https://www.example.com/a/random/path/to/a/website"
|
"url":"https://www.dj-dj.be"
|
||||||
|
|
||||||
},
|
},
|
||||||
"ticket5":{
|
{
|
||||||
"enabled":false,
|
"id":"role",
|
||||||
"icon":"😄",
|
"name":"Verify",
|
||||||
"description":"hello",
|
"description":"Click here to get the verify role.",
|
||||||
"name":"AnotherTicket",
|
"icon":"👮🏼",
|
||||||
"channel_prefix":"prefix-",
|
"label":"get a role",
|
||||||
"color":"red | green | blue | gray | none",
|
"type":"role",
|
||||||
"isURL":false,
|
|
||||||
"url":"https://www.example.com/a/random/path/to/a/website"
|
"color":"red",
|
||||||
},
|
"roles":["discord role id"],
|
||||||
"ticket6":{
|
"mode":"add&remove|remove|add",
|
||||||
"enabled":false,
|
"enableDmOnOpen":true
|
||||||
"icon":"😄",
|
|
||||||
"description":"hello",
|
|
||||||
"name":"AnotherTicket",
|
|
||||||
"channel_prefix":"prefix-",
|
|
||||||
"color":"red | green | blue | gray | none",
|
|
||||||
"isURL":false,
|
|
||||||
"url":"https://www.example.com/a/random/path/to/a/website"
|
|
||||||
}
|
}
|
||||||
}
|
],
|
||||||
}
|
|
||||||
|
"messages":[
|
||||||
|
{
|
||||||
|
"id":"1",
|
||||||
|
"name":"Choose Your Ticket",
|
||||||
|
"description":"You can click one of the buttons below!",
|
||||||
|
"dropdown":false,
|
||||||
|
|
||||||
|
"enableFooter":false,
|
||||||
|
"footer":"Open Ticket v3.4.4 - 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"],
|
||||||
|
|
||||||
|
"other":{
|
||||||
|
"enableTicketExplaination":true,
|
||||||
|
"enableMaxTicketsWarning":true,
|
||||||
|
|
||||||
|
"customDropdownPlaceholder":{
|
||||||
|
"enable":false,
|
||||||
|
"text":"Choose a ticket"
|
||||||
|
},
|
||||||
|
"customCategoryText":{
|
||||||
|
"enable":false,
|
||||||
|
"text":"choose a category:"
|
||||||
|
},
|
||||||
|
"embedTitleURL":{
|
||||||
|
"enable":false,
|
||||||
|
"url":"https://www.dj-dj.be/projects/open-ticket"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
//base
|
||||||
|
const bot = require("../../index")
|
||||||
|
|
||||||
|
exports.client = bot.client
|
||||||
|
exports.config = bot.config
|
||||||
|
exports.utils = {
|
||||||
|
log:bot.errorLog.log(),
|
||||||
|
storage:bot.storage
|
||||||
|
}
|
||||||
|
|
||||||
|
//events
|
||||||
|
const events = require("./modules/events").events
|
||||||
|
exports.events = events
|
||||||
|
|
||||||
|
//actions
|
||||||
|
const actions = require("./modules/actions").actions
|
||||||
|
//comming soon
|
||||||
|
//exports.actions = actions
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
{
|
||||||
|
"version":"1.0.0",
|
||||||
|
"enableAPIdebug":false,
|
||||||
|
"enableAPIconsolelogs":false,
|
||||||
|
|
||||||
|
"info":"If you turn these switches to true, then the feature will be turned OFF!",
|
||||||
|
"info2":"You can use this to disable some features you don't want!",
|
||||||
|
"disable":{
|
||||||
|
"messages":{
|
||||||
|
"DISCLAIMER":"the messages part doesn't work yet!",
|
||||||
|
"ticketCreated":false,
|
||||||
|
"ticketClosed":false,
|
||||||
|
"ticketDeleted":false,
|
||||||
|
"ticketReopened":false
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"server":false,
|
||||||
|
"dm":false
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"text":{
|
||||||
|
"help":false,
|
||||||
|
"msg":false,
|
||||||
|
"close":false,
|
||||||
|
"delete":false,
|
||||||
|
"reopen":false,
|
||||||
|
"new":false,
|
||||||
|
"add":false,
|
||||||
|
"remove":false,
|
||||||
|
"rename":false,
|
||||||
|
"claim":false,
|
||||||
|
"unclaim":false,
|
||||||
|
"change":false
|
||||||
|
},
|
||||||
|
"slash":{
|
||||||
|
"help":false,
|
||||||
|
"msg":false,
|
||||||
|
"close":false,
|
||||||
|
"delete":false,
|
||||||
|
"reopen":false,
|
||||||
|
"new":false,
|
||||||
|
"add":false,
|
||||||
|
"remove":false,
|
||||||
|
"rename":false,
|
||||||
|
"claim":false,
|
||||||
|
"unclaim":false,
|
||||||
|
"change":false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"checkerjs":{
|
||||||
|
"token":false,
|
||||||
|
"all":false
|
||||||
|
},
|
||||||
|
"debug":{
|
||||||
|
"all":false,
|
||||||
|
"debuglogs":false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
//ACTIONS:
|
||||||
|
|
||||||
|
|
||||||
|
//EXPORT ACTIONS:
|
||||||
|
exports.actions = {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,454 @@
|
|||||||
|
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 configParser = require("../../utils/configParser")
|
||||||
|
|
||||||
|
|
||||||
|
//EVENT API:
|
||||||
|
const ticketOpenListeners = []
|
||||||
|
const ticketCloseListeners = []
|
||||||
|
const ticketDeleteListeners = []
|
||||||
|
const ticketReopenListeners = []
|
||||||
|
|
||||||
|
const ticketAddListeners = []
|
||||||
|
const ticketRemoveListeners = []
|
||||||
|
|
||||||
|
const ticketClaimListeners = []
|
||||||
|
const ticketUnclaimListeners = []
|
||||||
|
const ticketChangeListeners = []
|
||||||
|
|
||||||
|
|
||||||
|
const transcriptCreationListeners = []
|
||||||
|
const commandListeners = []
|
||||||
|
const reactionRoleListeners = []
|
||||||
|
const errorListeners = []
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:Object|false}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketOpen = (user,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","new ticket created",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketOpenListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
* @param {String} reason
|
||||||
|
*/
|
||||||
|
exports.onTicketClose = (user,channel,guild,date,ticketdata,reason) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","ticket closed",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)},{key:"reason",value:reason}])
|
||||||
|
|
||||||
|
ticketCloseListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,channel,guild,date,ticketdata,reason)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketDelete = (user,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","ticket deleted",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketDeleteListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketReopen = (user,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","ticket reopened",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketReopenListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.User} editeduser
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketAdd = (user,editeduser,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","user added to ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketAddListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,editeduser,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.User} editeduser
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketRemove = (user,editeduser,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","user removed from ticket",[{key:"userid",value:user.id},{key:"editeduser",value:editeduser.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketRemoveListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,editeduser,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketClaim = (user,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","user claimed a ticket",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketClaimListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketUnclaim = (user,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","user unclaimed a ticket",[{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketUnclaimListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(user,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {String} newtype
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
exports.onTicketChange = (newtype,user,channel,guild,date,ticketdata) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","user changed ticket type",[{key:"newtype",value:newtype},{key:"userid",value:user.id},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id},{key:"ticketdata",value:JSON.stringify(ticketdata)}])
|
||||||
|
|
||||||
|
ticketChangeListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(newtype,user,channel,guild,date,ticketdata)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.Message[]} messages
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
exports.onTranscriptCreation = (messages,channel,guild,date) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","transcript created",[{key:"messages",value:JSON.stringify(messages)},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
|
||||||
|
|
||||||
|
transcriptCreationListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(messages,channel,guild,date)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@typedef {"help"|"message"|"close"|"delete"|"reopen"|"rename"|"add"|"remove"|"claim"|"unclaim"|"change"} OTCommandType */
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {OTCommandType} type
|
||||||
|
* @param {Boolean} hasPerms
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
exports.onCommand = (type,hasPerms,user,channel,guild,date) => {
|
||||||
|
|
||||||
|
const newguild = guild ? guild : false
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","someone used a command",[{key:"type",value:type},{key:"hasPerms",value:hasPerms},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:newguild.id}])
|
||||||
|
|
||||||
|
commandListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(type,hasPerms,user,channel,newguild,date)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@typedef {"add"|"remove"|"add&remove"} OTReactionRoleType */
|
||||||
|
/**@typedef {"add"|"remove"} OTReactionRoleMode */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {OTReactionRoleMode} mode
|
||||||
|
* @param {OTReactionRoleType} type
|
||||||
|
* @param {discord.Role} role
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
exports.onReactionRole = (mode,type,role,user,channel,guild,date) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","someone used a reaction role",[{key:"mode",value:mode},{key:"type",value:type},{key:"roleid",value:role.id},{key:"userid",value:user},{key:"channelid",value:channel.id},{key:"guildid",value:guild.id}])
|
||||||
|
|
||||||
|
reactionRoleListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(mode,type,role,user,channel,guild,date)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {String} err
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
exports.onError = (err,date) => {
|
||||||
|
//system
|
||||||
|
bot.errorLog.log("api","there is an error",[{key:"error",value:err}])
|
||||||
|
|
||||||
|
errorListeners.forEach((func) => {
|
||||||
|
try {
|
||||||
|
func(err,date)
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//EVENT CALLBACKS:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback TicketActionEvent
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback TicketCloseEvent
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
* @param {String} reason
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback TranscriptCreationEvent
|
||||||
|
* @param {discord.Message[]} messages
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback TicketUserChangeEvent
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.User} editeduser
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback TicketTypeChangeEvent
|
||||||
|
* @param {String} newtype
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
* @param {{name:String,status:"open"|"closed"|"deleted"|"reopened",ticketOptions:configParser.OTTicketOptions}} ticketdata
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback CommandEvent
|
||||||
|
* @param {OTCommandType} type
|
||||||
|
* @param {Boolean} hasPerms
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild|false} guild
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback ReactionRoleEvent
|
||||||
|
* @param {OTReactionRoleMode} mode
|
||||||
|
* @param {OTReactionRoleType} type
|
||||||
|
* @param {discord.Role} role
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @callback ErrorEvent
|
||||||
|
* @param {String} error
|
||||||
|
* @param {Date} date
|
||||||
|
*/
|
||||||
|
|
||||||
|
//EVENT EXPORT:
|
||||||
|
|
||||||
|
/**@param {TicketActionEvent} callback */
|
||||||
|
const onTicketOpen = (callback) => {
|
||||||
|
ticketOpenListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketCloseEvent} callback */
|
||||||
|
const onTicketClose = (callback) => {
|
||||||
|
ticketCloseListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketActionEvent} callback */
|
||||||
|
const onTicketDelete = (callback) => {
|
||||||
|
ticketDeleteListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketActionEvent} callback */
|
||||||
|
const onTicketReopen = (callback) => {
|
||||||
|
ticketReopenListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketUserChangeEvent} callback */
|
||||||
|
const onTicketAdd = (callback) => {
|
||||||
|
ticketAddListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketUserChangeEvent} callback */
|
||||||
|
const onTicketRemove = (callback) => {
|
||||||
|
ticketRemoveListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketActionEvent} callback */
|
||||||
|
const onTicketClaim = (callback) => {
|
||||||
|
ticketClaimListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketActionEvent} callback */
|
||||||
|
const onTicketUnclaim = (callback) => {
|
||||||
|
ticketUnclaimListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TicketTypeChangeEvent} callback */
|
||||||
|
const onTicketChange = (callback) => {
|
||||||
|
ticketChangeListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {TranscriptCreationEvent} callback */
|
||||||
|
const onTranscriptCreation = (callback) => {
|
||||||
|
transcriptCreationListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {CommandEvent} callback */
|
||||||
|
const onCommand = (callback) => {
|
||||||
|
commandListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {ReactionRoleEvent} callback */
|
||||||
|
const onReactionRole = (callback) => {
|
||||||
|
commandListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {ErrorEvent} callback */
|
||||||
|
const onError = (callback) => {
|
||||||
|
errorListeners.push(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.events = {
|
||||||
|
onTicketOpen,
|
||||||
|
onTicketClose,
|
||||||
|
onTicketDelete,
|
||||||
|
onTicketReopen,
|
||||||
|
onTicketAdd,
|
||||||
|
onTicketRemove,
|
||||||
|
onTicketClaim,
|
||||||
|
onTicketUnclaim,
|
||||||
|
onTicketChange,
|
||||||
|
onTranscriptCreation,
|
||||||
|
onCommand,
|
||||||
|
onReactionRole,
|
||||||
|
onError
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
const fs = require("fs")
|
||||||
|
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
|
||||||
|
var successcount = 0
|
||||||
|
var failcount = 0
|
||||||
|
files.forEach((file) => {
|
||||||
|
if (file.endsWith(".plugin.js")){
|
||||||
|
try {
|
||||||
|
require("../../plugins/" + file)()
|
||||||
|
|
||||||
|
successcount++
|
||||||
|
totalcount++
|
||||||
|
}catch(err){
|
||||||
|
/**@type {Error} */
|
||||||
|
const theError = err
|
||||||
|
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 })
|
||||||
|
}
|
||||||
+516
@@ -0,0 +1,516 @@
|
|||||||
|
exports.checker = async () => {
|
||||||
|
const chalk = await (await import("chalk")).default
|
||||||
|
|
||||||
|
if (process.argv.some((v) => v == "--nochecker")) return
|
||||||
|
if (process.argv.some((v) => v == "--devconfig")){
|
||||||
|
//console.log(chalk.blue("=> used dev config instead of normal config"))
|
||||||
|
try{
|
||||||
|
var tempconfig = require("../devconfig.json")
|
||||||
|
}catch(err){console.log(err);var tempconfig = require("../config.json")}
|
||||||
|
}else{
|
||||||
|
var tempconfig = require("../config.json")
|
||||||
|
}
|
||||||
|
|
||||||
|
const config = tempconfig
|
||||||
|
var errorList = []
|
||||||
|
var isError = false
|
||||||
|
var warnList = []
|
||||||
|
var isWarn = false
|
||||||
|
const createError = (message) => {
|
||||||
|
isError = true
|
||||||
|
errorList.push("open-ticket CONFIG ERROR: "+message)
|
||||||
|
}
|
||||||
|
const createWarn = (message) => {
|
||||||
|
isWarn = true
|
||||||
|
warnList.push("open-ticket CONFIG WARNING: "+message)
|
||||||
|
}
|
||||||
|
|
||||||
|
//validators
|
||||||
|
/**@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)){
|
||||||
|
createError("'"+path+"' | this user id is invalid")
|
||||||
|
}
|
||||||
|
}else if (mode == "channelid"){
|
||||||
|
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
||||||
|
createError("'"+path+"' | this channel id is invalid")
|
||||||
|
}
|
||||||
|
}else if (mode == "roleid"){
|
||||||
|
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
||||||
|
createError("'"+path+"' | this role id is invalid")
|
||||||
|
}
|
||||||
|
}else if (mode == "serverid"){
|
||||||
|
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
||||||
|
createError("'"+path+"' | this server id is invalid")
|
||||||
|
}
|
||||||
|
}else if (mode == "categoryid"){
|
||||||
|
if (value.length < 16 || value.length > 20 || !/^\d+$/.test(value)){
|
||||||
|
createError("'"+path+"' | this category id is invalid")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**@param {String} value */
|
||||||
|
const checkToken = (value) => {
|
||||||
|
if (value.length < 40){
|
||||||
|
createError("'token/value' | your token is invalid")
|
||||||
|
}
|
||||||
|
if (value.includes(" ")) createError("'token/value' | your token includes spaces!")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} value @param {String} path */
|
||||||
|
const checkHexColor = (value,path) => {
|
||||||
|
if (!/^#[a-fA-F0-9]{3,6}$/.test(value)){
|
||||||
|
if (value.length < 4) return createError("'"+path+"' | hex color too short! (example: #123abc)")
|
||||||
|
if (value.length > 7) return createError("'"+path+"' | hex color too long! (example: #123abc)")
|
||||||
|
createError("'"+path+"' | invalid color! (example: #123abc)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} value @param {String} path */
|
||||||
|
const checkEmbedColor = (value,path) => {
|
||||||
|
if (!['DEFAULT','WHITE','AQUA','GREEN','BLUE','YELLOW','PURPLE','LUMINOUS_VIVID_PINK','FUCHSIA','GOLD','ORANGE','RED','GREY','DARKER_GREY','NAVY','DARK_AQUA','DARK_GREEN','DARK_BLUE','DARK_PURPLE','DARK_VIVID_PINK','DARK_GOLD','DARK_ORANGE','DARK_RED','DARK_GREY','LIGHT_GREY','DARK_NAVY','BLURPLE','GREYPLE','DARK_BUT_NOT_BLACK','NOT_QUITE_BLACK','RANDOM'].includes(value)){
|
||||||
|
return createError("'"+path+"' | invalid color, must be a hex code or default color (more info in the wiki)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} value @param {String} path @param {Number} minLength @param {Number} maxLength @param {String} name */
|
||||||
|
const checkString = (value,minLength,maxLength,path,name) => {
|
||||||
|
if (value.length < minLength){
|
||||||
|
createError("'"+path+"' | "+name+" is too short!")
|
||||||
|
}else if (value.length > maxLength){
|
||||||
|
createError("'"+path+"' | "+name+" is too long!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {"userid"|"roleid"|"channelid"|"serverid"} mode @param {String[]} arrayValue @param {String} path */
|
||||||
|
const checkDiscordArray = (mode,arrayValue,path) => {
|
||||||
|
if (!Array.isArray(arrayValue)){
|
||||||
|
return createError("'"+path+"' | this needs to be an Array!")
|
||||||
|
}
|
||||||
|
if (mode == "userid"){
|
||||||
|
arrayValue.forEach((value,index) => {
|
||||||
|
if (value.length < 16 || value.length > 20 || !/^\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)){
|
||||||
|
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)){
|
||||||
|
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)){
|
||||||
|
createError("'"+path+":"+index+"' | this server id is invalid")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**@param {String} value @param {"string"|"boolean"|"number"|"array"|"object"} type */
|
||||||
|
const checkType = (value,type,path) => {
|
||||||
|
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) => {
|
||||||
|
if (value != "none" && value != "grey" && value != "gray" && value != "black" && value != "red" && value != "green" && value != "blue" && value != "blurple"){
|
||||||
|
createError("'"+path+"' | invalid color, it must be one of these: none, gray, red, green, blue!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const configParser = require("./utils/configParser")
|
||||||
|
/**
|
||||||
|
* @param {configParser.OTAllOptions} option
|
||||||
|
* @param {String} path
|
||||||
|
*/
|
||||||
|
|
||||||
|
const checkOption = (option,path) => {
|
||||||
|
|
||||||
|
//id
|
||||||
|
checkType(option.id,"string",path+"/id")
|
||||||
|
if (option.id.includes(" ")){
|
||||||
|
createError("'"+path+"/id' | option id can't contain space characters!")
|
||||||
|
}
|
||||||
|
if (option.id.length > 20){
|
||||||
|
createError("'"+path+"/id' | option id max lenght is 20!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//name
|
||||||
|
checkType(option.name,"string",path+"/name")
|
||||||
|
if (option.name.length > 100){
|
||||||
|
createWarn("'"+path+"/name' | if your name is too long it maybe doesn't look so good!")
|
||||||
|
}else if (option.name.length < 1){
|
||||||
|
createError("'"+path+"/name' | there is no name!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//description
|
||||||
|
checkType(option.description,"string",path+"/description")
|
||||||
|
|
||||||
|
//icon
|
||||||
|
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)
|
||||||
|
|
||||||
|
if (isEmoji == false){
|
||||||
|
createError("'"+path+"/icon' | invalid emoji or custom discord emoji")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkType(option.icon,"string",path+"/icon")
|
||||||
|
|
||||||
|
//label
|
||||||
|
checkType(option.label,"string",path+"/label")
|
||||||
|
if (option.label.length < 1 && option.icon.length < 1){
|
||||||
|
createError("'"+path+"' | you need at least one of these: label, icon!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//type
|
||||||
|
checkType(option.type,"string",path+"/type")
|
||||||
|
if (option.type != "ticket" && option.type != "website" && option.type != "role"){
|
||||||
|
createError("'"+path+"/type' | the type must be one of these: ticket, website, role!")
|
||||||
|
}
|
||||||
|
/**@type {"ticket"|"website"|"role"} */
|
||||||
|
const type = option.type
|
||||||
|
|
||||||
|
if (type == "ticket"){
|
||||||
|
//color
|
||||||
|
checkType(option.color,"string",path+"/color")
|
||||||
|
checkButtonColor(option.color,path+"/color")
|
||||||
|
|
||||||
|
//adminroles
|
||||||
|
checkType(option.adminroles,"array",path+"/adminroles")
|
||||||
|
checkDiscordArray("roleid",option.adminroles,path+"/adminroles")
|
||||||
|
|
||||||
|
//channelprefix
|
||||||
|
checkType(option.channelprefix,"string",path+"/channelprefix")
|
||||||
|
if (option.channelprefix.includes(" ")){
|
||||||
|
createWarn("'"+path+"/channelprefix' | this prefix can't contain spaces!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//category
|
||||||
|
checkType(option.category,"string",path+"/category")
|
||||||
|
if (option.category.length > 0){
|
||||||
|
checkDiscord("categoryid",option.category,path+"/category")
|
||||||
|
}
|
||||||
|
|
||||||
|
//message
|
||||||
|
checkType(option.message,"string",path+"/message")
|
||||||
|
|
||||||
|
//enableDmOnOpen
|
||||||
|
checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen")
|
||||||
|
|
||||||
|
//ticketmessage
|
||||||
|
checkType(option.ticketmessage,"string",path+"/ticketmessage")
|
||||||
|
|
||||||
|
//thumbnail
|
||||||
|
if (option.thumbnail){
|
||||||
|
checkType(option.thumbnail.enable,"boolean",path+"/thumbnail/enable")
|
||||||
|
checkType(option.thumbnail.url,"string",path+"/thumbnail/url")
|
||||||
|
}else{
|
||||||
|
createError("'"+path+"/thumbnail' | there is no thumbnail object!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//image
|
||||||
|
if (option.image){
|
||||||
|
checkType(option.image.enable,"boolean",path+"/image/enable")
|
||||||
|
checkType(option.image.url,"string",path+"/image/url")
|
||||||
|
}else{
|
||||||
|
createError("'"+path+"/image' | there is no image object!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//closedCategory
|
||||||
|
if (option.closedCategory){
|
||||||
|
checkType(option.closedCategory.enable,"boolean",path/"/closedCategory/enable")
|
||||||
|
checkType(option.closedCategory.id,"string",path/"/closedCategory/id")
|
||||||
|
if (option.closedCategory.enable){
|
||||||
|
checkDiscord("roleid",option.closedCategory.id,path+"/closedCategory/id")
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
createError("'"+path+"/closedCategory' | there is no closedCategory object!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//autoclose
|
||||||
|
if (option.autoclose){
|
||||||
|
checkType(option.autoclose.enable,"boolean",path/"/autoclose/enable")
|
||||||
|
checkType(option.autoclose.inactiveHours,"number",path/"/autoclose/id")
|
||||||
|
}else{
|
||||||
|
createError("'"+path+"/autoclose' | there is no autoclose object!")
|
||||||
|
}
|
||||||
|
|
||||||
|
}else if (type == "website"){
|
||||||
|
//url
|
||||||
|
checkType(option.url,"string",path+"/url")
|
||||||
|
if (option.url.includes(" ")){
|
||||||
|
createWarn("'"+path+"/url' | a url can't contain spaces")
|
||||||
|
}
|
||||||
|
if (option.url.length < 1){
|
||||||
|
createError("'"+path+"/url' | there is no url!")
|
||||||
|
}
|
||||||
|
if (!option.url.startsWith("https://") && !option.url.startsWith("http://") && !option.url.startsWith("discord://")){
|
||||||
|
createWarn("'"+path+"/url' | your url doesn't start with https or http!")
|
||||||
|
}
|
||||||
|
if (option.url.startsWith("http://")){
|
||||||
|
createWarn("'"+path+"/url' | your url is not a HTTPS link! discord can block this url!")
|
||||||
|
}
|
||||||
|
}else if (type == "role"){
|
||||||
|
//color
|
||||||
|
checkType(option.color,"string",path+"/color")
|
||||||
|
checkButtonColor(option.color,path+"/color")
|
||||||
|
|
||||||
|
//roles
|
||||||
|
checkDiscordArray("roleid",option.roles,path+"/roles")
|
||||||
|
|
||||||
|
//mode
|
||||||
|
checkType(option.mode,"string",path+"/mode")
|
||||||
|
if (option.mode != "add&remove" && option.mode != "add" && option.mode != "remove"){
|
||||||
|
createError("'"+path+"/mode' | mode must be one of these: add, remove, add&remove")
|
||||||
|
}
|
||||||
|
|
||||||
|
//enableDmOnOpen
|
||||||
|
checkType(option.enableDmOnOpen,"boolean",path+"/enableDmOnOpen")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {configParser.OTConfigMessage} input
|
||||||
|
* @param {String} path
|
||||||
|
*/
|
||||||
|
const checkMessage = (input,path) => {
|
||||||
|
//id
|
||||||
|
if (!input.id) createError("'"+path+"/id' | this embed doesn't have an id!")
|
||||||
|
if (input.id.length > 50) createError("'"+path+"/id' | the id can't be longer than 50")
|
||||||
|
if (input.id.includes(" ") || input.id.includes("\n")) createError("'"+path+"/id' | the id can't contain spaces!")
|
||||||
|
|
||||||
|
//name
|
||||||
|
if (input.name.length < 1){
|
||||||
|
createWarn("'"+path+"/name' | this embed has no name!")
|
||||||
|
}else if (input.name.length > 99) {
|
||||||
|
createError("'"+path+"/name' | the name can't be longer than 100")
|
||||||
|
}
|
||||||
|
|
||||||
|
//description
|
||||||
|
if (input.description.length < 0){
|
||||||
|
createWarn("'"+path+"/description' | this embed doesn't have a description!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//dropdown
|
||||||
|
checkType(input.dropdown,"boolean",path+"/dropdown")
|
||||||
|
|
||||||
|
//footer
|
||||||
|
checkType(input.enableFooter,"boolean",path+"/enableFooter")
|
||||||
|
if (input.enableFooter){
|
||||||
|
if (input.footer.length < 1) createError("'"+path+"/footer' | no footer!")
|
||||||
|
if (input.footer.length > 200) createError("'"+path+"/footer' | footer length can't be more than 200!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//thumbnail
|
||||||
|
checkType(input.enableThumbnail,"boolean",path+"/enableThumbnail")
|
||||||
|
if (input.enableThumbnail){
|
||||||
|
if (input.thumbnail.length < 1) createError("'"+path+"/thumbnail' | no thumbnail url!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//customColor
|
||||||
|
checkType(input.enableCustomColor,"boolean",path+"/enableCustomColor")
|
||||||
|
if (input.enableCustomColor){
|
||||||
|
if (input.color.length < 1) createError("'"+path+"/color' | no color!")
|
||||||
|
checkHexColor(input.color,path+"/color")
|
||||||
|
}
|
||||||
|
|
||||||
|
//OPTIONS!!!
|
||||||
|
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!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//other
|
||||||
|
//ticket explaination & max tickets warning
|
||||||
|
if (typeof input.other != "object"){
|
||||||
|
createError("'"+path+"/other' | this object doesn't exist!")
|
||||||
|
}else{
|
||||||
|
checkType(input.other.enableTicketExplaination,"boolean",path+"/other/enableTicketExplaination")
|
||||||
|
checkType(input.other.enableMaxTicketsWarning,"boolean",path+"/other/enableMaxTicketsWarning")
|
||||||
|
|
||||||
|
//customDropdownPlaceholder
|
||||||
|
if (typeof input.other.customDropdownPlaceholder != "object"){
|
||||||
|
createError("'"+path+"/other/customDropdownPlaceholder' | this object doesn't exist!")
|
||||||
|
}else{
|
||||||
|
checkType(input.other.customDropdownPlaceholder.enable,"boolean",path+"/other/customDropdownPlaceholder/enable")
|
||||||
|
checkType(input.other.customDropdownPlaceholder.text,"string",path+"/other/customDropdownPlaceholder/text")
|
||||||
|
if (input.other.customDropdownPlaceholder.enable && input.other.customDropdownPlaceholder.text.length < 1){createError("'"+path+"/other/customDropdownPlaceholder/text' | there is no placeholder text!")}
|
||||||
|
}
|
||||||
|
|
||||||
|
//customCategoryText
|
||||||
|
if (typeof input.other.customCategoryText != "object"){
|
||||||
|
createError("'"+path+"/other/customCategoryText' | this object doesn't exist!")
|
||||||
|
}else{
|
||||||
|
checkType(input.other.customCategoryText.enable,"boolean",path+"/other/customCategoryText/enable")
|
||||||
|
checkType(input.other.customCategoryText.text,"string",path+"/other/customCategoryText/text")
|
||||||
|
if (input.other.customCategoryText.enable && input.other.customCategoryText.text.length < 1){createError("'"+path+"/other/customCategoryText/text' | there is no category text!")}
|
||||||
|
}
|
||||||
|
|
||||||
|
//embedTitleURL
|
||||||
|
if (typeof input.other.embedTitleURL != "object"){
|
||||||
|
createError("'"+path+"/other/embedTitleURL' | this object doesn't exist!")
|
||||||
|
}else{
|
||||||
|
checkType(input.other.embedTitleURL.enable,"boolean",path+"/other/embedTitleURL/enable")
|
||||||
|
checkType(input.other.embedTitleURL.url,"string",path+"/other/embedTitleURL/text")
|
||||||
|
if (input.other.embedTitleURL.enable && input.other.embedTitleURL.url.length < 1){createError("'"+path+"/other/embedTitleURL/url' | there is no url!")}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------|
|
||||||
|
//--------------------------|
|
||||||
|
//checker => START HERE |
|
||||||
|
//--------------------------|
|
||||||
|
//--------------------------|
|
||||||
|
|
||||||
|
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.color,"main_color")
|
||||||
|
checkDiscord("serverid",config.serverId,"server_id")
|
||||||
|
|
||||||
|
if (!require("./api/api.json").disable.checkerjs.token && !config.token.fromENV) checkToken(config.token.value)
|
||||||
|
|
||||||
|
checkType(config.adminRoles,"array","/main_adminroles")
|
||||||
|
checkDiscordArray("roleid",config.adminRoles,"main_adminroles")
|
||||||
|
checkString(config.prefix,1,15,"prefix","prefix")
|
||||||
|
//languagefile
|
||||||
|
checkType(config.languageFile,"string","languagefile")
|
||||||
|
const lf = config.languageFile
|
||||||
|
|
||||||
|
if (!lf.startsWith("custom") && !lf.startsWith("english") && !lf.startsWith("dutch") && !lf.startsWith("romanian") && !lf.startsWith("german") && !lf.startsWith("arabic") && !lf.startsWith("spanish") && !lf.startsWith("portuguese") && !lf.startsWith("french") && !lf.startsWith("italian") && !lf.startsWith("czech") && !lf.startsWith("danish") && !lf.startsWith("russian") && !lf.startsWith("turkish") && !lf.startsWith("polish") && !lf.startsWith("slovenian") && !lf.startsWith("thai") && !lf.startsWith("norwegian") && !lf.startsWith("greek") && !lf.startsWith("ukrainian") && !lf.startsWith("hungarian") && !lf.startsWith("indonesian")){
|
||||||
|
createError("'languagefile' | invalid language, more info in the wiki")
|
||||||
|
}
|
||||||
|
|
||||||
|
//status:
|
||||||
|
checkType(config.status.enabled,"boolean","status/enabled")
|
||||||
|
if (config.status.enabled){
|
||||||
|
if (config.status.type != "PLAYING" && config.status.type != "LISTENING" && config.status.type != "WATCHING"){
|
||||||
|
createError("'status/type' | not a valid status type! (LISTENING,WATCHING,PLAYING)")
|
||||||
|
}
|
||||||
|
if (config.status.text.length < 1){
|
||||||
|
createError("'status/text' | there is no status text!")
|
||||||
|
}
|
||||||
|
if (config.status.text.length > 50) createError("'status/text' | text too long!")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//system:
|
||||||
|
//max tickets
|
||||||
|
checkType(config.system.maxAmountOfTickets,"number","system/maxAmountOfTickets")
|
||||||
|
|
||||||
|
//enableDMmessages
|
||||||
|
checkType(config.system.dmMessages,"boolean","system/dmMessages")
|
||||||
|
|
||||||
|
//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/memberRole' | You don't have a member role, but it's recommended!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//closemode
|
||||||
|
checkType(config.system.closeMode,"string","system/closeMode")
|
||||||
|
if (!["normal","adminonly"].includes(config.system.closeMode)){
|
||||||
|
createError("'system/closeMode' | the close mode must be adminonly or normal")
|
||||||
|
}
|
||||||
|
|
||||||
|
checkType(config.system.showSlashcmdsInHelp,"boolean","system/showSlashcmdsInHelp")
|
||||||
|
checkType(config.system.answerInEphemeralOnOpen,"boolean","system/answerInEphemeralOnOpen")
|
||||||
|
|
||||||
|
//options
|
||||||
|
|
||||||
|
config.options.forEach((option,index) => {
|
||||||
|
checkOption(option,"options/"+index)
|
||||||
|
})
|
||||||
|
|
||||||
|
//messages
|
||||||
|
config.messages.forEach((message,index) => {
|
||||||
|
checkMessage(message,"messages/"+index)
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
//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!"))
|
||||||
|
}
|
||||||
|
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!"))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
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)
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
const fs = require("fs")
|
||||||
|
const location = "./storage/database.json"
|
||||||
|
|
||||||
|
|
||||||
|
/**@returns {[{category:String, key:String, value:String}]}*/
|
||||||
|
function getData(){
|
||||||
|
if (fs.existsSync(location)){
|
||||||
|
return JSON.parse(fs.readFileSync(location).toString())
|
||||||
|
}else{
|
||||||
|
fs.writeFileSync(location,"[]")
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**@param {[{category:String, key:String, value:String}]} data*/
|
||||||
|
function setData(data){
|
||||||
|
fs.writeFileSync(location,JSON.stringify(data,null,"\t"))
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.set = (category,key,value) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
||||||
|
var newData = []
|
||||||
|
if (exists){
|
||||||
|
currentData.forEach((d,i) => {
|
||||||
|
if (d.category == category && d.key == key){
|
||||||
|
newData.push({category,key,value})
|
||||||
|
}else{
|
||||||
|
newData.push(d)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
currentData.push({category,key,value})
|
||||||
|
newData = currentData
|
||||||
|
}
|
||||||
|
|
||||||
|
setData(newData)
|
||||||
|
return exists
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {String} category
|
||||||
|
* @param {String} key
|
||||||
|
* @returns {String|false}
|
||||||
|
*/
|
||||||
|
exports.get = (category,key) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const tempresult = currentData.find((d) => (d.category == category) && (d.key == key))
|
||||||
|
const result = tempresult ? tempresult.value : false
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {String} category
|
||||||
|
* @returns {[{key:String,value:String}]|false}
|
||||||
|
*/
|
||||||
|
exports.getCategory = (category) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const result = currentData.filter((v) => v.category == category)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {String} category
|
||||||
|
* @param {String} key
|
||||||
|
* @param {String} value
|
||||||
|
*/
|
||||||
|
exports.delete = (category,key) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
||||||
|
var newData = []
|
||||||
|
if (exists){
|
||||||
|
currentData.forEach((d,i) => {
|
||||||
|
if (!(d.category == category && d.key == key)){
|
||||||
|
newData.push(d)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
newData = currentData
|
||||||
|
}
|
||||||
|
|
||||||
|
setData(newData)
|
||||||
|
return exists
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
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")
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
==================================================================
|
||||||
|
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")
|
||||||
|
}catch(err){
|
||||||
|
console.log(err)
|
||||||
|
console.log("I couldn't find the database file! (location: ./core/dynamicdatabase/storage.js:2)")
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = db
|
||||||
@@ -0,0 +1,160 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
|
||||||
|
const loadChalk = async () => {
|
||||||
|
return await (await import("chalk")).default
|
||||||
|
}
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const c = discord.Colors
|
||||||
|
|
||||||
|
/**@param {discord.User} user*/
|
||||||
|
exports.noPermsMessage = (user) => {
|
||||||
|
return new embed()
|
||||||
|
.setColor(c.Red)
|
||||||
|
.setTitle(":x: "+l.errors.noPermsTitle)
|
||||||
|
.setDescription(l.errors.noPermsDescription)
|
||||||
|
.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)
|
||||||
|
.setDescription(l.errors.noPermsDelete)
|
||||||
|
.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)
|
||||||
|
.setDescription(message)
|
||||||
|
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} message */
|
||||||
|
exports.serverError = (message) => {
|
||||||
|
var x = new embed()
|
||||||
|
.setColor(c.Orange)
|
||||||
|
.setTitle(":warning: "+l.errors.boterror)
|
||||||
|
.setDescription(message)
|
||||||
|
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@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(beforemsg+l.errors.chooseFromListDescription+"\n`"+list.join("`\n`")+"`")
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.failedRenameChannel = new embed()
|
||||||
|
.setColor(c.Red)
|
||||||
|
.setTitle(":x: 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)
|
||||||
|
.setDescription(l.errors.notInTicketDescription)
|
||||||
|
|
||||||
|
|
||||||
|
/**@param {String} message @param {String} title */
|
||||||
|
exports.success = (title,message) => {
|
||||||
|
var x = new embed()
|
||||||
|
.setColor(config.color)
|
||||||
|
.setTitle(":white_check_mark: "+title)
|
||||||
|
.setDescription(message)
|
||||||
|
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} message @param {String} title */
|
||||||
|
exports.warning = (title,message) => {
|
||||||
|
var x = new embed()
|
||||||
|
.setColor(c.Orange)
|
||||||
|
.setTitle(":warning: "+title)
|
||||||
|
.setDescription(message)
|
||||||
|
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} message the message @param {String} title the title @param {String} emoji an discord emoji @param {discord.ColorResolvable} color the embed color*/
|
||||||
|
exports.custom = (title,message,emoji,color) => {
|
||||||
|
var x = new embed()
|
||||||
|
.setColor(color)
|
||||||
|
.setTitle(emoji+" "+title)
|
||||||
|
.setDescription(message)
|
||||||
|
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.clearDebugFile = () => {
|
||||||
|
const fs = require("fs")
|
||||||
|
if (!fs.existsSync("./openticketdebug.txt")) return
|
||||||
|
const content = fs.readFileSync("./openticketdebug.txt").toString().split("\n")
|
||||||
|
if (content.length < 5000) return
|
||||||
|
for (let i = 0; i < 4000; i++) {
|
||||||
|
content.shift()
|
||||||
|
}
|
||||||
|
|
||||||
|
const newContent = "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="+content.join("\n")
|
||||||
|
fs.writeFileSync("./openticketdebug.txt",newContent)
|
||||||
|
}
|
||||||
|
|
||||||
|
const normalLog = (debugString) => {
|
||||||
|
const fs = require("fs")
|
||||||
|
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
|
||||||
|
fs.writeFileSync("./openticketdebug.txt",content+"\nSYSTEM: "+debugString)
|
||||||
|
this.clearDebugFile()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {"system"|"command"|"info"|"api"|"debug"} type
|
||||||
|
* @param {String} message
|
||||||
|
* @param {[{key:String,value:String}]} params
|
||||||
|
*/
|
||||||
|
exports.log = async (type,message,params) => {
|
||||||
|
var ptype = type
|
||||||
|
const chalk = await loadChalk()
|
||||||
|
var paramstring = ""
|
||||||
|
if (params){
|
||||||
|
if (params.length > 0){
|
||||||
|
params.forEach((p) => {
|
||||||
|
paramstring = paramstring+p.key+": "+p.value+" "
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const parameters = params ? "("+paramstring+")" : " "
|
||||||
|
|
||||||
|
if (ptype == "command"){
|
||||||
|
console.log(chalk.green("[command] ")+message+" "+chalk.yellow(parameters))
|
||||||
|
}else if (ptype == "info"){
|
||||||
|
console.log(chalk.blue("[info] ")+message+" "+chalk.yellow(parameters))
|
||||||
|
}else if (ptype == "system"){
|
||||||
|
console.log(chalk.green("[system] ")+message+" "+chalk.yellow(parameters))
|
||||||
|
}else if (ptype == "api"){
|
||||||
|
if (require("./api/api.json").enableAPIconsolelogs == true){
|
||||||
|
console.log(chalk.red("[api v"+require("./api/api.json").version+"] ")+message+" "+chalk.yellow(parameters))
|
||||||
|
}
|
||||||
|
ptype = "api v"+require("./api/api.json").version
|
||||||
|
}else if (ptype == "debug"){
|
||||||
|
if (!process.argv.some((v) => v == "--debug")) return
|
||||||
|
console.log(chalk.redBright("[DEBUG] ")+message+" "+chalk.yellow(parameters))
|
||||||
|
}
|
||||||
|
|
||||||
|
const cd = new Date()
|
||||||
|
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
|
||||||
|
normalLog("["+cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getSeconds()+":"+cd.getMinutes()+":"+cd.getHours()+"] ["+ptype+"] "+message+" "+parameters)
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
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 hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
|
||||||
|
exports.closeCommandRow = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicket1")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Danger)
|
||||||
|
.setLabel(l.buttons.delete)
|
||||||
|
.setEmoji("✖️")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTreopenTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Success)
|
||||||
|
.setLabel(l.buttons.reopen)
|
||||||
|
.setEmoji("✔")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.closeCommandRowDisabled = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicket1")
|
||||||
|
.setDisabled(true)
|
||||||
|
.setStyle(bs.Danger)
|
||||||
|
.setLabel(l.buttons.delete)
|
||||||
|
.setEmoji("✖️")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTreopenTicket")
|
||||||
|
.setDisabled(true)
|
||||||
|
.setStyle(bs.Success)
|
||||||
|
.setLabel(l.buttons.reopen)
|
||||||
|
.setEmoji("✔")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.openRowNormal = new arb()
|
||||||
|
.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.openRowDisabled = new arb()
|
||||||
|
.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("✖️")
|
||||||
|
)
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
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 hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
|
||||||
|
exports.firstmsgRowNormal = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTclaimTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Success)
|
||||||
|
.setLabel("Claim Ticket")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTcloseTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setLabel(l.buttons.close)
|
||||||
|
.setEmoji("🔒")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Danger)
|
||||||
|
.setLabel(l.buttons.delete)
|
||||||
|
.setEmoji("✖️")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.firstmsgRowDisabled = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTclaimTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Success)
|
||||||
|
.setLabel("Claim Ticket")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTcloseTicket")
|
||||||
|
.setDisabled(true)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setLabel(l.buttons.close)
|
||||||
|
.setEmoji("🔒")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicket")
|
||||||
|
.setDisabled(true)
|
||||||
|
.setStyle(bs.Danger)
|
||||||
|
.setLabel(l.buttons.delete)
|
||||||
|
.setEmoji("✖️")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.firstmsgRowNormalNoClaim = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTclaimTicket")
|
||||||
|
.setDisabled(true)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setLabel("Claim Ticket")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTcloseTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setLabel(l.buttons.close)
|
||||||
|
.setEmoji("🔒")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicket")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Danger)
|
||||||
|
.setLabel(l.buttons.delete)
|
||||||
|
.setEmoji("✖️")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.firstmsgRowDisabledNoClaim = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTclaimTicket")
|
||||||
|
.setDisabled(true)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setLabel("Claim Ticket")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
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("✖️")
|
||||||
|
)
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
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 hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
exports.closeVerifyBar = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTcloseTicketReason")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Primary)
|
||||||
|
.setEmoji("💬")
|
||||||
|
.setLabel(l.buttons.closeWithReason)
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTcloseTicketTrue")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setEmoji("✅")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTcloseTicketFalse")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setEmoji("❌")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.deleteVerifyBar = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicketTrue")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setEmoji("✅")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicketFalse")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setEmoji("❌")
|
||||||
|
)
|
||||||
|
|
||||||
|
exports.delete1VerifyBar = new arb()
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicketTrue1")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setEmoji("✅")
|
||||||
|
)
|
||||||
|
.addComponents(
|
||||||
|
new button()
|
||||||
|
.setCustomId("OTdeleteTicketFalse1")
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(bs.Secondary)
|
||||||
|
.setEmoji("❌")
|
||||||
|
)
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
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 hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} addedUser
|
||||||
|
* @param {discord.User} adder
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.addEmbed = (addedUser,adder) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("⬆️ "+l.commands.userAddedTitle.replace("{0}",addedUser.username))
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:adder.username,iconURL:adder.displayAvatarURL()})
|
||||||
|
.setThumbnail(addedUser.displayAvatarURL({extension:"png"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} removedUser
|
||||||
|
* @param {discord.User} remover
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.removeEmbed = (removedUser,remover) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("⬇️ "+l.commands.userRemovedTitle.replace("{0}",removedUser.username))
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:remover.username,iconURL:remover.displayAvatarURL()})
|
||||||
|
.setThumbnail(removedUser.displayAvatarURL({extension:"png"}))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} closer
|
||||||
|
* @param {String} description
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.closeEmbed = (closer,description) => {
|
||||||
|
const embd = new embed()
|
||||||
|
.setTitle("🔒 "+l.commands.closeTitle)
|
||||||
|
.setColor(mc)
|
||||||
|
.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
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.deleteEmbed = (deleter) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("❌ "+l.commands.deleteTitle)
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:deleter.username,iconURL:deleter.displayAvatarURL()})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} renamer
|
||||||
|
* @param {String} newname
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.renameEmbed = (renamer,newname) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("🔄 "+l.commands.renameTitle.replace("{0}",newname))
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:renamer.username,iconURL:renamer.displayAvatarURL()})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} reopener
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.reopenEmbed = (reopener) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("🔓 "+l.commands.reopenTitle)
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:reopener.username,iconURL:reopener.displayAvatarURL()})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} claimer
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.claimEmbed = (claimer,user) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("📌 "+l.commands.claimTitle.replace("{0}",claimer.username))
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:user.username,iconURL:user.displayAvatarURL()})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} unclaimer
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.unclaimEmbed = (unclaimer) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("🆓 "+l.commands.unclaimTitle)
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:unclaimer.username,iconURL:unclaimer.displayAvatarURL()})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} changer
|
||||||
|
* @param {String} newtype
|
||||||
|
* @returns {discord.EmbedBuilder}
|
||||||
|
*/
|
||||||
|
exports.changeEmbed = (changer,newtype) => {
|
||||||
|
return new embed()
|
||||||
|
.setTitle("🔄 "+l.commands.changeTitle.replace("{0}",newtype))
|
||||||
|
.setColor(mc)
|
||||||
|
.setFooter({text:changer.username,iconURL:changer.displayAvatarURL()})
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
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
|
||||||
|
if (!permsChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(interaction.user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const hiddendata = bot.hiddenData.readHiddenData(interaction.channel.id)
|
||||||
|
if (hiddendata.length < 1) return interaction.editReply({embeds:[bot.errorLog.notInATicket]})
|
||||||
|
const ticketId = hiddendata.find(d => d.key == "type").value
|
||||||
|
|
||||||
|
hiddendata.push({key:"claimedby",value:interaction.user.id})
|
||||||
|
bot.hiddenData.writeHiddenData(interaction.channel.id,hiddendata)
|
||||||
|
storage.set("claimData",interaction.channel.id,interaction.user.id)
|
||||||
|
|
||||||
|
interaction.channel.messages.fetchPinned().then(msglist => {
|
||||||
|
/**@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)]})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const permissionChecker = require("../../../utils/permisssionChecker")
|
||||||
|
const storage = bot.storage
|
||||||
|
const hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
//CLOSE
|
||||||
|
var closeTicketButtonChecker = false
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTcloseTicketTrue") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
|
||||||
|
if (closeTicketButtonChecker == true) return
|
||||||
|
closeTicketButtonChecker = true
|
||||||
|
|
||||||
|
const firstcomponents = interaction.message.components
|
||||||
|
|
||||||
|
if (config.system.closeMode == "adminonly"){
|
||||||
|
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
if (!permissionChecker.sendUserNoPerms(interaction.user)){
|
||||||
|
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
|
||||||
|
}
|
||||||
|
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]})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {String}
|
||||||
|
*/
|
||||||
|
const name = interaction.channel.name
|
||||||
|
var prefix = ""
|
||||||
|
const tickets = config.options
|
||||||
|
tickets.forEach((ticket) => {
|
||||||
|
if (name.startsWith(ticket.channelprefix)){
|
||||||
|
prefix = ticket.channelprefix
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
|
||||||
|
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",false,true)
|
||||||
|
closeTicketButtonChecker = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const permissionChecker = require("../../../utils/permisssionChecker")
|
||||||
|
const storage = bot.storage
|
||||||
|
const hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
const modal = discord.ModalBuilder
|
||||||
|
const tis = discord.TextInputStyle
|
||||||
|
const tib = discord.TextInputBuilder
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
//theModal
|
||||||
|
const reasonModal = new modal()
|
||||||
|
.setTitle(l.buttons.closeWithReason)
|
||||||
|
.setCustomId("OTCloseReasonModal")
|
||||||
|
|
||||||
|
const reasonInput = new arb()
|
||||||
|
.addComponents([
|
||||||
|
new tib()
|
||||||
|
.setCustomId('OTreasonInput')
|
||||||
|
.setLabel(l.messages.modalreason)
|
||||||
|
.setStyle(tis.Short)
|
||||||
|
.setMaxLength(100)
|
||||||
|
.setRequired(true)
|
||||||
|
.setValue("")
|
||||||
|
.setPlaceholder("reason")
|
||||||
|
])
|
||||||
|
|
||||||
|
reasonModal.addComponents(reasonInput)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//CLOSE WITH REASON
|
||||||
|
var closeTicketButtonChecker = false
|
||||||
|
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTcloseTicketReason") return
|
||||||
|
|
||||||
|
if (closeTicketButtonChecker == true) return interaction.deferUpdate()
|
||||||
|
closeTicketButtonChecker = true
|
||||||
|
|
||||||
|
const firstcomponents = interaction.message.components
|
||||||
|
|
||||||
|
if (config.system.closeMode == "adminonly"){
|
||||||
|
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
if (!permissionChecker.sendUserNoPerms(interaction.user)){
|
||||||
|
permissionChecker.sendChannelNoPerms(interaction.channel,interaction.user)
|
||||||
|
}
|
||||||
|
interaction.message.edit({components:[firstcomponents]})
|
||||||
|
closeTicketButtonChecker = false
|
||||||
|
return interaction.deferUpdate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
|
||||||
|
await interaction.showModal(reasonModal)
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (interaction.type != discord.InteractionType.ModalSubmit) return
|
||||||
|
if (interaction.customId != "OTCloseReasonModal") return
|
||||||
|
|
||||||
|
interaction.reply({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
|
||||||
|
|
||||||
|
const reason = interaction.fields.getTextInputValue("OTreasonInput")
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {String}
|
||||||
|
*/
|
||||||
|
const name = interaction.channel.name
|
||||||
|
var prefix = ""
|
||||||
|
const tickets = config.options
|
||||||
|
tickets.forEach((ticket) => {
|
||||||
|
if (name.startsWith(ticket.channelprefix)){
|
||||||
|
prefix = ticket.channelprefix
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//interaction.channel.send({embeds:[bot.embeds.commands.closeEmbed(interaction.user)],components:[bot.buttons.close.closeCommandRow]})
|
||||||
|
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"close",reason,true)
|
||||||
|
closeTicketButtonChecker = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const permissionChecker = require("../../../utils/permisssionChecker")
|
||||||
|
const storage = bot.storage
|
||||||
|
const hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
//DELETE
|
||||||
|
var deleteTicketButtonChecker = false
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTdeleteTicketTrue") return
|
||||||
|
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
|
||||||
|
if (deleteTicketButtonChecker == true) return
|
||||||
|
deleteTicketButtonChecker = true
|
||||||
|
|
||||||
|
const firstcomponents = bot.buttons.close.openRowNormal
|
||||||
|
|
||||||
|
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
||||||
|
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
|
||||||
|
}
|
||||||
|
await interaction.message.edit({components:[firstcomponents]})
|
||||||
|
deleteTicketButtonChecker = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {String}
|
||||||
|
*/
|
||||||
|
const name = interaction.channel.name
|
||||||
|
var prefix = ""
|
||||||
|
const tickets = config.options
|
||||||
|
tickets.forEach((ticket) => {
|
||||||
|
if (name.startsWith(ticket.channelprefix)){
|
||||||
|
prefix = ticket.channelprefix
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await interaction.message.edit({components:[bot.buttons.close.openRowDisabled]})
|
||||||
|
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
||||||
|
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
|
||||||
|
deleteTicketButtonChecker = false
|
||||||
|
})
|
||||||
|
|
||||||
|
//DELETE NO TRANSCRIPT
|
||||||
|
var deleteTicketButtonChecker1 = false
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTdeleteTicketTrue1") return
|
||||||
|
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
|
||||||
|
if (deleteTicketButtonChecker1 == true) return
|
||||||
|
deleteTicketButtonChecker1 = true
|
||||||
|
|
||||||
|
const firstcomponents = bot.buttons.close.closeCommandRow
|
||||||
|
|
||||||
|
if (!permissionChecker.command(interaction.user.id,interaction.guild.id)){
|
||||||
|
if (!permissionChecker.sendUserNoDelete(interaction.user)){
|
||||||
|
permissionChecker.sendChannelNoDelete(interaction.channel,interaction.user)
|
||||||
|
}
|
||||||
|
await interaction.message.edit({components:[firstcomponents]})
|
||||||
|
deleteTicketButtonChecker1 = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {String}
|
||||||
|
*/
|
||||||
|
const name = interaction.channel.name
|
||||||
|
var prefix = ""
|
||||||
|
const tickets = config.options
|
||||||
|
tickets.forEach((ticket) => {
|
||||||
|
if (name.startsWith(ticket.channelprefix)){
|
||||||
|
prefix = ticket.channelprefix
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
await interaction.message.edit({components:[bot.buttons.close.closeCommandRowDisabled]})
|
||||||
|
await interaction.channel.send({embeds:[bot.embeds.commands.deleteEmbed(interaction.user)]})
|
||||||
|
await require("../../../ticketActions/ticketCloser").closeManager(interaction.member,interaction.channel,prefix,"delete",false,true)
|
||||||
|
deleteTicketButtonChecker1 = false
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const permissionChecker = require("../../../utils/permisssionChecker")
|
||||||
|
const storage = bot.storage
|
||||||
|
const hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
//REOPEN
|
||||||
|
client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTreopenTicket") return
|
||||||
|
|
||||||
|
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)
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const storage = bot.storage
|
||||||
|
const hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = () => {
|
||||||
|
require("./firstmsg")()
|
||||||
|
require("./verifyBars")()
|
||||||
|
|
||||||
|
//accepted
|
||||||
|
require("./accepted/closing")()
|
||||||
|
require("./accepted/reopening")()
|
||||||
|
require("./accepted/deleting")()
|
||||||
|
require("./accepted/closingReason")()
|
||||||
|
require("./accepted/claiming")()
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const storage = bot.storage
|
||||||
|
const hiddendata = bot.hiddenData
|
||||||
|
const embed = discord.EmbedBuilder
|
||||||
|
const mc = config.color
|
||||||
|
|
||||||
|
const button = discord.ButtonBuilder
|
||||||
|
const arb = discord.ActionRowBuilder
|
||||||
|
const bs = discord.ButtonStyle
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
//CLOSE
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTcloseTicket") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
interaction.message.edit({components:[bot.buttons.verifybars.closeVerifyBar]})
|
||||||
|
|
||||||
|
})
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTcloseTicketFalse") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
|
||||||
|
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
|
||||||
|
const claimdata = storage.get("claimData",interaction.channel.id)
|
||||||
|
if (claimdata && claimdata != "false"){
|
||||||
|
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim]})
|
||||||
|
}else{
|
||||||
|
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal]})
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//DELETE
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTdeleteTicket") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
interaction.message.edit({components:[bot.buttons.verifybars.deleteVerifyBar]})
|
||||||
|
|
||||||
|
})
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTdeleteTicketFalse") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
|
||||||
|
if (interaction.message.pinned && interaction.message.author.id == client.user.id){
|
||||||
|
const claimdata = storage.get("claimData",interaction.channel.id)
|
||||||
|
if (claimdata && claimdata != "false"){
|
||||||
|
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormalNoClaim]})
|
||||||
|
}else{
|
||||||
|
interaction.message.edit({components:[bot.buttons.firstmsg.firstmsgRowNormal]})
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
interaction.message.edit({components:[bot.buttons.close.openRowNormal]})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//DELETE NO TRANSCRIPT
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTdeleteTicket1") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
interaction.message.edit({components:[bot.buttons.verifybars.delete1VerifyBar]})
|
||||||
|
|
||||||
|
})
|
||||||
|
client.on("interactionCreate",async interaction => {
|
||||||
|
if (!interaction.isButton()) return
|
||||||
|
if (interaction.customId != "OTdeleteTicketFalse1") return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
interaction.message.edit({components:[bot.buttons.close.closeCommandRow]})
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
const index = require("../index")
|
||||||
|
|
||||||
|
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 errorLog = async () => {
|
||||||
|
const chalk = await (await import("chalk")).default
|
||||||
|
|
||||||
|
require("./startscreen").headerDataLanguage("Something went wrong when loading the language!",true)
|
||||||
|
}
|
||||||
|
|
||||||
|
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){
|
||||||
|
const runError = async () => {
|
||||||
|
await errorLog()
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
runError()
|
||||||
|
}else{
|
||||||
|
exports.language = localLanguage
|
||||||
|
successLog(config.languageFile)
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
██████╗ ██████╗ ███████╗███╗ ██╗ ████████╗██╗ ██████╗██╗ ██╗███████╗████████╗
|
||||||
|
██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ╚══██╔══╝██║██╔════╝██║ ██╔╝██╔════╝╚══██╔══╝
|
||||||
|
██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ ██║██║ █████╔╝ █████╗ ██║
|
||||||
|
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
|
||||||
|
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
|
||||||
|
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
|
||||||
@@ -0,0 +1,104 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const storage = bot.storage
|
||||||
|
|
||||||
|
const APIEvents = require("./api/modules/events")
|
||||||
|
|
||||||
|
module.exports = async () => {
|
||||||
|
const chalk = await (await import("chalk")).default
|
||||||
|
|
||||||
|
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
|
||||||
|
if (!optionidRaw.includes("newR")) return
|
||||||
|
const optionid = optionidRaw.split("newR")[1]
|
||||||
|
if (!optionid){
|
||||||
|
interaction.reply({embeds:[bot.errorLog.serverError(l.errors.roleDoesntExist)]})
|
||||||
|
return
|
||||||
|
}else{
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
const option = require("./utils/getButton").getOption(optionid)
|
||||||
|
/**@type {"add"|"remove"|"add&remove"} */
|
||||||
|
const mode = option.mode
|
||||||
|
const user = interaction.member
|
||||||
|
|
||||||
|
if (mode == "add"){
|
||||||
|
bot.actionRecorder.push({
|
||||||
|
category:"ot.managers.reactionroles",
|
||||||
|
file:"./core/reactionRoles.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"reactionRoles.type.add"
|
||||||
|
})
|
||||||
|
option.roles.forEach((role) => {
|
||||||
|
interaction.guild.members.cache.find(u => u.id == user.id).roles.add(role)
|
||||||
|
|
||||||
|
log("system","added role (reaction roles)",[{key:"user",value:interaction.user.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.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.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.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())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch{
|
||||||
|
interaction.channel.send({embeds:[bot.errorLog.serverError(l.errors.somethingWentWrong)]})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
const discord = require("discord.js")
|
||||||
|
const bot = require("../../index")
|
||||||
|
const client = require("../../index").client
|
||||||
|
const config = bot.config
|
||||||
|
const configParser = require("../utils/configParser")
|
||||||
|
|
||||||
|
const act = discord.ApplicationCommandType
|
||||||
|
const acot = discord.ApplicationCommandOptionType
|
||||||
|
|
||||||
|
module.exports = async () => {
|
||||||
|
const sid = config.serverId
|
||||||
|
|
||||||
|
const ids = configParser.getTicketValuesArray("id")
|
||||||
|
/**@type {[{name:String,value:String}]} */
|
||||||
|
var choices = []
|
||||||
|
ids.forEach((id) => {
|
||||||
|
const option = configParser.getTicketById(id)
|
||||||
|
if (option){
|
||||||
|
choices.push({name:option.name,value:option.id})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/**@type {[{name:String,value:String}]} */
|
||||||
|
var msgchoices = []
|
||||||
|
config.messages.forEach((msg) => {
|
||||||
|
msgchoices.push({name:msg.id,value:msg.id})
|
||||||
|
})
|
||||||
|
|
||||||
|
//slashtranslation
|
||||||
|
const ST = require("../../language/slashcmds/slash.json").data
|
||||||
|
|
||||||
|
//create a ticket (/new or /ticket)
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"ticket",
|
||||||
|
description:"Create a ticket!",
|
||||||
|
descriptionLocalizations:ST.newticket,
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"type",
|
||||||
|
description:"The type of ticket.",
|
||||||
|
required:true,
|
||||||
|
choices:choices
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid)
|
||||||
|
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"new",
|
||||||
|
description:"Create a ticket!",
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput,
|
||||||
|
descriptionLocalizations:ST.newticket,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"type",
|
||||||
|
description:"The type of ticket.",
|
||||||
|
required:true,
|
||||||
|
choices:choices
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid)
|
||||||
|
|
||||||
|
//msg
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"message",
|
||||||
|
description:"Create a ticket message.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.message,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"id",
|
||||||
|
description:"The message id.",
|
||||||
|
required:true,
|
||||||
|
choices:msgchoices,
|
||||||
|
max_length:30
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid)
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
const discord = require("discord.js")
|
||||||
|
const bot = require("../../index")
|
||||||
|
const client = require("../../index").client
|
||||||
|
const config = bot.config
|
||||||
|
|
||||||
|
module.exports = async () => {
|
||||||
|
const chalk = (await import("chalk")).default
|
||||||
|
|
||||||
|
console.log(chalk.red("\nINSTRUCTIONS:\n\n1: Run the command you want to delete in discord.\n2: You get the message 'This command is now deleted!'\n3: There is also a message in the console that says the command is deleted.\n4: reload your discord."))
|
||||||
|
client.on("interactionCreate",(interaction) => {
|
||||||
|
if (!interaction.isChatInputCommand()) return console.log("this isn't a command!")
|
||||||
|
|
||||||
|
interaction.reply({content:"This command is now deleted!"})
|
||||||
|
|
||||||
|
try {
|
||||||
|
client.application.commands.delete(interaction.commandId,interaction.guild.id).then(() => {
|
||||||
|
console.log("deleted the command",chalk.blue(interaction.commandName),"(id:",interaction.commandId+")")
|
||||||
|
})
|
||||||
|
}catch{
|
||||||
|
console.log(chalk.red("something went wrong by the deleting of this command!"))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,271 @@
|
|||||||
|
const discord = require("discord.js")
|
||||||
|
const bot = require("../../index")
|
||||||
|
const client = require("../../index").client
|
||||||
|
const config = bot.config
|
||||||
|
const configParser = require("../utils/configParser")
|
||||||
|
|
||||||
|
const act = discord.ApplicationCommandType
|
||||||
|
const acot = discord.ApplicationCommandOptionType
|
||||||
|
|
||||||
|
/**@param {Boolean|undefined} invisible*/
|
||||||
|
module.exports = async (invisible) => {
|
||||||
|
const chalk = (await import("chalk")).default
|
||||||
|
const sid = config.serverId
|
||||||
|
|
||||||
|
const ids = configParser.getTicketValuesArray("id")
|
||||||
|
/**@type {[{name:String,value:String}]} */
|
||||||
|
var choices = []
|
||||||
|
ids.forEach((id) => {
|
||||||
|
const option = configParser.getTicketById(id)
|
||||||
|
if (option){
|
||||||
|
choices.push({name:option.name,value:option.id})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/**@type {[{name:String,value:String}]} */
|
||||||
|
var msgchoices = []
|
||||||
|
config.messages.forEach((msg) => {
|
||||||
|
msgchoices.push({name:msg.id,value:msg.id})
|
||||||
|
})
|
||||||
|
|
||||||
|
var readystats = 0
|
||||||
|
|
||||||
|
//process.stdout.write("[status] there are "+chalk.blue("0 out of 10")+" commands ready! (this can take up to 40 seconds)")
|
||||||
|
if (!invisible){
|
||||||
|
setInterval(() => {
|
||||||
|
if (process.stdout && process.stdout.cursorTo) 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){
|
||||||
|
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
|
||||||
|
|
||||||
|
//create a ticket (/new or /ticket)
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"ticket",
|
||||||
|
description:"Create a ticket!",
|
||||||
|
descriptionLocalizations:ST.newticket,
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"type",
|
||||||
|
description:"The type of ticket.",
|
||||||
|
required:true,
|
||||||
|
choices:choices
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"new",
|
||||||
|
description:"Create a ticket!",
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput,
|
||||||
|
descriptionLocalizations:ST.newticket,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"type",
|
||||||
|
description:"The type of ticket.",
|
||||||
|
required:true,
|
||||||
|
choices:choices
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//help
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"help",
|
||||||
|
description:"View the available commands.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.help,
|
||||||
|
type:act.ChatInput
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
//close
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"close",
|
||||||
|
description:"Close the current ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.close,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[{
|
||||||
|
name:"reason",
|
||||||
|
type:discord.ApplicationCommandOptionType.String,
|
||||||
|
required:false,
|
||||||
|
description:"The reason to close this ticket.",
|
||||||
|
maxLength:100
|
||||||
|
}]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//delete
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"delete",
|
||||||
|
description:"Delete the current ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.delete,
|
||||||
|
type:act.ChatInput
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//msg
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"message",
|
||||||
|
description:"Create a ticket message.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.message,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"id",
|
||||||
|
description:"The message id.",
|
||||||
|
required:true,
|
||||||
|
choices:msgchoices,
|
||||||
|
max_length:30
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//add
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"add",
|
||||||
|
description:"Add people to this ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.add,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.User,
|
||||||
|
name:"user",
|
||||||
|
description:"The user to add.",
|
||||||
|
required:true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//remove
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"remove",
|
||||||
|
description:"Remove people from this ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.remove,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.User,
|
||||||
|
name:"user",
|
||||||
|
description:"The user to remove.",
|
||||||
|
required:true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//rename
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"rename",
|
||||||
|
description:"Rename this ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.rename,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"name",
|
||||||
|
description:"The new name (without prefix).",
|
||||||
|
required:true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//reopen
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"reopen",
|
||||||
|
description:"Reopen this ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
descriptionLocalizations:ST.reopen,
|
||||||
|
type:act.ChatInput
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//claim
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"claim",
|
||||||
|
description:"Claim this ticket / claim it for someone else.",
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
name:"user",
|
||||||
|
type:acot.User,
|
||||||
|
required:false,
|
||||||
|
description:"The user to claim for."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//unclaim
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"unclaim",
|
||||||
|
description:"Unclaim this ticket.",
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
//category
|
||||||
|
client.application.commands.create({
|
||||||
|
name:"change",
|
||||||
|
description:"Change ticket type.",
|
||||||
|
defaultPermission:true,
|
||||||
|
type:act.ChatInput,
|
||||||
|
options:[
|
||||||
|
{
|
||||||
|
type:acot.String,
|
||||||
|
name:"type",
|
||||||
|
description:"The new ticket type.",
|
||||||
|
required:true,
|
||||||
|
choices:choices
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},sid).then(() => {
|
||||||
|
readystats++
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
|
||||||
|
const logo = require("fs").readFileSync("./core/logo.txt").toString()
|
||||||
|
|
||||||
|
/**@param {import('chalk').ChalkInstance} chalk */
|
||||||
|
const showFlags = async (chalk) => {
|
||||||
|
var isFlag = false
|
||||||
|
if (process.argv.some((v) => v == "--devconfig")) console.log(chalk.blue("[FLAGS] => used dev config instead of normal config")); isFlag = true
|
||||||
|
if (process.argv.some((v) => v == "--nochecker")) console.log(chalk.blue("[FLAGS] => disabled checker.js")); isFlag = true
|
||||||
|
if (process.argv.some((v) => v == "--tsoffline")) console.log(chalk.blue("[FLAGS] => offline check for html transcripts disabled!")); isFlag = true
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log(chalk.blue("[FLAGS] => enabled DEBUG mode")); isFlag = true
|
||||||
|
if (process.argv.some((v) => v == "--noslash")) console.log(chalk.blue("[FLAGS] => slash commands disabled")); isFlag = true
|
||||||
|
if (process.argv.some((v) => v == "--localstatus")) console.log(chalk.blue("[FLAGS] => using local livestatus.json")); isFlag = true
|
||||||
|
if (process.argv.some((v) => v == "--noerrorupload")) console.log(chalk.blue("[FLAGS] => not uploading errors to liveStatus")); isFlag = true
|
||||||
|
|
||||||
|
if (!isFlag) console.log(chalk.blue("no flags!"))
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.run = async () => {
|
||||||
|
const chalk = await (await import("chalk")).default
|
||||||
|
console.log(chalk.hex("f8ba00")(logo))
|
||||||
|
const version = require("../package.json").version
|
||||||
|
var headertext = "v"+version+" - Support: https://discord.dj-dj.be - Language: "+config.languageFile
|
||||||
|
const spaceamount = (84-headertext.length)/2
|
||||||
|
var i = 0
|
||||||
|
while (i < spaceamount){
|
||||||
|
headertext = " "+headertext
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
console.log(chalk.bold(headertext+"\n"))
|
||||||
|
console.log(chalk.bold(chalk.underline("FLAGS:")))
|
||||||
|
showFlags(chalk)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {import('chalk').ChalkInstance} chalk
|
||||||
|
* @param {{type:String,text:String,enabled:Boolean}} status
|
||||||
|
* @param {Boolean} updatingslash
|
||||||
|
* @param {Boolean} slashmode
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
exports.headerDataReady = (chalk,status,updatingslash,slashmode) => {
|
||||||
|
console.log("\n"+chalk.bold(chalk.underline("STARTUP INFO:")))
|
||||||
|
if (status.enabled) console.log(chalk.hex("f8ba00")("status: ")+chalk.bold(status.type.toLowerCase())+" "+status.text)
|
||||||
|
if (slashmode){
|
||||||
|
console.log("\n\n"+chalk.red(chalk.underline("STARTING IN SLASH CMD CONFIGURATION MODE!")))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log(chalk.hex("f8ba00")("updating slash cmds: ")+chalk.bold(updatingslash))
|
||||||
|
}
|
||||||
|
|
||||||
|
var languageMSG = ""
|
||||||
|
var languageErr = false
|
||||||
|
/**
|
||||||
|
* @param {String} message
|
||||||
|
* @param {Boolean} err
|
||||||
|
*/
|
||||||
|
exports.headerDataLanguage = async (message,err) => {
|
||||||
|
languageMSG = message
|
||||||
|
languageErr = err
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {{total:Number,error:Number,success:Number}} plugins*/
|
||||||
|
exports.headerDataPlugins = async (plugins) => {
|
||||||
|
const chalk = await (await import("chalk")).default
|
||||||
|
const lmsg = languageErr ? chalk.red(languageMSG) : languageMSG
|
||||||
|
console.log(chalk.hex("f8ba00")("language: ")+lmsg)
|
||||||
|
console.log(chalk.hex("f8ba00")("plugins loaded: ")+chalk.bold(plugins.total+" total ")+"("+plugins.success+"✅ "+plugins.error+"❌)")
|
||||||
|
|
||||||
|
console.log("\n"+chalk.bold(chalk.underline("LIVESTATUS:")))
|
||||||
|
await require("./utils/liveStatus").run(plugins)
|
||||||
|
|
||||||
|
console.log("\n"+chalk.bold(chalk.underline("LOGS:")))
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
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)
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
Executable
+234
@@ -0,0 +1,234 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const storage = bot.storage
|
||||||
|
const permsChecker = require("../utils/permisssionChecker")
|
||||||
|
|
||||||
|
const pendingDelete = []
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.GuildMember} member
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {String} prefix
|
||||||
|
* @param {"delete"|"close"|"deletenotranscript"} mode
|
||||||
|
* @param {Boolean} nomessage
|
||||||
|
* @param {String} reason only when closing, not when deleting!
|
||||||
|
*/
|
||||||
|
exports.closeManager = async (member,channel,prefix,mode,reason,nomessage) => {
|
||||||
|
const guild = channel.guild
|
||||||
|
const user = member.user
|
||||||
|
const chalk = await (await import("chalk")).default
|
||||||
|
|
||||||
|
const newReason = reason ? reason : l.messages.none
|
||||||
|
|
||||||
|
//start code
|
||||||
|
|
||||||
|
//FIX CHANNEL COULD BE CLOSED AFTER DELETE:
|
||||||
|
if (pendingDelete.includes(channel.id)) return false
|
||||||
|
|
||||||
|
/**@type {String}*/
|
||||||
|
const channelname = channel.name
|
||||||
|
const ticketOpenerChannelName = channelname.split(prefix)[1]
|
||||||
|
|
||||||
|
//get user that opened the ticket
|
||||||
|
var getuserID = storage.get("userFromChannel",channel.id)
|
||||||
|
try {
|
||||||
|
var ticketOpener = client.users.cache.find(u => u.id === getuserID)
|
||||||
|
var isDatabaseError = false
|
||||||
|
}catch{var isDatabaseError = true}
|
||||||
|
|
||||||
|
if (!ticketOpener){
|
||||||
|
console.log(chalk.red("[database error]"),"something went wrong when getting the data in the database.\nNo panic, this error fixes itself!")
|
||||||
|
var isDatabaseError = true
|
||||||
|
}
|
||||||
|
|
||||||
|
var enableTranscript = true
|
||||||
|
var deleteRequired = false
|
||||||
|
|
||||||
|
if (mode == "delete" || mode == "deletenotranscript"){
|
||||||
|
//delete
|
||||||
|
//check perms
|
||||||
|
if (!guild) return
|
||||||
|
if (!permsChecker.command(user.id,guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//start delete proccess
|
||||||
|
deleteRequired = true
|
||||||
|
if (!nomessage){
|
||||||
|
await channel.send({content:"**"+l.messages.gettingdeleted+"**"})
|
||||||
|
}
|
||||||
|
log("system","deleted a ticket",[{key:"user",value:user.username},{key:"ticket",value:channel.name}])
|
||||||
|
pendingDelete.push(channel.id)
|
||||||
|
|
||||||
|
if (!isDatabaseError) storage.set("amountOfUserTickets",getuserID,Number(storage.get("amountOfUserTickets",getuserID)) - 1)
|
||||||
|
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
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
require("../api/modules/events").onTicketDelete(user,channel,guild,new Date(),{name:channel.name,status:"deleted",ticketOptions:ticketData})
|
||||||
|
|
||||||
|
hiddendata.push({key:"pendingdelete",value:"true"})
|
||||||
|
bot.hiddenData.writeHiddenData(channel.id,hiddendata)
|
||||||
|
|
||||||
|
}else if (mode == "close"){
|
||||||
|
//close
|
||||||
|
//check perms
|
||||||
|
if (config.system.closeMode == "adminonly"){
|
||||||
|
if (!guild) return
|
||||||
|
if (!permsChecker.command(user.id,guild.id)){
|
||||||
|
permsChecker.sendUserNoPerms(user)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//set new permissions
|
||||||
|
var permissionArray = []
|
||||||
|
const pfb = discord.PermissionFlagsBits
|
||||||
|
|
||||||
|
if (!isDatabaseError) permissionArray.push({
|
||||||
|
id:ticketOpener,
|
||||||
|
type:"member",
|
||||||
|
allow:[pfb.ViewChannel],
|
||||||
|
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages]
|
||||||
|
})
|
||||||
|
|
||||||
|
permissionArray.push({
|
||||||
|
id:guild.roles.everyone,
|
||||||
|
type:"role",
|
||||||
|
deny:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
||||||
|
})
|
||||||
|
|
||||||
|
//add main adminroles
|
||||||
|
config.adminRoles.forEach((role,index) => {
|
||||||
|
try {
|
||||||
|
const adminrole = guild.roles.cache.find(r => r.id == role)
|
||||||
|
if (!adminrole) return
|
||||||
|
|
||||||
|
permissionArray.push({
|
||||||
|
id:adminrole,
|
||||||
|
type:"role",
|
||||||
|
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
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
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!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ticketData.adminroles.forEach((role,index) => {
|
||||||
|
if (!config.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,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
}catch{
|
||||||
|
log("system","invalid role! At 'config.json => options/ticket/...:"+index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
channel.permissionOverwrites.set(permissionArray)
|
||||||
|
|
||||||
|
if (!nomessage){
|
||||||
|
//message
|
||||||
|
const embed = new discord.EmbedBuilder()
|
||||||
|
.setColor(config.color)
|
||||||
|
.setTitle(":lock: "+l.commands.closeTitle+" :lock:")
|
||||||
|
.setDescription(l.messages.closedDescription)
|
||||||
|
channel.send({embeds:[embed],components:[bot.buttons.close.closeCommandRow]})
|
||||||
|
}
|
||||||
|
|
||||||
|
log("system","closed a ticket",[{key:"user",value:user.username},{key:"ticket",value:channel.name}])
|
||||||
|
|
||||||
|
|
||||||
|
//send api event
|
||||||
|
require("../api/modules/events").onTicketClose(user,channel,guild,new Date(),{name:channel.name,status:"closed",ticketOptions:ticketData},newReason)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {Number} limit
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const transcriptHandler = async () => {
|
||||||
|
if (!bot.tsconfig.sendTranscripts.enableChannel && !bot.tsconfig.sendTranscripts.enableDM) return false
|
||||||
|
|
||||||
|
const APIEvents = require("../api/modules/events")
|
||||||
|
const messages = await getmessages(channel,5000)
|
||||||
|
await require("../transcriptSystem/manager")(messages,guild,channel,user,reason)
|
||||||
|
APIEvents.onTranscriptCreation(messages,channel,guild,new Date())
|
||||||
|
}
|
||||||
|
const deleteHandler = async () => {
|
||||||
|
if (deleteRequired){
|
||||||
|
pendingDelete.shift()
|
||||||
|
//delete HIDDENDATA
|
||||||
|
storage.delete("HIDDENDATA",channel.id)
|
||||||
|
|
||||||
|
await channel.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (mode == "delete" || mode == "deletenotranscript") await transcriptHandler()
|
||||||
|
deleteHandler()
|
||||||
|
}
|
||||||
Executable
+253
@@ -0,0 +1,253 @@
|
|||||||
|
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 configParser = require("../utils/configParser")
|
||||||
|
const storage = bot.storage
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
//dropdown placeholder
|
||||||
|
client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (!interaction.isStringSelectMenu()) return
|
||||||
|
if (interaction.customId != "OTdropdownMenu") return
|
||||||
|
if (interaction.values.includes("OTChooseTicket")){
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
var closeButton = bot.buttons.firstmsg.firstmsgRowNormal
|
||||||
|
|
||||||
|
//ticket button click / create ticket
|
||||||
|
client.on("interactionCreate",async (interaction) => {
|
||||||
|
if (interaction.isChatInputCommand() && (interaction.commandName == "new" || interaction.commandName == "ticket")){
|
||||||
|
var customId = "OTnewT"+interaction.options.getString("type")
|
||||||
|
}else if (interaction.isButton()){
|
||||||
|
var customId = interaction.customId
|
||||||
|
}else if (interaction.isStringSelectMenu() && (interaction.customId == "OTdropdownMenu")){
|
||||||
|
var customId = interaction.values[0]
|
||||||
|
|
||||||
|
}else return
|
||||||
|
|
||||||
|
if (interaction.isButton()){
|
||||||
|
if (interaction.customId.startsWith("OTnewT")){
|
||||||
|
const optionid = interaction.customId.split("OTnewT")[1]
|
||||||
|
if (!optionid){
|
||||||
|
await interaction.reply({embeds:[bot.errorLog.serverError(l.errors.ticketDoesntExist)]})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (configParser.getTicketValuesArray("id").includes(customId)){
|
||||||
|
|
||||||
|
//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 {
|
||||||
|
await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
|
||||||
|
} catch{}
|
||||||
|
}else if (interaction.isChatInputCommand()){
|
||||||
|
try {
|
||||||
|
await interaction.deferReply({ephemeral:config.system.answerInEphemeralOnOpen})
|
||||||
|
} catch{}
|
||||||
|
}else if (interaction.isStringSelectMenu()){
|
||||||
|
try {
|
||||||
|
await interaction.deferUpdate()
|
||||||
|
} catch{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (storage.get("amountOfUserTickets",interaction.member.id) == null || storage.get("amountOfUserTickets",interaction.member.id) == "false"|| Number(storage.get("amountOfUserTickets",interaction.member.id)) < config.system.maxAmountOfTickets){
|
||||||
|
|
||||||
|
//update storage
|
||||||
|
storage.set("amountOfUserTickets",interaction.member.id,Number(storage.get("amountOfUserTickets",interaction.member.id))+1)
|
||||||
|
var ticketNumber = interaction.member.user.username
|
||||||
|
|
||||||
|
//set ticketName
|
||||||
|
var ticketName = currentTicketOptions.channelprefix+ticketNumber
|
||||||
|
var logsname = currentTicketOptions.name
|
||||||
|
|
||||||
|
//category
|
||||||
|
if (currentTicketOptions.category.length < 16 || currentTicketOptions.category.length > 20){
|
||||||
|
var newTicketCategory = null
|
||||||
|
}else{
|
||||||
|
var newTicketCategory = currentTicketOptions.category
|
||||||
|
}
|
||||||
|
|
||||||
|
var permissionsArray = []
|
||||||
|
const pfb = discord.PermissionFlagsBits
|
||||||
|
const guild = client.guilds.cache.find(g => g.id == interaction.guild.id)
|
||||||
|
|
||||||
|
//set @everyone no ticket access
|
||||||
|
permissionsArray.push({
|
||||||
|
id:interaction.guild.roles.everyone,
|
||||||
|
type:"role",
|
||||||
|
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]
|
||||||
|
})
|
||||||
|
|
||||||
|
//add main adminroles
|
||||||
|
config.adminRoles.forEach((role,index) => {
|
||||||
|
try {
|
||||||
|
const adminrole = guild.roles.cache.find(r => r.id == role)
|
||||||
|
if (!adminrole) return
|
||||||
|
|
||||||
|
permissionsArray.push({
|
||||||
|
id:adminrole,
|
||||||
|
type:"role",
|
||||||
|
allow:[pfb.AddReactions,pfb.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
||||||
|
})
|
||||||
|
}catch{}
|
||||||
|
})
|
||||||
|
|
||||||
|
//add ticket adminroles
|
||||||
|
/**
|
||||||
|
* @type {String[]}
|
||||||
|
*/
|
||||||
|
const ticketadmin = currentTicketOptions.adminroles
|
||||||
|
ticketadmin.forEach((role,index) => {
|
||||||
|
if (!config.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.AttachFiles,pfb.EmbedLinks,pfb.SendMessages,pfb.ViewChannel]
|
||||||
|
})
|
||||||
|
}catch{}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//add ticket adminroles
|
||||||
|
if (currentTicketOptions.readonlyAdminroles){
|
||||||
|
currentTicketOptions.readonlyAdminroles.forEach((role,index) => {
|
||||||
|
if (!config.adminRoles.includes(role) && !currentTicketOptions.adminroles.includes(role)){
|
||||||
|
try {
|
||||||
|
const adminrole = guild.roles.cache.find(r => r.id == role)
|
||||||
|
if (!adminrole) return
|
||||||
|
|
||||||
|
permissionsArray.push({
|
||||||
|
id:adminrole,
|
||||||
|
type:"role",
|
||||||
|
allow:[pfb.AddReactions,pfb.ViewChannel],
|
||||||
|
deny:[pfb.SendMessages,pfb.AttachFiles,pfb.EmbedLinks]
|
||||||
|
})
|
||||||
|
}catch{}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//add member role
|
||||||
|
if (config.system.memberRole && ![" ","0","false","null","undefined"].includes(config.system.memberRole)){
|
||||||
|
try {
|
||||||
|
const userrole = guild.roles.cache.find(r => r.id == config.system.memberRole)
|
||||||
|
if (userrole){
|
||||||
|
permissionsArray.push({
|
||||||
|
id:userrole,
|
||||||
|
type:"role",
|
||||||
|
deny:[pfb.ViewChannel]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}catch{}
|
||||||
|
}
|
||||||
|
|
||||||
|
//create the channel
|
||||||
|
interaction.guild.channels.create({
|
||||||
|
name:ticketName,
|
||||||
|
type:discord.ChannelType.GuildText,
|
||||||
|
parent:newTicketCategory,
|
||||||
|
reason:"A new ticket is created",
|
||||||
|
permissionOverwrites:permissionsArray
|
||||||
|
|
||||||
|
}).then((ticketChannel) => {
|
||||||
|
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()}])
|
||||||
|
|
||||||
|
var ticketEmbed = new discord.EmbedBuilder()
|
||||||
|
//.setAuthor({name:interaction.user.id})
|
||||||
|
.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)
|
||||||
|
}
|
||||||
|
|
||||||
|
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+">"+herePing+everyonePing+customPing,
|
||||||
|
embeds:[ticketEmbed],
|
||||||
|
components:[closeButton]
|
||||||
|
|
||||||
|
}).then(firstmsg => {
|
||||||
|
firstmsg.pin()
|
||||||
|
})
|
||||||
|
|
||||||
|
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})
|
||||||
|
|
||||||
|
const channelbutton = new discord.ActionRowBuilder()
|
||||||
|
.addComponents([
|
||||||
|
new discord.ButtonBuilder()
|
||||||
|
.setStyle(discord.ButtonStyle.Link)
|
||||||
|
.setDisabled(false)
|
||||||
|
.setEmoji("🎫")
|
||||||
|
.setLabel(l.commands.goToTicket)
|
||||||
|
.setURL(ticketChannel.url)
|
||||||
|
])
|
||||||
|
|
||||||
|
try{
|
||||||
|
if (currentTicketOptions.enableDmOnOpen) interaction.member.send({embeds:[bot.errorLog.custom(l.messages.newTicketDmTitle,currentTicketOptions.message,":ticket:",config.color)],components:[channelbutton]})
|
||||||
|
}
|
||||||
|
catch{log("system","failed to send DM")}
|
||||||
|
|
||||||
|
if ((interaction.isButton() && config.system.answerInEphemeralOnOpen) || interaction.isChatInputCommand()){
|
||||||
|
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{
|
||||||
|
try {
|
||||||
|
if (config.system.dmMessages){
|
||||||
|
interaction.member.send({embeds:[bot.errorLog.warning(l.errors.maxAmountTitle,l.errors.maxAmountDescription)]})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch{log("system","can't send DM to member, member doesn't allow dm's")}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
Executable
+54
@@ -0,0 +1,54 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const storage = bot.storage
|
||||||
|
const pfb = discord.PermissionFlagsBits
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {discord.TextBasedChannel} channel
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const reopenTicket = (guild,channel,user) => {
|
||||||
|
log("system","re-opened a ticket",[{key:"ticket",value:channel.name},{key:"user",value:user.username}])
|
||||||
|
|
||||||
|
var permissionsArray = []
|
||||||
|
|
||||||
|
//set @everyone no ticket access
|
||||||
|
permissionsArray.push({
|
||||||
|
id:guild.roles.everyone,
|
||||||
|
type:"role",
|
||||||
|
allow:[],
|
||||||
|
deny:[pfb.ViewChannel]
|
||||||
|
})
|
||||||
|
|
||||||
|
channel.permissionOverwrites.cache.forEach((p) => {
|
||||||
|
if (p.type == 1){
|
||||||
|
permissionsArray.push({
|
||||||
|
id:p.id,
|
||||||
|
type:"member",
|
||||||
|
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})
|
||||||
|
}
|
||||||
|
exports.reopenTicket = reopenTicket
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
|
||||||
|
const bot = require("../../../index")
|
||||||
|
const tsconfig = bot.tsconfig
|
||||||
|
const tsembeds = require("../embeds")
|
||||||
|
const tsdb = require("../tsdb")
|
||||||
|
|
||||||
|
const otversion = require("../../../package.json").version
|
||||||
|
const version = require("../info.json").version
|
||||||
|
|
||||||
|
/**@typedef {{style:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String, titleColor:String}, bot:{name:String, id:Number, pfp:String}, ticket:{creatorname:String, creatorid:Number, closedtime:Number, openedtime:Number}}} OThtsDataOption */
|
||||||
|
|
||||||
|
|
||||||
|
/**==========================================================
|
||||||
|
=============================================================
|
||||||
|
================THIS FILE ISN'T USED ANYMORE!!===============
|
||||||
|
This file is for html transcripts V1!
|
||||||
|
Visit compileJsonV2.js for the current version!
|
||||||
|
=============================================================
|
||||||
|
===========================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {discord.Channel} channel
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.Message[]} messagesInv
|
||||||
|
* @param {OThtsDataOption} data
|
||||||
|
*/
|
||||||
|
exports.compile = (guild,channel,user,messagesInv,data) => {
|
||||||
|
const messages = messagesInv.reverse()
|
||||||
|
var invisibleMessages = 0
|
||||||
|
|
||||||
|
const rawfiles = messages.filter((m) => Array.from(m.attachments).length > 0)
|
||||||
|
var fileAmount = 0
|
||||||
|
rawfiles.forEach((msg) => {
|
||||||
|
fileAmount = fileAmount + Array.from(msg.attachments).length
|
||||||
|
})
|
||||||
|
|
||||||
|
const messagesArray = []
|
||||||
|
messages.forEach((msg) => {
|
||||||
|
if (msg.content || msg.embeds.length > 0 || msg.attachments.toJSON().length > 0){
|
||||||
|
|
||||||
|
const embedArray = []
|
||||||
|
const fileArray = []
|
||||||
|
|
||||||
|
msg.attachments.forEach((file) => {
|
||||||
|
fileArray.push({
|
||||||
|
name:file.name,
|
||||||
|
type:file.contentType,
|
||||||
|
size:file.size.toString()+" bytes",
|
||||||
|
url:file.url
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
msg.embeds.forEach((embed) => {
|
||||||
|
embedArray.push({
|
||||||
|
title:embed.title || false,
|
||||||
|
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),
|
||||||
|
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)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const memberColor = msg.member ? msg.member.displayHexColor : "#ffffff"
|
||||||
|
messagesArray.push({
|
||||||
|
author:{
|
||||||
|
name:msg.author.username,
|
||||||
|
id:Number(msg.author.id),
|
||||||
|
color:memberColor,
|
||||||
|
pfp:msg.author.displayAvatarURL()
|
||||||
|
},
|
||||||
|
content:msg.content || "",
|
||||||
|
timestamp:msg.createdTimestamp,
|
||||||
|
embeds:embedArray,
|
||||||
|
files:fileArray
|
||||||
|
})
|
||||||
|
}else {invisibleMessages++}
|
||||||
|
})
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
version,otversion,
|
||||||
|
style:{
|
||||||
|
backgroundData:data.style.backgroundData || "",
|
||||||
|
backgroundModus:data.style.backgroundModus || "",
|
||||||
|
enableCustomBackground:data.style.enableCustomBackground || false,
|
||||||
|
titleColor:data.style.titleColor || "#F8BA00"
|
||||||
|
},
|
||||||
|
bot:{
|
||||||
|
name:data.bot.name || "Open Ticket",
|
||||||
|
id:Number(data.bot.id) || 0,
|
||||||
|
pfp:data.bot.pfp || "dj-dj.be/wp-content/uploads/2022/07/profielfoto-blauw-wit.png?size=128"
|
||||||
|
},
|
||||||
|
ticket:{
|
||||||
|
name:channel.name,
|
||||||
|
id:Number(channel.id),
|
||||||
|
|
||||||
|
guildname:guild.name,
|
||||||
|
guildid:Number(guild.id),
|
||||||
|
|
||||||
|
creatorname:data.ticket.creatorname,
|
||||||
|
creatorid:Number(data.ticket.creatorid),
|
||||||
|
closedbyname:user.username,
|
||||||
|
closedbyid:Number(user.id),
|
||||||
|
|
||||||
|
closedtime:data.ticket.closedtime,
|
||||||
|
openedtime:data.ticket.openedtime,
|
||||||
|
|
||||||
|
messages:Array.from(messages).length-invisibleMessages,
|
||||||
|
files:fileAmount
|
||||||
|
},
|
||||||
|
messages:messagesArray
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,394 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
|
||||||
|
const bot = require("../../../index")
|
||||||
|
const tsconfig = bot.tsconfig
|
||||||
|
const tsembeds = require("../embeds")
|
||||||
|
const tsdb = require("../tsdb")
|
||||||
|
|
||||||
|
const otversion = require("../../../package.json").version
|
||||||
|
const version = require("../info.json").version
|
||||||
|
|
||||||
|
const mentions = require("./mentions").replacementions
|
||||||
|
|
||||||
|
/**@typedef {{background:{enableCustomBackground:Boolean, backgroundModus:"color"|"image", backgroundData:String}, header:{enableCustomHeader:Boolean, decoColor:String, backgroundColor:String, textColor:String}, stats:{enableCustomStats:Boolean, backgroundColor:String, keyTextColor:String, valueTextColor:String, hideBackgroundColor:String, hideTextColor:String}} OTTranscriptStyle} */
|
||||||
|
/**@typedef {{name:String, id:String, pfp:String}} OTTranscriptBot */
|
||||||
|
/**@typedef {{name:String, id:String, guildname:String, guildid:String, guildinvite:String|false, creatorname:String, creatorid:String, closedbyname:String, closedbyid:String, claimedname:String, claimedid:String, creatorpfp:String, closedbypfp:String, claimedpfp:String, closedtime:Number, openedtime:Number, components:{messages:1, files:1, embeds:1, reactions:1, interactions:{dropdowns:1, buttons:1, total:1}, attachments:{invites:1, images:1, gifs:1, stickers:1}}, roleColors:[{id:String,color:String}] }} OTTranscriptTicket */
|
||||||
|
/**@typedef {{author:{name:String, id:String, color:String, pfp:String, bot:Boolean, verifiedBot:Boolean, system:Boolean}, content:String|false, timestamp:Number, type:"normal", important:Boolean, edited:Boolean, embeds:[{title:String|false, description:String|false, authorimg:String|false, authortext:String|false, footerimg:String|false, footertext:String|false, color:String, image:String|false, thumbnail:String|false, url:String|false, fields:[{name:String,value:String,inline:Boolean}]}], attachments:[{type:"FILE", name:String, fileType:String, size:String, url:String}, {type:"FILE:image", name:String, fileType:String, size:String, url:String}, {type:"URL:invite", guildId:String, guildName:String, guildSize:Number, guildOnline:Number, image:String, url:String}, {type:"URL:gif", url:String}, {type:"BUILDIN:sticker", name:String, url:String}], components:[{type:"buttons", buttons:[{type:"interaction"|"url", label:String|false, icon:String|false, color:"gray"|"green"|"red"|"blue", id:String|false, url:String|false, disabled:Boolean}]}, {type:"dropdown", placeholder:String|false, options:[{label:String|false, icon:String|false, description:String|false, id:String|false}]}, {type:"reactions", reactions:[{amount:1, emoji:String, type:"svg"|"image"|"gif"}]}], reply:{type:"reply"|"command"|false, user:{name:String, id:String, color:String, pfp:String, bot:Boolean, verifiedBot:Boolean, system:Boolean}, replyOptions:{content:String, messageId:String, channelId:String, guildId:String}, commandOptions:{interactionName:String, interactionId:String}}}} OTTranscriptMessage */
|
||||||
|
/**@typedef {{enabled:Boolean,premiumToken:String, customCredits:{enable:Boolean, replaceText:String, replaceURL:String, enableReportBug:Boolean},customHeaderUrl:{enabled:Boolean, url:String, text:String}, customTranscriptUrl:{enabled:Boolean, name:String}, customFavicon:{enabled:Boolean, image:String},additionalFlags:String[]}} OTTranscriptPremium */
|
||||||
|
|
||||||
|
/**@typedef {{version:"2", otversion:String, language:String, style:OTTranscriptStyle, bot:OTTranscriptBot, ticket:OTTranscriptTicket, messages:OTTranscriptMessage[], premium:OTTranscriptPremium}} OTTranscriptCompileInput */
|
||||||
|
|
||||||
|
/**@typedef {{style:OTTranscriptStyle,bot:OTTranscriptBot,ticket:OTTranscriptTicket,premium:OTTranscriptPremium}} OTHTMLDataOption */
|
||||||
|
|
||||||
|
|
||||||
|
/**@param {discord.ButtonStyle} buttonstyle */
|
||||||
|
const buttonStyleToColor = (buttonstyle) => {
|
||||||
|
if (buttonstyle == discord.ButtonStyle.Primary){
|
||||||
|
return "blue"
|
||||||
|
}else if (buttonstyle == discord.ButtonStyle.Secondary){
|
||||||
|
return "gray"
|
||||||
|
}else if (buttonstyle == discord.ButtonStyle.Danger){
|
||||||
|
return "red"
|
||||||
|
}else if (buttonstyle == discord.ButtonStyle.Success){
|
||||||
|
return "green"
|
||||||
|
}else{
|
||||||
|
return "gray"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {discord.Channel} channel
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {discord.Message[]} messagesInv
|
||||||
|
* @param {OTHTMLDataOption} data
|
||||||
|
*/
|
||||||
|
exports.compile = (guild,channel,user,messagesInv,data) => {
|
||||||
|
const messages = messagesInv.reverse()
|
||||||
|
var invisibleMessages = 0
|
||||||
|
|
||||||
|
//MESSAGE STATS COUNTS
|
||||||
|
var messageAmount = messages.length
|
||||||
|
var fileAmount = 0
|
||||||
|
var embedAmount = 0
|
||||||
|
var reactionsAmount = 0
|
||||||
|
var interactionAmount = 0
|
||||||
|
messages.forEach((msg) => {
|
||||||
|
fileAmount = fileAmount + Array.from(msg.attachments).length
|
||||||
|
embedAmount = embedAmount + msg.embeds.length
|
||||||
|
|
||||||
|
msg.reactions.cache.forEach(reaction => {
|
||||||
|
reactionsAmount = reactionsAmount + reaction.count
|
||||||
|
})
|
||||||
|
if (msg.components && msg.components.length > 0){
|
||||||
|
msg.components.forEach((component) => {
|
||||||
|
if (component.components.length > 0){
|
||||||
|
interactionAmount = interactionAmount + component.components.length
|
||||||
|
}else{
|
||||||
|
interactionAmount = interactionAmount+1
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
/**@type {OTTranscriptMessage[]} */
|
||||||
|
const messagesArray = []
|
||||||
|
messages.forEach((msg) => {
|
||||||
|
if (msg.content || msg.embeds.length > 0 || msg.attachments.toJSON().length > 0 || msg.components.length > 0 || msg.reactions.cache.size > 0){
|
||||||
|
|
||||||
|
const embedArray = []
|
||||||
|
const attachmentArray = []
|
||||||
|
const componentsArray = []
|
||||||
|
|
||||||
|
msg.attachments.forEach((file) => {
|
||||||
|
attachmentArray.push({
|
||||||
|
type:"FILE",
|
||||||
|
name:file.name,
|
||||||
|
fileType:file.contentType,
|
||||||
|
size:Math.round(file.size/1000)+" kb",
|
||||||
|
url:file.url
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
msg.embeds.forEach((embed) => {
|
||||||
|
embedArray.push({
|
||||||
|
title:embed.title || false,
|
||||||
|
description:embed.description ? mentions(embed.description,guild) : false,
|
||||||
|
authorimg:((embed.author && embed.author.iconURL) ? embed.author.iconURL : false),
|
||||||
|
authortext:(embed.author ? embed.author.name : false),
|
||||||
|
footerimg:((embed.footer && embed.footer.iconURL) ? embed.footer.iconURL : false),
|
||||||
|
footertext:(embed.footer ? embed.footer.text : false),
|
||||||
|
color:embed.hexColor,
|
||||||
|
image:((embed.image && embed.image.url) ? embed.image.url : false),
|
||||||
|
thumbnail:((embed.thumbnail && embed.thumbnail.url) ? embed.thumbnail.url : false),
|
||||||
|
url:(embed.url ? embed.url : false),
|
||||||
|
fields:embed.fields
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
const tempreactions = []
|
||||||
|
msg.reactions.cache.forEach((reaction) => {
|
||||||
|
const count = reaction.count
|
||||||
|
const emoji = reaction.emoji
|
||||||
|
|
||||||
|
if (emoji instanceof discord.GuildEmoji){
|
||||||
|
//custom emoji
|
||||||
|
tempreactions.push({
|
||||||
|
amount:count,
|
||||||
|
emoji:(emoji.url) ? emoji.url : "",
|
||||||
|
type:(emoji.animated) ? "gif" : "image"
|
||||||
|
})
|
||||||
|
}else if (emoji instanceof discord.ReactionEmoji){
|
||||||
|
//build-in emoji
|
||||||
|
tempreactions.push({
|
||||||
|
amount:count,
|
||||||
|
emoji:emoji.name,
|
||||||
|
type:"svg"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
componentsArray.push({
|
||||||
|
type: "reactions",
|
||||||
|
reactions:tempreactions
|
||||||
|
})
|
||||||
|
|
||||||
|
msg.components.forEach((actionrow) => {
|
||||||
|
var isdropdown = false
|
||||||
|
var actioncomponents = []
|
||||||
|
actionrow.components.forEach((comp) => {
|
||||||
|
if (comp.type == discord.ComponentType.ActionRow || comp.type == discord.ComponentType.TextInput) return
|
||||||
|
|
||||||
|
/**
|
||||||
|
* type: "buttons";
|
||||||
|
buttons: [{
|
||||||
|
type: "interaction" | "url";
|
||||||
|
label: string | false;
|
||||||
|
icon: string | false;
|
||||||
|
color: "gray" | "green" | "red" | "blue";
|
||||||
|
id: string | false;
|
||||||
|
url: string | false;
|
||||||
|
disabled: boolean;
|
||||||
|
}];
|
||||||
|
}, {
|
||||||
|
type: "dropdown";
|
||||||
|
placeholder: string | false;
|
||||||
|
options: [{
|
||||||
|
label: string | false;
|
||||||
|
icon: string | false;
|
||||||
|
description: string | false;
|
||||||
|
id: string | false;
|
||||||
|
}];
|
||||||
|
},
|
||||||
|
*/
|
||||||
|
if (comp.type == discord.ComponentType.Button){
|
||||||
|
actioncomponents.push({
|
||||||
|
type: (comp.style == discord.ButtonStyle.Link) ? "url" : "interaction",
|
||||||
|
label: (comp.label) ? comp.label : false,
|
||||||
|
icon: (comp.emoji) ? comp.emoji.name : false,
|
||||||
|
color: buttonStyleToColor(comp.style),
|
||||||
|
id: comp.customId ? comp.customId : false,
|
||||||
|
url: (comp.url) ? comp.url : false,
|
||||||
|
disabled: false
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
isdropdown = true
|
||||||
|
var drpdwnoptions = []
|
||||||
|
/**@type {discord.APISelectMenuOption[]} */
|
||||||
|
const dropdownoptions = comp.options
|
||||||
|
dropdownoptions.forEach((opt) => {
|
||||||
|
drpdwnoptions.push({
|
||||||
|
label: opt.label,
|
||||||
|
icon: (opt.emoji) ? opt.emoji : false,
|
||||||
|
description: (opt.description) ? opt.description : false,
|
||||||
|
id: "hello world :)"
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
componentsArray.push({
|
||||||
|
type:"dropdown",
|
||||||
|
placeholder:false,
|
||||||
|
options:drpdwnoptions
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!isdropdown){
|
||||||
|
componentsArray.push({
|
||||||
|
type:"buttons",
|
||||||
|
buttons:actioncomponents
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const important = msg.guild ? (msg.content.includes("<@"+msg.guild.id+">") || msg.content.includes("<@everyone") || msg.content.includes("@here")): false
|
||||||
|
|
||||||
|
const replytype = (msg.interaction) ? "command" : ((msg.reference) ? "reply" : false)
|
||||||
|
if (replytype == "command"){
|
||||||
|
const replycolorRAW = msg.guild.members.cache.find((m) => m.id == msg.interaction.user.id)
|
||||||
|
const replycolor = (replycolorRAW) ? replycolorRAW.displayHexColor.replace("#000000","#ffffff") : "#ffffff"
|
||||||
|
var reply = {
|
||||||
|
type:replytype,
|
||||||
|
commandOptions:{
|
||||||
|
interactionId:msg.interaction.id,
|
||||||
|
interactionName:msg.interaction.commandName
|
||||||
|
},
|
||||||
|
user:{
|
||||||
|
name:msg.interaction.user.username,
|
||||||
|
id:msg.interaction.user.id,
|
||||||
|
color:replycolor,
|
||||||
|
pfp:msg.interaction.user.displayAvatarURL(),
|
||||||
|
bot:msg.interaction.user.bot,
|
||||||
|
system:msg.interaction.user.system,
|
||||||
|
verifiedBot:msg.interaction.user.flags.has(discord.UserFlags.VerifiedBot)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if (replytype == "reply"){
|
||||||
|
|
||||||
|
var replycontentRAW = messages.find((msg2) => msg2.id == msg.reference.messageId)
|
||||||
|
var replycontent = (replycontentRAW && replycontentRAW.content) ? replycontentRAW.content.slice(0,(60-replycontentRAW.author.username.length)) : "deleted this message"
|
||||||
|
const replycolorRAW = (replycontentRAW) ? msg.guild.members.cache.find((m) => m.id == replycontentRAW.author.id) : false
|
||||||
|
const replycolor = (replycolorRAW) ? replycolorRAW.displayHexColor.replace("#000000","#ffffff") : "#ffffff"
|
||||||
|
|
||||||
|
var user = (replycontentRAW && replycontentRAW.content) ? {
|
||||||
|
name:(replycontentRAW) ? replycontentRAW.author.username : "undefined",
|
||||||
|
id:(replycontentRAW) ? replycontentRAW.author.id : "undefined",
|
||||||
|
color:replycolor,
|
||||||
|
pfp:(replycontentRAW) ? replycontentRAW.author.username : "",
|
||||||
|
bot:(replycontentRAW) ? replycontentRAW.author.bot : false,
|
||||||
|
system:(replycontentRAW) ? replycontentRAW.author.system : false,
|
||||||
|
verifiedBot:(replycontentRAW) ? replycontentRAW.author.flags.has(discord.UserFlags.VerifiedBot) : false,
|
||||||
|
} : {
|
||||||
|
name:"someone",
|
||||||
|
id:"undefined",
|
||||||
|
color:"#ffffff",
|
||||||
|
pfp:"https://raw.githubusercontent.com/twitter/twemoji/master/assets/72x72/1f5d1.png",
|
||||||
|
bot:false,
|
||||||
|
system:false,
|
||||||
|
verifiedBot:false,
|
||||||
|
}
|
||||||
|
|
||||||
|
var reply = {
|
||||||
|
type:replytype,
|
||||||
|
replyOptions:{
|
||||||
|
content:replycontent,
|
||||||
|
messageId: msg.reference.messageId,
|
||||||
|
channelId: msg.reference.channelId,
|
||||||
|
guildId: msg.reference.guildId
|
||||||
|
},
|
||||||
|
user:user
|
||||||
|
}
|
||||||
|
}else{var reply = {type:replytype}}
|
||||||
|
|
||||||
|
const authorColor = msg.member ? msg.member.displayHexColor.replace("#000000","#ffffff") : "#ffffff"
|
||||||
|
messagesArray.push({
|
||||||
|
author:{
|
||||||
|
name:msg.author.username,
|
||||||
|
id:msg.author.id,
|
||||||
|
color:authorColor,
|
||||||
|
pfp:msg.author.displayAvatarURL(),
|
||||||
|
bot:msg.author.bot,
|
||||||
|
system:msg.author.system,
|
||||||
|
verifiedBot:msg.author.flags.has(discord.UserFlags.VerifiedBot)
|
||||||
|
},
|
||||||
|
content:mentions(msg.content,guild) || "",
|
||||||
|
timestamp:msg.createdTimestamp,
|
||||||
|
embeds:embedArray,
|
||||||
|
attachments:attachmentArray,
|
||||||
|
edited: (typeof msg.editedTimestamp == "number"),
|
||||||
|
type:"normal",
|
||||||
|
important:important,
|
||||||
|
reply:reply,
|
||||||
|
components:componentsArray
|
||||||
|
})
|
||||||
|
}else {invisibleMessages++}
|
||||||
|
})
|
||||||
|
|
||||||
|
const dsb = data.style.background
|
||||||
|
const dsh = data.style.header
|
||||||
|
const dss = data.style.stats
|
||||||
|
|
||||||
|
/**@type {OTTranscriptCompileInput} */
|
||||||
|
const result = {
|
||||||
|
version,otversion,
|
||||||
|
language:bot.config.languageFile,
|
||||||
|
style:{
|
||||||
|
background:{
|
||||||
|
backgroundData:dsb.backgroundData || "",
|
||||||
|
backgroundModus:dsb.backgroundModus || "",
|
||||||
|
enableCustomBackground:dsb.enableCustomBackground || false,
|
||||||
|
},
|
||||||
|
header:{
|
||||||
|
backgroundColor:dsh.backgroundColor || "#202225",
|
||||||
|
decoColor:dsh.decoColor || "#F8BA00",
|
||||||
|
textColor:dsh.textColor || "#ffffff",
|
||||||
|
enableCustomHeader:dsh.enableCustomHeader || false
|
||||||
|
},
|
||||||
|
stats:{
|
||||||
|
backgroundColor:dss.backgroundColor || "#202225",
|
||||||
|
keyTextColor:dss.keyTextColor || "#737373",
|
||||||
|
valueTextColor:dss.valueTextColor || "#ffffff",
|
||||||
|
hideBackgroundColor:dss.hideBackgroundColor || "#40444a",
|
||||||
|
hideTextColor:dss.hideTextColor || "#ffffff",
|
||||||
|
enableCustomStats:dss.enableCustomStats || false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
bot:{
|
||||||
|
name:data.bot.name || "Open Ticket",
|
||||||
|
id:data.bot.id || 0,
|
||||||
|
pfp:data.bot.pfp || "dj-dj.be/wp-content/uploads/2022/07/profielfoto-blauw-wit.png?size=128"
|
||||||
|
},
|
||||||
|
ticket:{
|
||||||
|
name:channel.name,
|
||||||
|
id:channel.id,
|
||||||
|
|
||||||
|
guildname:guild.name,
|
||||||
|
guildid:guild.id,
|
||||||
|
guildinvite:"",
|
||||||
|
|
||||||
|
creatorname:data.ticket.creatorname,
|
||||||
|
creatorid:data.ticket.creatorid,
|
||||||
|
creatorpfp:data.ticket.creatorpfp,
|
||||||
|
|
||||||
|
closedbyname:user.username,
|
||||||
|
closedbyid:user.id,
|
||||||
|
closedbypfp:user.displayAvatarURL(),
|
||||||
|
|
||||||
|
claimedid:"",
|
||||||
|
claimedname:"",
|
||||||
|
claimedpfp:"",
|
||||||
|
|
||||||
|
closedtime:data.ticket.closedtime,
|
||||||
|
openedtime:data.ticket.openedtime,
|
||||||
|
|
||||||
|
roleColors:[],
|
||||||
|
components:{
|
||||||
|
messages:messageAmount,
|
||||||
|
embeds:embedAmount,
|
||||||
|
files:fileAmount,
|
||||||
|
interactions:{
|
||||||
|
buttons:0,
|
||||||
|
dropdowns:0,
|
||||||
|
total:interactionAmount
|
||||||
|
},
|
||||||
|
reactions:reactionsAmount,
|
||||||
|
attachments:{
|
||||||
|
gifs:0,
|
||||||
|
images:0,
|
||||||
|
stickers:0,
|
||||||
|
invites:0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
messages:messagesArray,
|
||||||
|
premium:{
|
||||||
|
enabled:false,
|
||||||
|
premiumToken:"",
|
||||||
|
|
||||||
|
customCredits:{
|
||||||
|
enable:false,
|
||||||
|
replaceText:"Powered By Open Ticket!",
|
||||||
|
replaceURL:"https://openticket.dj-dj.be",
|
||||||
|
enableReportBug:true
|
||||||
|
},
|
||||||
|
customHeaderUrl:{
|
||||||
|
enabled:false,
|
||||||
|
url:"https://openticket.dj-dj.be",
|
||||||
|
text:"Hello!"
|
||||||
|
},
|
||||||
|
customTranscriptUrl:{
|
||||||
|
enabled:false,
|
||||||
|
name:"test-server"
|
||||||
|
},
|
||||||
|
customFavicon:{
|
||||||
|
enabled:false,
|
||||||
|
image:"https://openticket.dj-dj.be"
|
||||||
|
},
|
||||||
|
additionalFlags:[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
const axios = require("axios").default
|
||||||
|
const discord = require('discord.js')
|
||||||
|
|
||||||
|
const bot = require("../../../index")
|
||||||
|
const tsconfig = bot.tsconfig
|
||||||
|
const tsembeds = require("../embeds")
|
||||||
|
const tsdb = require("../tsdb")
|
||||||
|
|
||||||
|
/**@typedef {{status:"success"|"error", id:String, time:Number, estimated:{lastdump: Number, processtime:Number,waittime:Number}, transcriptstatus:{value:2, data:{fetchedmsgs:true, uploaded:true, inqueue:true, processed:false, waiting:false, available:false}}}} OTuploadResponse */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} json
|
||||||
|
* @returns {Promise<OTuploadResponse|false>}
|
||||||
|
*/
|
||||||
|
exports.upload = async (json) => {
|
||||||
|
return new Promise(async (resolve,reject) => {
|
||||||
|
const data = encodeURIComponent(JSON.stringify(json))
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await axios.post("https://transcripts.dj-dj.be/api/upload?auth=openticketTRANSCRIPT1234&version=2",JSON.stringify(json))
|
||||||
|
if (res.status != 200) resolve(false)
|
||||||
|
|
||||||
|
resolve(res.data)
|
||||||
|
}catch(err){
|
||||||
|
console.log("failed transcript upload!",err.response)
|
||||||
|
resolve(false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
|
||||||
|
const bot = require("../../../index")
|
||||||
|
const tsconfig = bot.tsconfig
|
||||||
|
const tsembeds = require("../embeds")
|
||||||
|
const tsdb = require("../tsdb")
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} text
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
*/
|
||||||
|
exports.replacementions = (text,guild) => {
|
||||||
|
const userregex = /<@([0-9]+)>(\s)?/g
|
||||||
|
const usertext = text.replace(userregex,(x) => {
|
||||||
|
var res = userregex.exec(x)
|
||||||
|
userregex.lastIndex = 0
|
||||||
|
|
||||||
|
var member = guild.members.cache.find((m) => m.id == res[1])
|
||||||
|
var text = member ? member.user.username.replace(/\s/g," ") : res[1]
|
||||||
|
return "<@"+text+"> "
|
||||||
|
})
|
||||||
|
|
||||||
|
const channelregex = /<#([0-9]+)>(\s)?/g
|
||||||
|
const channeltext = usertext.replace(channelregex,(x) => {
|
||||||
|
var res = channelregex.exec(x)
|
||||||
|
channelregex.lastIndex = 0
|
||||||
|
|
||||||
|
var channel = guild.channels.cache.find((c) => c.id == res[1])
|
||||||
|
var text = channel ? channel.name.replace(/\s/g," ") : res[1]
|
||||||
|
return "<#"+text+"> "
|
||||||
|
})
|
||||||
|
|
||||||
|
const roleregex = /<@&([0-9]+)>(\s)?/g
|
||||||
|
const roletext = channeltext.replace(roleregex,(x) => {
|
||||||
|
var res = roleregex.exec(x)
|
||||||
|
roleregex.lastIndex = 0
|
||||||
|
|
||||||
|
var role = guild.roles.cache.find((r) => r.id == res[1])
|
||||||
|
var text = role ? role.name.replace(/\s/g," ") : res[1]
|
||||||
|
|
||||||
|
var color = role ? ((role.hexColor == "#000000") ? "regular" : role.hexColor) : "regular"
|
||||||
|
|
||||||
|
return "<@&"+text+"::"+color+"> "
|
||||||
|
})
|
||||||
|
|
||||||
|
const defaultroleregex = /@(everyone|here)(\s)?/g
|
||||||
|
const defaultroletext = roletext.replace(defaultroleregex,(x) => {
|
||||||
|
var res = defaultroleregex.exec(x)
|
||||||
|
defaultroleregex.lastIndex = 0
|
||||||
|
|
||||||
|
var text = res[1]
|
||||||
|
return "<@&"+text+"::regular> "
|
||||||
|
})
|
||||||
|
|
||||||
|
return defaultroletext
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const storage = bot.storage
|
||||||
|
const tsconfig = bot.tsconfig
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @param {String} id
|
||||||
|
* @param {Number} rawprocesstime milliseconds
|
||||||
|
* @param {discord.User} user
|
||||||
|
*/
|
||||||
|
exports.beingprocessed = (name,id,rawprocesstime,user) => {
|
||||||
|
|
||||||
|
const newtime = rawprocesstime
|
||||||
|
|
||||||
|
const processtime = "<t:"+newtime.getTime().toString().substring(0,newtime.getTime().toString().length-3)+":R>"
|
||||||
|
|
||||||
|
const embed = new discord.EmbedBuilder()
|
||||||
|
.setTitle("🧾 "+l.transcripts.title)
|
||||||
|
.setColor(config.color)
|
||||||
|
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
|
||||||
|
.setFooter({text:name})
|
||||||
|
|
||||||
|
.setDescription("`"+l.transcripts.processed+"...`\n"+l.transcripts.wait+"\n\n"+l.transcripts.estimated+": "+processtime)
|
||||||
|
|
||||||
|
return embed
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @param {String} id
|
||||||
|
* @param {String} url
|
||||||
|
* @param {discord.User} user
|
||||||
|
*/
|
||||||
|
exports.tsready = (name,id,url,user) => {
|
||||||
|
const embed = new discord.EmbedBuilder()
|
||||||
|
.setTitle("🧾 "+l.transcripts.title)
|
||||||
|
.setColor(config.color)
|
||||||
|
.setAuthor({name:user.username,iconURL:user.displayAvatarURL()})
|
||||||
|
.setFooter({text:name})
|
||||||
|
|
||||||
|
if (url){
|
||||||
|
embed.setURL(url)
|
||||||
|
embed.setDescription("\n["+l.transcripts.available+"]("+url+")\n")
|
||||||
|
}else{
|
||||||
|
embed.setDescription("\n"+l.transcripts.available+"\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
return embed
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* @param {String} id
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {undefined|String} err
|
||||||
|
*/
|
||||||
|
exports.tserror = (name,id,user,err) => {
|
||||||
|
const embed = new discord.EmbedBuilder()
|
||||||
|
.setTitle("❌ "+l.transcripts.title)
|
||||||
|
.setColor(discord.Colors.Red)
|
||||||
|
.setAuthor({name:user.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)
|
||||||
|
|
||||||
|
return embed
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"version":"2"
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const log = bot.errorLog.log
|
||||||
|
const l = bot.language
|
||||||
|
const storage = bot.storage
|
||||||
|
|
||||||
|
const tsconfig = bot.tsconfig
|
||||||
|
const tsembeds = require("./embeds")
|
||||||
|
const tsdb = require("./tsdb")
|
||||||
|
|
||||||
|
|
||||||
|
const checkAvailability = async () => {
|
||||||
|
if (process.argv.some((v) => v == "--tsoffline")) return true
|
||||||
|
const axios = require("axios").default
|
||||||
|
try{
|
||||||
|
const res = await axios.get("https://transcripts.dj-dj.be/api/status.json")
|
||||||
|
if (!res || !(res.status == 200) || !res.data) return false
|
||||||
|
|
||||||
|
if (res.data && res.data["v2"] == "online") return true
|
||||||
|
else return false
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.Message[]} messages
|
||||||
|
* @param {discord.Guild} guild
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.User} user
|
||||||
|
* @param {String|false} reason
|
||||||
|
*/
|
||||||
|
module.exports = async (messages,guild,channel,user,reason) => {
|
||||||
|
require("../api/modules/events").onTranscriptCreation(messages,channel,guild,new Date())
|
||||||
|
const msglist = await channel.messages.fetchPinned()
|
||||||
|
|
||||||
|
const chName = channel.name
|
||||||
|
const chId = channel.id
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
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 tsb = tsconfig.style.background
|
||||||
|
const tsh = tsconfig.style.header
|
||||||
|
const tss = tsconfig.style.stats
|
||||||
|
const JSONDATA = require("./communication/compileJsonV2").compile(guild,channel,user,messages,{
|
||||||
|
style:{
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
bot:{
|
||||||
|
name:client.user.username,
|
||||||
|
id:client.user.id,
|
||||||
|
pfp:client.user.displayAvatarURL(),
|
||||||
|
},
|
||||||
|
ticket:{
|
||||||
|
creatorid:ticketopener.id,
|
||||||
|
creatorname:ticketopener.username,
|
||||||
|
creatorpfp:ticketopener.displayAvatarURL(),
|
||||||
|
|
||||||
|
openedtime:opentime.getTime(),
|
||||||
|
closedtime:new Date().getTime()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!await checkAvailability()){
|
||||||
|
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
|
||||||
|
const errembed = tsembeds.tserror(chName,chId,user)
|
||||||
|
|
||||||
|
if (tsconfig.sendTranscripts.enableChannel){
|
||||||
|
/**@type {discord.TextChannel|undefined} */
|
||||||
|
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
||||||
|
|
||||||
|
if (!tc) return
|
||||||
|
tc.send({embeds:[errembed],files:[attachment]})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const TSdata = await require("./communication/index").upload(JSONDATA)
|
||||||
|
if (!TSdata) return false
|
||||||
|
|
||||||
|
if (TSdata.status == "success"){
|
||||||
|
//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 duration = TSdata.estimated.waittime
|
||||||
|
const finaltime = new Date(new Date().getTime()+duration)
|
||||||
|
|
||||||
|
//waiting
|
||||||
|
if (tsconfig.sendTranscripts.enableChannel){
|
||||||
|
/**@type {discord.TextChannel|undefined} */
|
||||||
|
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
||||||
|
|
||||||
|
if (!tc) return
|
||||||
|
const embed = tsembeds.beingprocessed(chName,chId,finaltime,user)
|
||||||
|
var msg = await tc.send({embeds:[embed]})
|
||||||
|
}else {var msg = false}
|
||||||
|
|
||||||
|
//ready
|
||||||
|
setTimeout(() => {
|
||||||
|
if (msg){
|
||||||
|
msg.edit({embeds:[tsembeds.tsready(chName,chId,url,user)]})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tsconfig.sendTranscripts.enableDM){
|
||||||
|
if (!user) return
|
||||||
|
const embed = tsembeds.tsready(chName,chId,url,user)
|
||||||
|
try {
|
||||||
|
ticketopener.send({embeds:[embed]})
|
||||||
|
}catch{}
|
||||||
|
}
|
||||||
|
},duration)
|
||||||
|
}else{
|
||||||
|
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
|
||||||
|
const errembed = tsembeds.tserror(chName,chId,user,"`error type: transcript API error`")
|
||||||
|
|
||||||
|
if (tsconfig.sendTranscripts.enableChannel){
|
||||||
|
/**@type {discord.TextChannel|undefined} */
|
||||||
|
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
||||||
|
|
||||||
|
if (!tc) return
|
||||||
|
tc.send({embeds:[errembed],files:[attachment]})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
const attachment = await require("./oldTranscript").createTranscript(messages,channel)
|
||||||
|
const embed = tsembeds.tsready(chName,chId,false,user)
|
||||||
|
|
||||||
|
if (tsconfig.sendTranscripts.enableChannel){
|
||||||
|
/**@type {discord.TextChannel|undefined} */
|
||||||
|
const tc = guild.channels.cache.find((c) => c.id == tsconfig.sendTranscripts.channel)
|
||||||
|
|
||||||
|
if (!tc) return
|
||||||
|
tc.send({embeds:[embed],files:[attachment]})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
asyncmanager()
|
||||||
|
}
|
||||||
Executable
+60
@@ -0,0 +1,60 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.Message[]} messagecollection
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {Boolean} backup
|
||||||
|
* @returns new `discord.attachmentBuilder`
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.createTranscript = async (messagecollection,channel,backup) => {
|
||||||
|
try {
|
||||||
|
const cd = new Date()
|
||||||
|
const months = ["January","February","March","April","May","June","July","August","September","October","November","December"]
|
||||||
|
const dateString = cd.getDate()+" "+months[cd.getMonth()-1]+" "+cd.getFullYear()+" - "+cd.getHours()+":"+cd.getMinutes()+":"+cd.getSeconds()
|
||||||
|
let backuptitle = backup ? "BACKUP " : ""
|
||||||
|
let backupfilename = backup ? "backup" : ""
|
||||||
|
const filearray = [backuptitle+"TRANSCRIPT:\n"]
|
||||||
|
|
||||||
|
messagecollection.reverse()
|
||||||
|
|
||||||
|
messagecollection.forEach((msg) => {
|
||||||
|
const timestamp = new Date(msg.createdTimestamp)
|
||||||
|
|
||||||
|
//empty message handling
|
||||||
|
if (msg.content){
|
||||||
|
var content = msg.content
|
||||||
|
}else if (msg.embeds.length > 0 && msg.attachments.length > 0){
|
||||||
|
var content = "*this message only has embeds & files*"
|
||||||
|
}else if (msg.embeds.length > 0){
|
||||||
|
var content = "*this message only has embeds*"
|
||||||
|
}else if (msg.attachments.length > 0){
|
||||||
|
var content = "*this message only has files*"
|
||||||
|
}else{
|
||||||
|
var content = "*empty message*"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const fileurls = []
|
||||||
|
const rawfiles = Array.from(msg.attachments)
|
||||||
|
rawfiles.forEach((file) => {
|
||||||
|
fileurls.push("attachment: "+file[1].url)
|
||||||
|
})
|
||||||
|
const filestring = fileurls.length > 0 ? fileurls.join("\n")+"\n" : ""
|
||||||
|
const msgstats = "files: "+msg.attachments.size+", embeds: "+msg.embeds.length
|
||||||
|
filearray.push("["+timestamp.getDate()+"/"+timestamp.getMonth()+"/"+timestamp.getFullYear()+", "+timestamp.getHours()+":"+timestamp.getMinutes()+":"+timestamp.getSeconds()+"|"+msg.author.username+"] ["+msgstats+"]\n"+content+"\n"+filestring)
|
||||||
|
})
|
||||||
|
|
||||||
|
if (filearray.length < 2) filearray.push("transcript is empty")
|
||||||
|
const filestring = filearray.join("\n")
|
||||||
|
const filebuff = Buffer.from(filestring,"utf-8")
|
||||||
|
return new discord.AttachmentBuilder(filebuff,{name:backupfilename+"transcript.txt",description:"Open Ticket transcript"})
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
const fs = require("fs")
|
||||||
|
const location = "./storage/tsdatabase.json"
|
||||||
|
|
||||||
|
|
||||||
|
/**@returns {[{category:String, key:String, value:String}]}*/
|
||||||
|
function getData(){
|
||||||
|
if (fs.existsSync(location)){
|
||||||
|
return JSON.parse(fs.readFileSync(location).toString())
|
||||||
|
}else{
|
||||||
|
fs.writeFileSync(location,"[]")
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**@param {[{category:String, key:String, value:String}]} data*/
|
||||||
|
function setData(data){
|
||||||
|
fs.writeFileSync(location,JSON.stringify(data,null,"\t"))
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.set = (category,key,value) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
||||||
|
var newData = []
|
||||||
|
if (exists){
|
||||||
|
currentData.forEach((d,i) => {
|
||||||
|
if (d.category == category && d.key == key){
|
||||||
|
newData.push({category,key,value})
|
||||||
|
}else{
|
||||||
|
newData.push(d)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
currentData.push({category,key,value})
|
||||||
|
newData = currentData
|
||||||
|
}
|
||||||
|
|
||||||
|
setData(newData)
|
||||||
|
return exists
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {String} category
|
||||||
|
* @param {String} key
|
||||||
|
* @returns {String|false}
|
||||||
|
*/
|
||||||
|
exports.get = (category,key) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const tempresult = currentData.find((d) => (d.category == category) && (d.key == key))
|
||||||
|
const result = tempresult ? tempresult.value : false
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {String} category
|
||||||
|
* @param {String} key
|
||||||
|
* @param {String} value
|
||||||
|
*/
|
||||||
|
exports.delete = (category,key) => {
|
||||||
|
const currentData = getData()
|
||||||
|
const exists = currentData.find((d) => (d.category == category) && (d.key == key)) ? true : false
|
||||||
|
var newData = []
|
||||||
|
if (exists){
|
||||||
|
currentData.forEach((d,i) => {
|
||||||
|
if (!(d.category == category && d.key == key)){
|
||||||
|
newData.push(d)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
newData = currentData
|
||||||
|
}
|
||||||
|
|
||||||
|
setData(newData)
|
||||||
|
return exists
|
||||||
|
}
|
||||||
@@ -0,0 +1,188 @@
|
|||||||
|
const bot = require("../../index")
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
|
||||||
|
//TYPEDEFS:
|
||||||
|
//==================
|
||||||
|
|
||||||
|
//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 */
|
||||||
|
|
||||||
|
//OTWebsiteOptions
|
||||||
|
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",url:String}} OTWebsiteOptions */
|
||||||
|
|
||||||
|
|
||||||
|
//OTConfigMessage
|
||||||
|
/**@typedef {{id: string, name: string, description: string, dropdown: boolean, enableFooter: boolean, footer: string, enableFooterImage: boolean, footerImage: string, enableThumbnail: boolean, thumbnail: string, enableImage: boolean, image: string, enableCustomColor: boolean, color: string, options: string[], other:{enableTicketExplaination: boolean, enableMaxTicketsWarning: boolean, customDropdownPlaceholder:{enable:Boolean,text:String}, customCategoryText:{enable:Boolean,text:String}, embedTitleURL:{enable:Boolean,url:String} } }} OTConfigMessage*/
|
||||||
|
|
||||||
|
//OTAllOptions
|
||||||
|
/**@typedef {{id: String,name: String,description: String,icon: String,label: String,type: "ticket"|"role"|"website",color:"red"|"green"|"blue"|"gray"|"none",roles:String[],mode:"add&remove"|"remove"|"add",adminroles: String[],channelprefix: String,category: String,message: String,enableDmOnOpen: Boolean,ticketmessage: String, thumbnail:{enable:Boolean,url:String}, image:{enable:Boolean,url:String}, url:String, closedCategory:{enable:Boolean,id:String}, autoclose:{enable:Boolean,inactiveHours:Number}, readonlyAdminroles: String[]}} OTAllOptions */
|
||||||
|
|
||||||
|
//StringOptions
|
||||||
|
/**@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 */
|
||||||
|
|
||||||
|
//FUNCTIONS:
|
||||||
|
//==================
|
||||||
|
|
||||||
|
/** @param {String} id the id of the embed @returns {OTConfigMessage}*/
|
||||||
|
exports.getConfigMessage = (id) => {
|
||||||
|
var returned = config.messages.find(a => a.id == id)
|
||||||
|
if (returned){
|
||||||
|
return returned
|
||||||
|
}
|
||||||
|
var result = config.messages[0]
|
||||||
|
if (!result){
|
||||||
|
throw new Error("'messages' object in config.json is empty")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} id
|
||||||
|
* @param {Boolean} withoutOTnewT
|
||||||
|
* @returns {OTTicketOptions|false}
|
||||||
|
*/
|
||||||
|
exports.getTicketById = (id,withoutOTnewT) => {
|
||||||
|
var result = false
|
||||||
|
if (withoutOTnewT){
|
||||||
|
config.options.forEach((option) => {
|
||||||
|
if (option.id == id && option.type == "ticket"){
|
||||||
|
result = option
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
config.options.forEach((option) => {
|
||||||
|
if ("OTnewT"+option.id == id && option.type == "ticket"){
|
||||||
|
result = option
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} id
|
||||||
|
* @param {Boolean} withoutOTnewR
|
||||||
|
* @returns {OTRoleOptions|false}
|
||||||
|
*/
|
||||||
|
exports.getRoleById = (id,withoutOTnewR) => {
|
||||||
|
var result = false
|
||||||
|
if (withoutOTnewR){
|
||||||
|
config.options.forEach((option) => {
|
||||||
|
if (option.id == id && option.type == "role"){
|
||||||
|
result = option
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
config.options.forEach((option) => {
|
||||||
|
if ("OTnewR"+option.id == id && option.type == "role"){
|
||||||
|
result = option
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} id
|
||||||
|
* @returns {OTWebsiteOptions|false}
|
||||||
|
*/
|
||||||
|
exports.getWebsiteById = (id) => {
|
||||||
|
var result = false
|
||||||
|
config.options.forEach((option) => {
|
||||||
|
if (option.id == id && option.type == "website"){
|
||||||
|
result = option
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {OTTicketStringOptions} value
|
||||||
|
* @returns {String[]}
|
||||||
|
*/
|
||||||
|
exports.getTicketValuesArray = (value,idWithoutOTnewT) => {
|
||||||
|
var result = []
|
||||||
|
const prefix = idWithoutOTnewT ? "" : "OTnewT"
|
||||||
|
config.options.forEach((opt) => {
|
||||||
|
if (opt.type == "ticket"){
|
||||||
|
if (value == "id"){
|
||||||
|
result.push(prefix+opt[value])
|
||||||
|
}else{
|
||||||
|
result.push(opt[value])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {OTRoleStringOptions} value
|
||||||
|
* @returns {String[]}
|
||||||
|
*/
|
||||||
|
exports.getRoleValuesArray = (value,idWithoutOTnewR) => {
|
||||||
|
var result = []
|
||||||
|
const prefix = idWithoutOTnewR ? "" : "OTnewR"
|
||||||
|
config.options.forEach((opt) => {
|
||||||
|
if (o.type == "role"){
|
||||||
|
if (value == "id"){
|
||||||
|
result.push(prefix+opt[value])
|
||||||
|
}else{
|
||||||
|
result.push(opt[value])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {OTWebsiteStringOptions} value
|
||||||
|
* @returns {String[]}
|
||||||
|
*/
|
||||||
|
exports.getWebsiteValuesArray = (value) => {
|
||||||
|
var result = []
|
||||||
|
config.options.forEach((opt) => {
|
||||||
|
if (o.type == "website"){
|
||||||
|
result.push(opt[value])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@type {OTTicketOptions} */
|
||||||
|
this.ticketType = {}
|
||||||
|
|
||||||
|
/**@type {OTRoleOptions} */
|
||||||
|
this.roleType = {}
|
||||||
|
|
||||||
|
/**@type {OTWebsiteOptions} */
|
||||||
|
this.websiteType = {}
|
||||||
|
|
||||||
|
/**@type {OTConfigMessage} */
|
||||||
|
this.messageType = {}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} id
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.optionExists = (id) => {
|
||||||
|
var result = false
|
||||||
|
config.options.forEach((option) => {
|
||||||
|
if (option.id == id){
|
||||||
|
result = true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
const discord = require("discord.js")
|
||||||
|
const bot = require("../../index")
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
|
||||||
|
/**@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
|
||||||
|
}else return b.Secondary
|
||||||
|
}
|
||||||
|
|
||||||
|
const getOption = (id) => {
|
||||||
|
const result = config.options.find((option) => option.id == id)
|
||||||
|
if (!result){return false}else return result
|
||||||
|
}
|
||||||
|
exports.getOption = getOption
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} id
|
||||||
|
* @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"){
|
||||||
|
var button = new discord.ButtonBuilder()
|
||||||
|
.setCustomId("OTnewT"+option.id)
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(getColor(option.color))
|
||||||
|
|
||||||
|
if (option.label){button.setLabel(option.label)}
|
||||||
|
if (option.icon){button.setEmoji(option.icon)}
|
||||||
|
if (!option.label && !option.icon){button.setLabel("no label or emoji")}
|
||||||
|
|
||||||
|
}else if (option.type == "website"){
|
||||||
|
var button = new discord.ButtonBuilder()
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(discord.ButtonStyle.Link)
|
||||||
|
.setURL(option.url)
|
||||||
|
|
||||||
|
if (option.label){button.setLabel(option.label)}
|
||||||
|
if (option.icon){button.setEmoji(option.icon)}
|
||||||
|
if (!option.label && !option.icon){button.setLabel("no label or emoji")}
|
||||||
|
|
||||||
|
}else if (option.type == "role"){
|
||||||
|
var button = new discord.ButtonBuilder()
|
||||||
|
.setCustomId("newR"+option.id)
|
||||||
|
.setDisabled(false)
|
||||||
|
.setStyle(getColor(option.color))
|
||||||
|
|
||||||
|
if (option.label){button.setLabel(option.label)}
|
||||||
|
if (option.icon){button.setEmoji(option.icon)}
|
||||||
|
if (!option.label && !option.icon){button.setLabel("no label or emoji")}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return button
|
||||||
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
const discord = require("discord.js")
|
||||||
|
const bot = require("../../index")
|
||||||
|
const config = bot.config
|
||||||
|
const l = bot.language
|
||||||
|
|
||||||
|
const configParser = require("./configParser")
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String[]} ids
|
||||||
|
* @param {String|undefined|false} placeholder
|
||||||
|
* @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)
|
||||||
|
.setMaxValues(1)
|
||||||
|
.setMinValues(1)
|
||||||
|
.setPlaceholder(placeholder || l.messages.chooseATicket)
|
||||||
|
.addOptions(
|
||||||
|
new discord.StringSelectMenuOptionBuilder()
|
||||||
|
.setDefault(true)
|
||||||
|
.setLabel(placeholder || l.messages.chooseATicket)
|
||||||
|
.setValue("OTChooseTicket")
|
||||||
|
)
|
||||||
|
|
||||||
|
ids.forEach((id) => {
|
||||||
|
const option = configParser.getTicketById(id,true)
|
||||||
|
const roleoption = configParser.getRoleById(id,true)
|
||||||
|
if (option){
|
||||||
|
const selectComponent = new discord.StringSelectMenuOptionBuilder()
|
||||||
|
.setDefault(false)
|
||||||
|
.setValue("OTnewT"+option.id)
|
||||||
|
|
||||||
|
if (!option.label && !option.icon){
|
||||||
|
selectComponent.setLabel("OT ERROR: no description/emoji")
|
||||||
|
}else{
|
||||||
|
if (option.label) selectComponent.setLabel(option.label)
|
||||||
|
if (option.icon) selectComponent.setEmoji(option.icon)
|
||||||
|
if (option.description) selectComponent.setDescription(option.description)
|
||||||
|
}
|
||||||
|
|
||||||
|
dropdown.addOptions(selectComponent)
|
||||||
|
|
||||||
|
}else if (roleoption){
|
||||||
|
const selectComponent = new discord.StringSelectMenuOptionBuilder()
|
||||||
|
.setDefault(false)
|
||||||
|
.setValue("OTnewR"+roleoption.id)
|
||||||
|
|
||||||
|
if (!roleoption.label && !roleoption.icon){
|
||||||
|
selectComponent.setLabel("OT ERROR: no description/emoji")
|
||||||
|
}else{
|
||||||
|
if (roleoption.label) selectComponent.setLabel(roleoption.label)
|
||||||
|
if (roleoption.icon) selectComponent.setEmoji(roleoption.icon)
|
||||||
|
}
|
||||||
|
|
||||||
|
dropdown.addOptions(selectComponent)
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
return dropdown
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
const bot = require('../../index')
|
||||||
|
const client = bot.client
|
||||||
|
const config = bot.config
|
||||||
|
const getButton = require("./getButton")
|
||||||
|
const l = bot.language
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} id the id from an open-ticket embed
|
||||||
|
* @returns {{embed:discord.EmbedBuilder,componentRows:discord.MessageActionRow[]}} discord embed
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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 {import('./configParser').OTAllOptions[]} */
|
||||||
|
var buttonData = []
|
||||||
|
|
||||||
|
data.options.forEach((option) => {
|
||||||
|
var button = getButton.getButton(option)
|
||||||
|
var localButtonData = getButton.getOption(option)
|
||||||
|
if (button) buttons.push(button)
|
||||||
|
if (localButtonData) buttonData.push(localButtonData)
|
||||||
|
})
|
||||||
|
//-----------------------------------
|
||||||
|
|
||||||
|
//-----------------------------------
|
||||||
|
//create the embed
|
||||||
|
const embed = new discord.EmbedBuilder()
|
||||||
|
.setTitle(data.name)
|
||||||
|
|
||||||
|
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!")
|
||||||
|
}
|
||||||
|
|
||||||
|
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.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.chooseATicket
|
||||||
|
description = description+"\n\n__"+chooseCategoryMSG+"__\n"
|
||||||
|
|
||||||
|
var ticketExplainations = []
|
||||||
|
buttonData.forEach((button) => {
|
||||||
|
var explaination = button.icon+" **"+button.name+":**\n"+button.description
|
||||||
|
ticketExplainations.push(explaination)
|
||||||
|
})
|
||||||
|
|
||||||
|
description = description+ticketExplainations.join("\n\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.other.enableMaxTicketsWarning){
|
||||||
|
description = description+"\n\n"+l.commands.maxTicketWarning.replace("{0}",config.system.maxAmountOfTickets)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (description) embed.setDescription(description)
|
||||||
|
|
||||||
|
//-----------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------
|
||||||
|
//create the components IF DROPDOWN IS FALSE
|
||||||
|
if (!data.dropdown){
|
||||||
|
var AmountOfRows = Math.ceil(buttons.length / 4)
|
||||||
|
var currentRow = 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {discord.MessageActionRow[]}
|
||||||
|
*/
|
||||||
|
var componentRows = []
|
||||||
|
|
||||||
|
for (let i = AmountOfRows; i > 0; i--){
|
||||||
|
|
||||||
|
componentRows.push(new discord.ActionRowBuilder())
|
||||||
|
}
|
||||||
|
|
||||||
|
buttons.forEach((button,index) => {
|
||||||
|
componentRows[currentRow].addComponents([button])
|
||||||
|
|
||||||
|
if (index == 3 || index == 7 || index == 11 || index == 15 || index == 19 || index == 23 || index == 27 || index == 31 || index == 35 || index == 39){
|
||||||
|
currentRow = currentRow + 1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//create the component IF DROPDOWN is true
|
||||||
|
}else{
|
||||||
|
const ids = data.options
|
||||||
|
const customPlaceholder = data.other.customDropdownPlaceholder.enable ? data.other.customDropdownPlaceholder.text : false
|
||||||
|
const dropdown = require("./getDropdown").getDropdown(ids,customPlaceholder)
|
||||||
|
var componentRows = [
|
||||||
|
new discord.ActionRowBuilder()
|
||||||
|
.setComponents(dropdown)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
//-----------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//return everything
|
||||||
|
/**
|
||||||
|
* @type {{embed:discord.EmbedBuilder,componentRows:discord.MessageActionRow[]}}
|
||||||
|
*/
|
||||||
|
const returnedData = {embed:embed,componentRows:componentRows}
|
||||||
|
return returnedData
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
const storage = require("../../index").storage
|
||||||
|
|
||||||
|
/**@typedef {[{key:String,value:String}]} hiddenData */
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} channelid
|
||||||
|
* @returns {hiddenData}
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.readHiddenData = (channelid) => {
|
||||||
|
const content = storage.get("HIDDENDATA",channelid)
|
||||||
|
if (!content) return []
|
||||||
|
|
||||||
|
try {
|
||||||
|
return JSON.parse(content)
|
||||||
|
} catch {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} channelid
|
||||||
|
* @param {[{key:String,value:String}]} data
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.writeHiddenData = (channelid,data) => {
|
||||||
|
try {
|
||||||
|
storage.set("HIDDENDATA",channelid,JSON.stringify(data))
|
||||||
|
return true
|
||||||
|
} catch {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} channelid
|
||||||
|
* @returns {Boolean}
|
||||||
|
*/
|
||||||
|
exports.deleteHiddenData = (channelid) => {
|
||||||
|
try {
|
||||||
|
storage.delete("HIDDENDATA",channelid)
|
||||||
|
return true
|
||||||
|
} catch {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
const discord = require('discord.js')
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
//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://livestatus.dj-dj.be/openticket.json").then((res) => {
|
||||||
|
const livestatus = res.data
|
||||||
|
if (!Array.isArray(livestatus)) return resolve(false)
|
||||||
|
if (!livestatus) return resolve(false)
|
||||||
|
resolve(livestatus)
|
||||||
|
})
|
||||||
|
}catch{
|
||||||
|
return resolve(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
var globalPluginData = {total:0,error:0,success:0}
|
||||||
|
|
||||||
|
//announcer
|
||||||
|
/**@param {{total:Number,error:Number,success:Number}} pluginData*/
|
||||||
|
exports.run = async (pluginData) => {
|
||||||
|
const chalk = await loadChalk()
|
||||||
|
globalPluginData = pluginData
|
||||||
|
const res = await getLivestatus(process.argv.some((v) => v == "--localstatus"))
|
||||||
|
if (!res) return false
|
||||||
|
if (res.length == 0) return
|
||||||
|
|
||||||
|
/**@type {[{title:String,titleColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan",description:String,descriptionColor:"normal"|"red"|"green"|"blue"|"yellow"|"white"|"gray"|"magenta"|"cyan"}]} */
|
||||||
|
const activeStyles = []
|
||||||
|
res.forEach((announcement) => {
|
||||||
|
const a = announcement.active
|
||||||
|
|
||||||
|
const isLanguage = a.languages.includes(config.languageFile) || a.languages.includes("all")
|
||||||
|
const isVersion = a.versions.includes(require("../../package.json").version)
|
||||||
|
|
||||||
|
var tsenabled = (bot.tsconfig.sendTranscripts.enableChannel || bot.tsconfig.sendTranscripts.enableDM)
|
||||||
|
var tsmode = bot.tsconfig.sendTranscripts.useHTMLtranscripts ? "html" : "text"
|
||||||
|
const isTranscript = (a.transcripts.includes("html") && tsmode == "html" && tsenabled) || (a.transcripts.includes("text") && tsmode == "text" && tsenabled) || (a.transcripts.includes("both") && tsenabled)
|
||||||
|
const isPlugins = (a.usingPlugins.includes("yes") && pluginData.total > 0) || (a.usingPlugins.includes("no") && pluginData.total == 0) || (a.usingPlugins.includes("both"))
|
||||||
|
const isSlashCMD = (a.usingSlashCommands.includes("yes") && getSlashEnabled()) || (a.usingSlashCommands.includes("no") && !getSlashEnabled()) || (a.usingSlashCommands.includes("both"))
|
||||||
|
|
||||||
|
if (!isLanguage || !isVersion || !isTranscript || !isPlugins || !isSlashCMD) return
|
||||||
|
announcement.style.forEach((s) => activeStyles.push(s))
|
||||||
|
})
|
||||||
|
const final = []
|
||||||
|
activeStyles.forEach((style) => {
|
||||||
|
const dc = style.descriptionColor
|
||||||
|
const tempd = style.description.split("\n")
|
||||||
|
const tc = style.titleColor
|
||||||
|
const t = "["+style.title+"]"
|
||||||
|
const tempd2 = []
|
||||||
|
tempd.forEach((tmpd,i) => {
|
||||||
|
if (i > 0){
|
||||||
|
var newtext = tmpd
|
||||||
|
var i2 = 0
|
||||||
|
while(i2 < t.length+1){
|
||||||
|
newtext = " "+newtext
|
||||||
|
i2++
|
||||||
|
}
|
||||||
|
tempd2.push(newtext)
|
||||||
|
}else{
|
||||||
|
tempd2.push(tmpd)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const d = tempd2.join("\n")
|
||||||
|
|
||||||
|
|
||||||
|
var fd = d
|
||||||
|
if (dc == "normal" || dc == "white") fd = chalk.white(d)
|
||||||
|
if (dc == "red") fd = chalk.red(d)
|
||||||
|
if (dc == "yellow") fd = chalk.yellow(d)
|
||||||
|
if (dc == "green") fd = chalk.green(d)
|
||||||
|
if (dc == "blue") fd = chalk.blue(d)
|
||||||
|
if (dc == "gray") fd = chalk.gray(d)
|
||||||
|
if (dc == "magenta") fd = chalk.magenta(d)
|
||||||
|
if (dc == "cyan") fd = chalk.cyan(d)
|
||||||
|
|
||||||
|
var ft = t
|
||||||
|
if (tc == "normal" || tc == "white") ft = chalk.white(t)
|
||||||
|
if (tc == "red") ft = chalk.red(t)
|
||||||
|
if (tc == "yellow") ft = chalk.yellow(t)
|
||||||
|
if (tc == "green") ft = chalk.green(t)
|
||||||
|
if (tc == "blue") ft = chalk.blue(t)
|
||||||
|
if (tc == "gray") ft = chalk.gray(t)
|
||||||
|
if (tc == "magenta") ft = chalk.magenta(t)
|
||||||
|
if (tc == "cyan") ft = chalk.cyan(t)
|
||||||
|
|
||||||
|
final.push(ft+" "+fd)
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log(final.join("\n\n"))
|
||||||
|
}
|
||||||
|
|
||||||
|
var waitTime = new Date().getTime()
|
||||||
|
var waitTimeEnabled = false
|
||||||
|
|
||||||
|
/**@param {OTLiveStatusError} options @returns {Promise<Boolean>} */
|
||||||
|
const uploadLiveStatus = (options) => {
|
||||||
|
return new Promise((resolve,reject) => {
|
||||||
|
if (process.argv.some((v) => v == "--noerrorupload")) return resolve(true)
|
||||||
|
try {
|
||||||
|
var data = encodeURIComponent(JSON.stringify(options))
|
||||||
|
axios.get("https://livestatus.dj-dj.be/openticket?auth=openticketLIVESTATUS1234&data="+data).then((res) => {
|
||||||
|
if (res.status == 200) resolve(true)
|
||||||
|
else resolve(false)
|
||||||
|
})
|
||||||
|
}catch{
|
||||||
|
resolve(false)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**@param {String} err @returns {Promise<Boolean>}*/
|
||||||
|
exports.liveStatusUploadManager = async (err) => {
|
||||||
|
return new Promise(async (resolve) => {
|
||||||
|
|
||||||
|
if (process.argv.some((v) => v == "--noerrorupload")) return resolve(true)
|
||||||
|
else{
|
||||||
|
var tsenabled = (bot.tsconfig.sendTranscripts.enableChannel || bot.tsconfig.sendTranscripts.enableDM)
|
||||||
|
var tsmode = bot.tsconfig.sendTranscripts.useHTMLtranscripts ? "html" : "text"
|
||||||
|
const transcriptMode = tsenabled ? tsmode : false
|
||||||
|
const slashMode = getSlashEnabled()
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (waitTimeEnabled){
|
||||||
|
if (new Date().getTime() < waitTime){
|
||||||
|
waitTimeEnabled = false
|
||||||
|
return resolve(false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const result = await uploadLiveStatus({
|
||||||
|
bot:{
|
||||||
|
id:client.user.id,
|
||||||
|
name:client.user.username,
|
||||||
|
pfp:client.user.displayAvatarURL()
|
||||||
|
},
|
||||||
|
error:err,
|
||||||
|
openticket:{
|
||||||
|
config:{
|
||||||
|
//TEMPORARY SOLUTION => AXIOS 414 ERROR!
|
||||||
|
//messages:config.messages,
|
||||||
|
//options:config.options,
|
||||||
|
//transcripts:bot.tsconfig,
|
||||||
|
//system:config.system
|
||||||
|
},
|
||||||
|
language:config.languageFile,
|
||||||
|
version:"3.4.4",
|
||||||
|
slashcmds:slashMode,
|
||||||
|
transcripts:transcriptMode,
|
||||||
|
plugins:fs.readdirSync("./plugins"),
|
||||||
|
pluginload:globalPluginData
|
||||||
|
},
|
||||||
|
details:{
|
||||||
|
errortime:new Date().getTime()
|
||||||
|
//TEMPORARY SOLUTION => AXIOS 414 ERROR!
|
||||||
|
//actions:this.actionRecorder,
|
||||||
|
//database:fs.readFileSync("./storage/database.json").toString()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (!result){
|
||||||
|
waitTime = new Date().getTime()+30000
|
||||||
|
waitTimeEnabled = true
|
||||||
|
}
|
||||||
|
resolve(result)
|
||||||
|
}catch{resolve(false)}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {String} memberid
|
||||||
|
* @param {String} guildid
|
||||||
|
* @returns {Boolean} has permissions?
|
||||||
|
*/
|
||||||
|
exports.command = (memberid,guildid) => {
|
||||||
|
bot.actionRecorder.push({
|
||||||
|
category:"ot.managers.permissionChecker",
|
||||||
|
file:"./core/permissionChecker.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"command"
|
||||||
|
})
|
||||||
|
const permsmember = client.guilds.cache.find(g => g.id == guildid).members.cache.find(m => m.id == memberid)
|
||||||
|
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 {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
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} 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
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.User} 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
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.User} 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
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.User} 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
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {discord.TextChannel} channel
|
||||||
|
* @param {discord.User} 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
|
||||||
|
}catch{
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
# changelog
|
|
||||||
|
|
||||||
## v1.3.2
|
|
||||||
### added:
|
|
||||||
- an alias for !resetdatabase: !resetdb
|
|
||||||
- you need the "chalk" library now!
|
|
||||||
- checker.js
|
|
||||||
- "enabled" option for status
|
|
||||||
- better console logs
|
|
||||||
- enable logs option to config
|
|
||||||
### fixed
|
|
||||||
- a bug that crashed the bot on using the command !resetdatabase
|
|
||||||
- "member_role" in config is optional but not recommended
|
|
||||||
- fixed crash on startup
|
|
||||||
- fixed bug where the bot crashes by using transcripts
|
|
||||||
- changed package.json
|
|
||||||
### removed
|
|
||||||
- "canvas" library is not longer required
|
|
||||||
- removed "server_icon" & "server_name" from config
|
|
||||||
|
|
||||||
## v1.3.1
|
|
||||||
### added:
|
|
||||||
- Q&A in the README.md
|
|
||||||
- v1.4.0 announcement
|
|
||||||
### fixed
|
|
||||||
- a bug that happend when you created too much tickets
|
|
||||||
- deprecation warnings (setAuthor & setFooter)
|
|
||||||
- the logo in README.md is smaller now
|
|
||||||
- markdown files relocated
|
|
||||||
- fixed a bug that some messages appeared in Dutch
|
|
||||||
### removed
|
|
||||||
- nothing
|
|
||||||
|
|
||||||
## v1.3.0
|
|
||||||
### added:
|
|
||||||
- now its possible to create 6 tickets instead of 4
|
|
||||||
- you can edit the number of tickets per user now
|
|
||||||
- you can edit & enable/disable all messages
|
|
||||||
- all embeds are now editable
|
|
||||||
- the color of the button can be changed
|
|
||||||
- updated config.json
|
|
||||||
- updated README.md
|
|
||||||
- a new type of button is here: website links
|
|
||||||
### fixed
|
|
||||||
- nothing at the moment :)
|
|
||||||
### removed
|
|
||||||
- nothing
|
|
||||||
|
|
||||||
## v1.2.2
|
|
||||||
### added:
|
|
||||||
- nothing
|
|
||||||
### fixed:
|
|
||||||
- a bug that caused the `warn "message" event deprecated` to be displayed every time you start the bot in the console.
|
|
||||||
- a visual bug that caused the categories from `!ticket msg` to be displayed in a wrong pattern.
|
|
||||||
### removed:
|
|
||||||
- nothing
|
|
||||||
|
|
||||||
## v1.2.1
|
|
||||||
### added:
|
|
||||||
- you can disable credits in config.json
|
|
||||||
### fixed:
|
|
||||||
- a bug that crashed the bot on startup
|
|
||||||
### removed
|
|
||||||
- nothing
|
|
||||||
|
|
||||||
## v1.2.0
|
|
||||||
### added:
|
|
||||||
- the bot is in english now
|
|
||||||
- you can choose your own ticket options now
|
|
||||||
- added !resetdatabase
|
|
||||||
- updated README.md
|
|
||||||
### fixed:
|
|
||||||
- the first bugs
|
|
||||||
### removed:
|
|
||||||
- some useless commands
|
|
||||||
|
|
||||||
## v1.1.1
|
|
||||||
### added:
|
|
||||||
- added "status" options in config.json
|
|
||||||
### fixed:
|
|
||||||
- fixed a bug where the bot's status could be "playing highmt".
|
|
||||||
### removed:
|
|
||||||
- nothing
|
|
||||||
|
|
||||||
## v1.1.0
|
|
||||||
### added:
|
|
||||||
- option to choose your own prefix
|
|
||||||
- enable/disable transcripts
|
|
||||||
- enable/disable categories
|
|
||||||
### fixed:
|
|
||||||
- the bot crashed sometimes
|
|
||||||
### removed:
|
|
||||||
- credits
|
|
||||||
|
|
||||||
## v1.0.0
|
|
||||||
- initial release
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
# config file
|
|
||||||
[](https://discord.com/invite/26vT9wt3n3)
|
|
||||||
[](https://github.com/DJj123dj/open-ticket/releases/tag/v1.3.2)
|
|
||||||
[](#packages)
|
|
||||||
[](https://github.com/DJj123dj/open-ticket/blob/main/LICENSE)
|
|
||||||
|
|
||||||
In this file you find all the information about commands in the config.json file
|
|
||||||
|
|
||||||
|
|
||||||
- bot_name ➜ the name from the bot _**type: string**_
|
|
||||||
- main_color ➜ the color used in embeds _**type: hex color (#000000)**_
|
|
||||||
- auth_token ➜ your bot's token _**type: string**_
|
|
||||||
- botperms_role ➜ this role can do all admin commands from the bot _**type: discord role id**_
|
|
||||||
- prefix ➜ the prefix _**type: string**_
|
|
||||||
- logs ➜ enable logs _**type: boolean**_
|
|
||||||
- credits ➜ disable the credits _**type: boolean**_
|
|
||||||
|
|
||||||
## status: (the status from the bot)
|
|
||||||
- enabled ➜ enable status _**type: boolean**_
|
|
||||||
- type ➜ set the status type _**type: string (PLAYING | LISTENING | WATCHING | CUSTOM)**
|
|
||||||
- text ➜ set the status text _**type: string**_
|
|
||||||
|
|
||||||
## system: (the configuration for the ticket system)
|
|
||||||
- ticket_channel ➜ channel where you are going to set `!ticket msg` _**type: discord channel id**_
|
|
||||||
- max_allowed_tickets ➜ the maximum allowed tickets per person _**type: number**_
|
|
||||||
- enable_DM_Messages ➜ enable DM messages _**type: boolean**_
|
|
||||||
- enable_category ➜ enable category _**type: boolean**_
|
|
||||||
- ticket_category ➜ the category id _**type: discord category id**_
|
|
||||||
- has@everyoneaccess ➜ when enabled everyone has acces to the tickets _**type: boolean**_
|
|
||||||
- member_role ➜ this role doesn't have access to tickets _**type: discord role id**_
|
|
||||||
- enable_transcript ➜ enable the transcript _**type: boolean**_
|
|
||||||
- transcript_channel ➜ the transcript channel id _**type: discord channel id**_
|
|
||||||
|
|
||||||
## messages: (general, dm, ticket)
|
|
||||||
- nopermissions ➜ the message when someone doesn't have permissions _**type: string**_
|
|
||||||
- alreadyCreated ➜ if you have too much tickets open _**type: string**_
|
|
||||||
- newTicket ➜ when you create a new ticket _**type: string**_
|
|
||||||
- closeTicket ➜ when you close a ticket _**type: string**_
|
|
||||||
- newTicketEmbed ➜ the first message in the ticket channel _**type: string**
|
|
||||||
|
|
||||||
## layout: (ticketEmbed, ticketMsg, transcript)
|
|
||||||
`transcript` doesn't have all the options
|
|
||||||
|
|
||||||
- customColorEnabled ➜ custom embed color enabled _**type: boolean**
|
|
||||||
- customColor ➜ the custom color _**type: hex color (#000000)**
|
|
||||||
- footerEnabled ➜ custom footer enabled _**type: boolean**
|
|
||||||
- footer ➜ the custom footer _**type: string**
|
|
||||||
- thumbnailEnabled ➜ custom thumbnail enabled _**type: boolean**
|
|
||||||
- thumbnailURL ➜ the image _**type: string**
|
|
||||||
|
|
||||||
## options: (per ticket)
|
|
||||||
color is not needed when `isURL` is `true`
|
|
||||||
|
|
||||||
- enabled ➜ enable this ticket _**type: boolean**
|
|
||||||
- icon ➜ the button emoji _**type: emoji or custom emoji**
|
|
||||||
- description ➜ ticket description _**type: string**
|
|
||||||
- name ➜ ticket name _**type: string**
|
|
||||||
- channel_prefix ➜ ticket prefix _**type: string**
|
|
||||||
- color ➜ button color _**type: string (red|green|blue|gray|none)**
|
|
||||||
- isURL ➜ create link to a website instead of a normal ticket _**type: boolean**
|
|
||||||
- url ➜ the website to go to _**type: string**
|
|
||||||
|
|
||||||
# thanks for using open-ticket
|
|
||||||
I didn't know that open-tickets was going to be so much used. I will be creating more updates in the future!
|
|
||||||
|
|
||||||
If you have an idea for new updates you can always say it in my discord server!
|
|
||||||
|
|
||||||
open-tickets v1.3.2
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Question & Answer
|
|
||||||
## How to install node.js 16?
|
|
||||||
You can install the latest version of node.js on their [website](https://nodejs.org/en/download/). You also need `npm`!
|
|
||||||
|
|
||||||
## How to install all the npm packages?
|
|
||||||
If you installed node.js successful, you can run `npm install` in the command prompt and all the required modules will be installed.
|
|
||||||
|
|
||||||
## Where is the config file documentation?
|
|
||||||
You can find it [here](...)
|
|
||||||
|
|
||||||
**How to start the bot?**
|
|
||||||
If you successfully installed all the npm modules (see above), you can run `npm start`
|
|
||||||
|
|
||||||
## Do I need to know discord.js?
|
|
||||||
Technically not, but it is useful to know if there is an error.
|
|
||||||
|
|
||||||
## Why do I get this error?
|
|
||||||
**Invalid token:**
|
|
||||||
|
|
||||||
_Your discord token is not correct, try to look in the config.json file if it's the correct token._
|
|
||||||
|
|
||||||
**Privileged intent provided is not enabled or whitelisted:**
|
|
||||||
|
|
||||||
_You must enable all the **Gateaway Intents** in the developer panel in the "bot" tab_
|
|
||||||
|
|
||||||
### Report other errors to the discord server!
|
|
||||||
@@ -1,37 +1,387 @@
|
|||||||
const discord = require('discord.js')
|
/**
|
||||||
const config = require('./config.json')
|
____ _____ ______ _ _ _______ _____ _____ _ ________ _______
|
||||||
const intents = discord.Intents
|
/ __ \| __ \| ____| \ | | |__ __|_ _/ ____| |/ / ____|__ __|
|
||||||
const client = new discord.Client({intents:[intents.FLAGS.GUILDS,intents.FLAGS.GUILD_MESSAGES,intents.FLAGS.GUILD_MEMBERS]})
|
| | | | |__) | |__ | \| | | | | || | | ' /| |__ | |
|
||||||
exports.client = client
|
| | | | ___/| __| | . ` | | | | || | | < | __| | |
|
||||||
|
| |__| | | | |____| |\ | | | _| || |____| . \| |____ | |
|
||||||
|
\____/|_| |______|_| \_| |_| |_____\_____|_|\_\______| |_|
|
||||||
|
|
||||||
|
Hey! we are looking for you!
|
||||||
|
Do you speak a language that isn't yet in our /languages directory
|
||||||
|
or do you speak one that isn't up-to-date? Open Ticket needs
|
||||||
|
translators for lots of different languages!
|
||||||
|
Feel free to join our translator team and help us improve Open Ticket!
|
||||||
|
|
||||||
require("./checker")()
|
|
||||||
|
|
||||||
|
|
||||||
|
SUGGESTING NEW FEATURES:
|
||||||
|
=====================
|
||||||
|
Open Ticket is a community project. This means that
|
||||||
|
almost all feature ideas come from our community.
|
||||||
|
Are you missing something you want in open ticket?
|
||||||
|
Then join our Discord server and we will add it (if possible)
|
||||||
|
|
||||||
|
Did you know that 80% of all features in OT were ideas from our community?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
INFORMATION:
|
||||||
|
============
|
||||||
|
Open Ticket v3.4.4 - © DJdj Development
|
||||||
|
|
||||||
|
discord: https://discord.dj-dj.be
|
||||||
|
website: https://www.dj-dj.be
|
||||||
|
github: https://openticket.dj-dj.be
|
||||||
|
support e-mail: support@dj-dj.be
|
||||||
|
|
||||||
|
Config files:
|
||||||
|
./config.json
|
||||||
|
./transcriptconfig.json
|
||||||
|
|
||||||
|
Send ./openticketdebug.txt when there are errors!
|
||||||
|
*/
|
||||||
|
|
||||||
|
const discord = require("discord.js")
|
||||||
|
const fs = require('fs')
|
||||||
|
const {GatewayIntentBits,Partials} = discord
|
||||||
|
const client = new discord.Client({
|
||||||
|
intents:[
|
||||||
|
GatewayIntentBits.DirectMessages,
|
||||||
|
GatewayIntentBits.GuildInvites,
|
||||||
|
GatewayIntentBits.GuildMembers,
|
||||||
|
GatewayIntentBits.GuildMessages,
|
||||||
|
GatewayIntentBits.Guilds,
|
||||||
|
GatewayIntentBits.MessageContent
|
||||||
|
],
|
||||||
|
partials:[Partials.Channel,Partials.Message]
|
||||||
|
})
|
||||||
|
exports.client = client
|
||||||
|
client.setMaxListeners(50)
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","created client")
|
||||||
|
|
||||||
|
var tempconfig = require("./config.json")
|
||||||
|
/**@type {Boolean} */
|
||||||
|
var isDevConfig = false
|
||||||
|
|
||||||
|
if (process.argv.some((v) => v == "--devconfig")){
|
||||||
|
isDevConfig = true
|
||||||
|
try{
|
||||||
|
tempconfig = require("./devconfig.json")
|
||||||
|
}catch{tempconfig = require("./config.json")}
|
||||||
|
}else{
|
||||||
|
tempconfig = require("./config.json")
|
||||||
|
}
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded flags")
|
||||||
|
|
||||||
|
exports.developerConfig = isDevConfig
|
||||||
|
|
||||||
|
const config = tempconfig
|
||||||
|
exports.config = config
|
||||||
|
|
||||||
|
const tsconfig = isDevConfig ? require("./devtsconfig.json") : require("./transcriptconfig.json")
|
||||||
|
exports.tsconfig = tsconfig
|
||||||
|
|
||||||
|
const language = require("./core/languageManager").language
|
||||||
|
exports.language = language
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded language")
|
||||||
|
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded config")
|
||||||
|
exports.storage = require('./core/dynamicdatabase/storage')
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","loaded storage")
|
||||||
|
|
||||||
|
exports.errorLog = require("./core/errorLogSystem")
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","LOADED LOGGING SYSTEM")
|
||||||
|
if (process.argv.some((v) => v == "--debug")) console.log("[TEMP_DEBUG]","switching to new logs")
|
||||||
|
this.errorLog.log("debug","loaded new logs")
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
exports.buttons = {
|
||||||
|
close:require("./core/interactionHandlers/buttons/close"),
|
||||||
|
firstmsg:require("./core/interactionHandlers/buttons/firstmsg"),
|
||||||
|
verifybars:require("./core/interactionHandlers/buttons/verifyBars")
|
||||||
|
}
|
||||||
|
this.errorLog.log("debug","loaded buttons & embeds")
|
||||||
|
|
||||||
client.on('ready',async () => {
|
client.on('ready',async () => {
|
||||||
const chalk = await (await import("chalk")).default
|
this.errorLog.log("debug","client logged in")
|
||||||
console.log(chalk.green("open-ticket ready!"))
|
this.actionRecorder.push({
|
||||||
if (config.logs){chalk.white("\n\nlogs:\n============")}
|
category:"ot.managers.djs",
|
||||||
if (config.status.enabled){
|
file:"index.js",
|
||||||
client.user.setActivity(config.status.text,{type:config.status.type})
|
time:new Date().getTime(),
|
||||||
|
type:"client.loggedin.success"
|
||||||
|
})
|
||||||
|
var statusSet = false
|
||||||
|
const setStatus = (type,text) => {
|
||||||
|
if (statusSet == true) return
|
||||||
|
const getTypeEnum = (text) => {
|
||||||
|
if (text.toLowerCase() == "playing") return discord.ActivityType.Playing
|
||||||
|
else if (text.toLowerCase() == "listening") return discord.ActivityType.Listening
|
||||||
|
else if (text.toLowerCase() == "watching") return discord.ActivityType.Watching
|
||||||
|
else return discord.ActivityType.Listening
|
||||||
|
}
|
||||||
|
client.user.setActivity(text,{type:getTypeEnum(type)})
|
||||||
|
statusSet = true
|
||||||
}
|
}
|
||||||
|
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")
|
||||||
|
|
||||||
|
if (config.status.enabled){
|
||||||
|
setStatus(config.status.type,config.status.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
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"|String} */
|
||||||
|
const data = fs.readFileSync("./storage/slashcmdEnabled.txt").toString()
|
||||||
|
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.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!"))
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//load plugins
|
||||||
|
this.actionRecorder.push({
|
||||||
|
category:"ot.managers.plugins",
|
||||||
|
file:"./core/api/pluginlauncher.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"plugins.loading"
|
||||||
|
})
|
||||||
|
require("./core/api/pluginlauncher")()
|
||||||
|
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){
|
||||||
|
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"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
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')()
|
||||||
|
require("./commands/help")()
|
||||||
|
require("./commands/close")()
|
||||||
|
require("./commands/delete")()
|
||||||
|
require("./commands/rename")()
|
||||||
|
require("./commands/add")()
|
||||||
|
require("./commands/remove")()
|
||||||
|
require("./commands/reopen")()
|
||||||
|
require("./commands/claim")()
|
||||||
|
require("./commands/unclaim")()
|
||||||
|
require("./commands/change")()
|
||||||
|
this.actionRecorder.push({
|
||||||
|
category:"ot.managers.loader",
|
||||||
|
file:"./index.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"commands.success"
|
||||||
|
})
|
||||||
|
|
||||||
|
this.actionRecorder.push({
|
||||||
|
category:"ot.managers.loader",
|
||||||
|
file:"./index.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"core.loading"
|
||||||
|
})
|
||||||
|
this.errorLog.log("debug","LOADING CORE")
|
||||||
|
//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")()
|
||||||
|
|
||||||
|
this.actionRecorder.push({
|
||||||
|
category:"ot.managers.loader",
|
||||||
|
file:"./index.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"core.success"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
this.actionRecorder.push({
|
||||||
|
category:"ot.managers.loader",
|
||||||
|
file:"./index.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"api.loading"
|
||||||
|
})
|
||||||
|
this.errorLog.log("debug","loading api")
|
||||||
|
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"
|
||||||
})
|
})
|
||||||
|
|
||||||
var storage = require('./storage/storage')
|
this.actionRecorder.push({
|
||||||
exports.TicketStorage = storage.ticketStorage
|
category:"ot.managers.loader",
|
||||||
exports.userTicketStorage = storage.userTicketStorage
|
file:"./index.js",
|
||||||
exports.transcriptStorage = storage.transcriptStorage
|
time:new Date().getTime(),
|
||||||
exports.ticketNumberStorage = storage.ticketNumberStorage
|
type:"debugsystem.loading"
|
||||||
|
})
|
||||||
|
|
||||||
var ticket = require('./commands/ticket')
|
const debugLog = (debugString) => {
|
||||||
ticket()
|
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=========================="
|
||||||
|
fs.writeFileSync("./openticketdebug.txt",content+"\nDEBUG: "+debugString)
|
||||||
|
}
|
||||||
|
this.errorLog.clearDebugFile()
|
||||||
|
}
|
||||||
|
const errorLog = (errorString,stack) => {
|
||||||
|
if (!APIConfig.disable.debug.all){
|
||||||
|
const content = fs.existsSync("./openticketdebug.txt") ? fs.readFileSync("./openticketdebug.txt").toString() : "==========================\n<OPEN TICKET DEBUG FILE:>\n=========================="
|
||||||
|
fs.writeFileSync("./openticketdebug.txt",content+"\nERROR: "+errorString+" STACK: "+stack)
|
||||||
|
}
|
||||||
|
this.errorLog.clearDebugFile()
|
||||||
|
}
|
||||||
|
this.errorLog.log("debug","OT error system loaded successfully")
|
||||||
|
|
||||||
var ticketSystem = require('./commands/ticketSystem')
|
client.on("debug", async (message) => {
|
||||||
ticketSystem()
|
if (message.startsWith("Provided token:")){
|
||||||
|
debugLog("Provided token: ***********bot token is invisible**************...")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
debugLog(message)
|
||||||
|
});
|
||||||
|
|
||||||
var ticketExtra = require("./commands/ticketExtra")
|
process.on("uncaughtException",async (error,origin) => {
|
||||||
ticketExtra()
|
const chalk = await (await import("chalk")).default
|
||||||
|
console.log(chalk.red("\nOPEN TICKET ERROR: ")+error+"\n"+chalk.green("\nCreate a ticket in our support server for more information!\nIf you do this, you might help us to avoid a future bug!\n"))
|
||||||
|
errorLog(error.name+": "+error.message+" | origin: "+origin,error.stack)
|
||||||
|
|
||||||
var database = require('./commands/database')
|
APIEvents.onError(error.name+": "+error.message,new Date())
|
||||||
database()
|
|
||||||
|
|
||||||
|
//TEMPORARY INTEGRATION FOR LIVESTATUS ERROR UPLOADER:
|
||||||
|
try {
|
||||||
|
await require("./core/utils/liveStatus").liveStatusUploadManager(error.name+": "+error.message+" | origin: "+origin+"\n"+error.stack)
|
||||||
|
} catch {this.errorLog.log("info","FAILED TO AUTO-REPORT ERROR! (you can ignore this error)")}
|
||||||
|
})
|
||||||
|
|
||||||
client.login(config.auth_token)
|
this.actionRecorder.push({
|
||||||
|
category:"ot.managers.loader",
|
||||||
|
file:"./index.js",
|
||||||
|
time:new Date().getTime(),
|
||||||
|
type:"debugsystem.success"
|
||||||
|
})
|
||||||
|
|
||||||
|
const token = config.token.fromENV ? process.env.TOKEN : config.token.value
|
||||||
|
client.login(token)
|
||||||
|
this.errorLog.log("debug","login with token")
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"ChilledBroke#9986 & M4#5882",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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}!",
|
||||||
|
|
||||||
|
"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": "هذا الأمبد موجود بالفعل في الرسالة بالأسفل!",
|
||||||
|
"maxTicketWarning": "**تحذير:** _يمكنك فقط فتح {0} تكت في الوقت!_"
|
||||||
|
},
|
||||||
|
"helpMenu": {
|
||||||
|
"title": "الأوامر المتاحة:",
|
||||||
|
"header1": "**أذهب الى {0} لإنشاء تذكرة!**\n\n",
|
||||||
|
"header2": "**قم بكتابة أمر `/new` او `/ticket` لفتح تكت!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd": "أنشاء أيمبد مع الأزرار. (الأداريين فقط)",
|
||||||
|
"renameCmd": "إعادة تسمية التكت. (بدون مسافات)",
|
||||||
|
"closeCmd": "أغلاق التكت.",
|
||||||
|
"deleteCmd": "حذف التكت.",
|
||||||
|
"addCmd": "إضافة مستخدم الى التكت.",
|
||||||
|
"removeCmd": "إزالة مستخدم من التكت.",
|
||||||
|
"reopenCmd": "إعادة فتح تكت بعد إغلاقة.",
|
||||||
|
"changeCmd":"Change ticket type.",
|
||||||
|
"claimCmd":"Claim a ticket.",
|
||||||
|
"unclaimCmd":"Unclaim a ticket.",
|
||||||
|
"statsCmd":"View ticket stats.",
|
||||||
|
"autocloseCmd":"Set timer to automatically close ticket"
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"close": "إغلاق التكت",
|
||||||
|
"delete": "حذف التكت",
|
||||||
|
"reopen": "إعادة فتح التكت",
|
||||||
|
"closeWithReason":"close with reason"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"closedDescription": "فقط الأداريين يمكنهم التحدث في هذا التكت الأن!\n\n*أضغط على الزر بالأسفل لحذف التكت او إعادة فتحة مجدداً!*",
|
||||||
|
"createdTitle": "تم إنشاء تكت!",
|
||||||
|
"createdDescription": "تم أنشاء تكت , قم بأنتظار الدعم في الطريق!",
|
||||||
|
|
||||||
|
"newTicketDmTitle": "تكت جديد!",
|
||||||
|
"closedTicketDmTitle": "تم إغلاق التكت!",
|
||||||
|
"deletedTicketDmTitle": "تم حذف التكت!",
|
||||||
|
"closedTicketDmDescription": "تم أغلاق تذكرتك من قبل إداري",
|
||||||
|
"deletedTicketDmDescription": "تم حذف تذكرتك من قبل إداري!",
|
||||||
|
"reopenTicketDmTitle": "تم إعادة فتح تذكرتك!",
|
||||||
|
"reopenTicketDmDescription": "تم إعادة فتح التكت!",
|
||||||
|
|
||||||
|
"chooseCategory": "أختر الكتقاجوري:",
|
||||||
|
"gettingdeleted": "يتم حذف التكت...",
|
||||||
|
|
||||||
|
"none": "لا يوجد",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcript",
|
||||||
|
"processed":"This transcript is being processed",
|
||||||
|
"wait":"Please wait!",
|
||||||
|
"estimated":"Estimated time",
|
||||||
|
"available":"The transcript is available here"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"DJdj Development",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Invalid Arguments!",
|
||||||
|
"missingArgsDescription":"Missing Argument",
|
||||||
|
"noPermsTitle":"No Permissions!",
|
||||||
|
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
||||||
|
"noPermsDelete":"Only admins can delete a ticket!",
|
||||||
|
"chooseFromListTitle":"Invalid ID",
|
||||||
|
"chooseFromListDescription":"Choose one of the id's below:",
|
||||||
|
"boterror":"Bot Error!",
|
||||||
|
"notInTicketTitle":"You are not in a ticket!",
|
||||||
|
"notInTicketDescription":"This command doesn't work outside tickets!",
|
||||||
|
"ticketDoesntExist":"This ticket doesn't exist anymore!",
|
||||||
|
"roleDoesntExist":"This role doesn't exist anymore!",
|
||||||
|
"anotherOption":"This option is not a ticket but another type!",
|
||||||
|
"maxAmountTitle":"Max amount reached!",
|
||||||
|
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
|
||||||
|
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"Added {0} to this ticket!",
|
||||||
|
"userRemovedTitle":"Removed {0} from this ticket!",
|
||||||
|
"renameTitle":"Changed the name to {0}!",
|
||||||
|
"closeTitle":"Closed this ticket!",
|
||||||
|
"deleteTitle":"Deleting this ticket...",
|
||||||
|
"reopenTitle":"Re-Opened this ticket!",
|
||||||
|
|
||||||
|
"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!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Available Commands:",
|
||||||
|
"header1":"**Go to {0} to create a ticket!**\n\n",
|
||||||
|
"header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Spawn an embed with buttons. (admins only)",
|
||||||
|
"renameCmd":"Rename a ticket. (no spaces)",
|
||||||
|
"closeCmd":"Close a ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Delete Ticket",
|
||||||
|
"reopen":"Re-Open Ticket",
|
||||||
|
"closeWithReason":"close with reason"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"New Ticket!",
|
||||||
|
"closedTicketDmTitle":"Ticket Closed!",
|
||||||
|
"deletedTicketDmTitle":"Ticket Deleted!",
|
||||||
|
"closedTicketDmDescription":"Your ticket is closed!",
|
||||||
|
"deletedTicketDmDescription":"Your ticket is deleted!",
|
||||||
|
"reopenTicketDmTitle":"Ticket Re-opened!",
|
||||||
|
"reopenTicketDmDescription":"Your ticket is re-opened!",
|
||||||
|
|
||||||
|
"chooseCategory":"choose a category:",
|
||||||
|
"gettingdeleted":"Ticket is getting deleted...",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcript",
|
||||||
|
"processed":"This transcript is being processed",
|
||||||
|
"wait":"Please wait!",
|
||||||
|
"estimated":"Estimated time",
|
||||||
|
"available":"The transcript is available here"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"spyeye_",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Neplatný Argument!",
|
||||||
|
"missingArgsDescription":"Chybí Argument",
|
||||||
|
"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":"Chyba Bota!",
|
||||||
|
"notInTicketTitle":"Nejsi v ticketu!",
|
||||||
|
"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 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}!",
|
||||||
|
|
||||||
|
"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":"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. (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":"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":"Uzavřít ticket",
|
||||||
|
"delete":"Vymazat ticket",
|
||||||
|
"reopen":"Znovu otevřít ticket",
|
||||||
|
"closeWithReason":"Zzavřít s důvodem"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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 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 vymazán...",
|
||||||
|
|
||||||
|
"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":"Záznam",
|
||||||
|
"processed":"Tento záznam byl zpracován",
|
||||||
|
"wait":"Prosím počkej!",
|
||||||
|
"estimated":"Odhadovaný čas",
|
||||||
|
"available":"Záloha je uložena zde!"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"the_gamer#5095",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors": {
|
||||||
|
"missingArgsTitle": "Ugyldigt Argument!",
|
||||||
|
"missingArgsDescription": "Manglende Argument",
|
||||||
|
"noPermsTitle": "Ikke tilladelse!",
|
||||||
|
"noPermsDescription": "Du skal have tilladelsen `ADMINISTRATOR` eller være på listen over tilladte roller!",
|
||||||
|
"noPermsDelete": "Kun administratorer kan slette en ticket!",
|
||||||
|
"chooseFromListTitle": "Ugyldigt ID",
|
||||||
|
"chooseFromListDescription": "Vælg et af id'erne nedenfor:",
|
||||||
|
"boterror": "Bot Fejl!",
|
||||||
|
"notInTicketTitle": "Du er ikke i en ticket!",
|
||||||
|
"notInTicketDescription": "Denne kommando virker ikke udenfor tickets!",
|
||||||
|
"ticketDoesntExist": "Denne ticket findes ikke længere!",
|
||||||
|
"roleDoesntExist": "Denne rolle eksisterer ikke længere!",
|
||||||
|
"anotherOption": "Denne mulighed er ikke en ticket, men en anden type!",
|
||||||
|
"maxAmountTitle": "Maks. mængde opnået!",
|
||||||
|
"maxAmountDescription": "Du har nået det maksimale antal tilladte tickets!\nSå du kan ikke oprette en ny!",
|
||||||
|
"somethingWentWrong": "**Noget gik galt!**\nPrøv venligst igen en anden gang!"
|
||||||
|
},
|
||||||
|
"commands": {
|
||||||
|
"userAddedTitle": "Føjede {0} til denne ticket!",
|
||||||
|
"userRemovedTitle": "Fjernede {0} fra denne ticket!",
|
||||||
|
"renameTitle": "Ændrede navnet til {0}!",
|
||||||
|
"closeTitle": "Lukket denne ticket!",
|
||||||
|
"deleteTitle": "Sletter denne ticket...",
|
||||||
|
"reopenTitle": "Genåbnede denne ticket!",
|
||||||
|
|
||||||
|
"claimTitle": "Denne ticket bliver nu håndteret af {0}",
|
||||||
|
"unclaimTitle": "Denne ticket bliver ikke håndteret længere!",
|
||||||
|
"changeTitle": "Ændrede ticket-type til {0}!",
|
||||||
|
|
||||||
|
"statsTitle": "Her er statestikerne til {0}!",
|
||||||
|
"autocloseTitle": "Denne ticket lukker automatisk om {0}!",
|
||||||
|
"autocloseRejectTitle": "Denne ticket lukker ikke længere automatisk!",
|
||||||
|
"autocloseWarn": "Dette har kun effekt på inaktive tickets!",
|
||||||
|
|
||||||
|
"goToTicket": "gå til ticket",
|
||||||
|
"ticketWarning": "Embedet er i meddelelsen nedenfor!",
|
||||||
|
"maxTicketWarning": "**Warning:** _Du kan kun oprette {0} ticket(s) ad gangen!_"
|
||||||
|
},
|
||||||
|
"helpMenu": {
|
||||||
|
"title": "Tilgængelige kommandoer:",
|
||||||
|
"header1": "**Gå til {0} for at oprette en ticket!**\n\n",
|
||||||
|
"header2": "**Kør kommandoen `/new` eller `/ticket` for at oprette en billet!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd": "Lav et embed med buttons. (kun administratorer)",
|
||||||
|
"renameCmd": "Omdøb en ticket. (Ingen Mellemrum!!)",
|
||||||
|
"closeCmd": "Luk en ticket.",
|
||||||
|
"deleteCmd": "Slet en ticket.",
|
||||||
|
"addCmd": "Tilføj en bruger til ticketen.",
|
||||||
|
"removeCmd": "Fjern en bruger fra ticketen.",
|
||||||
|
"reopenCmd": "Genåbn en ticket, efter at den var lukket.",
|
||||||
|
"changeCmd": "Skift ticket type.",
|
||||||
|
"claimCmd": "Håndter en ticket.",
|
||||||
|
"unclaimCmd": "Afhåndter en ticket.",
|
||||||
|
"statsCmd": "Se ticket statestiker.",
|
||||||
|
"autocloseCmd": "Angiv tiden til automatisk at lukke en ticket"
|
||||||
|
},
|
||||||
|
"buttons": {
|
||||||
|
"close": "Luk Ticket",
|
||||||
|
"delete": "Slet Ticket",
|
||||||
|
"reopen": "Genåben Ticket",
|
||||||
|
"closeWithReason": "Luk med grundlag"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"closedDescription": "Kun administratorer kan tale i denne billet nu!\n\n*Klik på knappen nedenfor for at slette eller genåbne denne billet!",
|
||||||
|
"createdTitle": "Ticket Oprettet!",
|
||||||
|
"createdDescription": "Din ticket er oprettet, du kan registrere den ved et ping!",
|
||||||
|
|
||||||
|
"newTicketDmTitle": "Nt Ticket!",
|
||||||
|
"closedTicketDmTitle": "Ticket Lukket!",
|
||||||
|
"deletedTicketDmTitle": "Ticket Slettet!",
|
||||||
|
"closedTicketDmDescription": "Din ticket er lukket!",
|
||||||
|
"deletedTicketDmDescription": "Din ticket er slettet!",
|
||||||
|
"reopenTicketDmTitle": "Ticket Genåbnet!",
|
||||||
|
"reopenTicketDmDescription": "Din ticket er genåbnet!",
|
||||||
|
|
||||||
|
"chooseCategory": "vælg en kategori:",
|
||||||
|
"gettingdeleted": "Ticketen bliver slettet...",
|
||||||
|
|
||||||
|
"none": "intet",
|
||||||
|
"reason": "grundlag",
|
||||||
|
"createdat": "lavet af",
|
||||||
|
"openedby": "åbnet af",
|
||||||
|
"deletedby": "slettet af",
|
||||||
|
"closedby": "lukket af",
|
||||||
|
|
||||||
|
"modalreason": "Hvad er grunden til at lukke denne ticket?",
|
||||||
|
"chooseATicket": "Vælg en ticket"
|
||||||
|
},
|
||||||
|
"transcripts": {
|
||||||
|
"title": "Transcript",
|
||||||
|
"processed": "Dette transcript er under behandling",
|
||||||
|
"wait": "Vent venligst!",
|
||||||
|
"estimated": "Estimeret tid",
|
||||||
|
"available": "Transcriptet er tilgængelig her"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"DJj123dj#1706",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Onjuiste parameters!",
|
||||||
|
"missingArgsDescription":"Er missen parameters",
|
||||||
|
"noPermsTitle":"Geen permissies!",
|
||||||
|
"noPermsDescription":"Je hebt de `ADMINISTRATOR` permissie nodig of je moet in de lijst van toegestane users staan!",
|
||||||
|
"noPermsDelete":"Alleen admins kunnen een ticket verwijderen!",
|
||||||
|
"chooseFromListTitle":"Onjuist ID",
|
||||||
|
"chooseFromListDescription":"Kies een van de id's hier onder:",
|
||||||
|
"boterror":"Bot Error!",
|
||||||
|
"notInTicketTitle":"Je bent niet in een ticket!",
|
||||||
|
"notInTicketDescription":"Deze command werkt niet buiten tickets!",
|
||||||
|
"ticketDoesntExist":"Dit ticket bestaat niet meer!",
|
||||||
|
"roleDoesntExist":"Deze rol bestaat niet meer!",
|
||||||
|
"anotherOption":"Deze optie is niet een ticket, maar een ander type!",
|
||||||
|
"maxAmountTitle":"Maximum numer bereikt!",
|
||||||
|
"maxAmountDescription":"Je hebt het maximum aantal openstaande tickets bereikt!\nDus je kan geen nieuwe meer maken!",
|
||||||
|
"somethingWentWrong":"**Iets ging fout!**\nProbeer een andere keer opnieuw!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"{0} is toegevoegd aan dit ticket!",
|
||||||
|
"userRemovedTitle":"{0} is verwijderd van dit ticket!",
|
||||||
|
"renameTitle":"De naam is veranderd naar {0}!",
|
||||||
|
"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!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Beschikbare Commands:",
|
||||||
|
"header1":"**Ga naar {0} om een ticket te maken!**\n\n",
|
||||||
|
"header2":"**Run de command `/new` of `/ticket` om een ticket te maken!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Spawn een embed met knoppen. (alleen admins)",
|
||||||
|
"renameCmd":"Hernoem een ticket. (geen spaties)",
|
||||||
|
"closeCmd":"Sluit een ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Verwijder Ticket",
|
||||||
|
"reopen":"Heropen Ticket",
|
||||||
|
"closeWithReason":"sluit met reden"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"Nieuw Ticket!",
|
||||||
|
"closedTicketDmTitle":"Ticket Gesloten!",
|
||||||
|
"deletedTicketDmTitle":"Ticket Verwijderd!",
|
||||||
|
"closedTicketDmDescription":"Je ticket is gesloten!",
|
||||||
|
"deletedTicketDmDescription":"Je ticket is verwijderd!",
|
||||||
|
"reopenTicketDmTitle":"Ticket Heropend!",
|
||||||
|
"reopenTicketDmDescription":"Je ticket is heropend!",
|
||||||
|
|
||||||
|
"chooseCategory":"kies een categorie:",
|
||||||
|
"gettingdeleted":"Ticket wordt verwijderd...",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcript",
|
||||||
|
"processed":"Dit transcript wordt verwerkt",
|
||||||
|
"wait":"Gelieve te wachten!",
|
||||||
|
"estimated":"Geschatte tijd",
|
||||||
|
"available":"Het transcript is hier beschikbaar"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"DJdj Development",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Invalid Arguments!",
|
||||||
|
"missingArgsDescription":"Missing Argument",
|
||||||
|
"noPermsTitle":"No Permissions!",
|
||||||
|
"noPermsDescription":"You need the `ADMINISTRATOR` permission or be in the list of allowed roles!",
|
||||||
|
"noPermsDelete":"Only admins can delete a ticket!",
|
||||||
|
"chooseFromListTitle":"Invalid ID",
|
||||||
|
"chooseFromListDescription":"Choose one of the id's below:",
|
||||||
|
"boterror":"Bot Error!",
|
||||||
|
"notInTicketTitle":"You are not in a ticket!",
|
||||||
|
"notInTicketDescription":"This command doesn't work outside tickets!",
|
||||||
|
"ticketDoesntExist":"This ticket doesn't exist anymore!",
|
||||||
|
"roleDoesntExist":"This role doesn't exist anymore!",
|
||||||
|
"anotherOption":"This option is not a ticket but another type!",
|
||||||
|
"maxAmountTitle":"Max amount reached!",
|
||||||
|
"maxAmountDescription":"You reached the maximum number of tickets allowed!\nSo you can't create a new one!",
|
||||||
|
"somethingWentWrong":"**Something went wrong!**\nPlease try again another time!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"Added {0} to this ticket!",
|
||||||
|
"userRemovedTitle":"Removed {0} from this ticket!",
|
||||||
|
"renameTitle":"Changed the name to {0}!",
|
||||||
|
"closeTitle":"Closed this ticket!",
|
||||||
|
"deleteTitle":"Deleting this ticket...",
|
||||||
|
"reopenTitle":"Re-Opened this ticket!",
|
||||||
|
|
||||||
|
"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!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Available Commands:",
|
||||||
|
"header1":"**Go to {0} to create a ticket!**\n\n",
|
||||||
|
"header2":"**Run the command `/new` or `/ticket` to create a ticket!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Spawn an embed with buttons. (admins only)",
|
||||||
|
"renameCmd":"Rename a ticket. (no spaces)",
|
||||||
|
"closeCmd":"Close a ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Delete Ticket",
|
||||||
|
"reopen":"Re-Open Ticket",
|
||||||
|
"closeWithReason":"close with reason"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"New Ticket!",
|
||||||
|
"closedTicketDmTitle":"Ticket Closed!",
|
||||||
|
"deletedTicketDmTitle":"Ticket Deleted!",
|
||||||
|
"closedTicketDmDescription":"Your ticket is closed!",
|
||||||
|
"deletedTicketDmDescription":"Your ticket is deleted!",
|
||||||
|
"reopenTicketDmTitle":"Ticket Re-opened!",
|
||||||
|
"reopenTicketDmDescription":"Your ticket is re-opened!",
|
||||||
|
|
||||||
|
"chooseCategory":"choose a category:",
|
||||||
|
"gettingdeleted":"Ticket is getting deleted...",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcript",
|
||||||
|
"processed":"This transcript is being processed",
|
||||||
|
"wait":"Please wait!",
|
||||||
|
"estimated":"Estimated time",
|
||||||
|
"available":"The transcript is available here"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Sanke#6086",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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",
|
||||||
|
"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!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"{0} a été ajouté à ce ticket!",
|
||||||
|
"userRemovedTitle":"Supprimé {0} de ce ticket!",
|
||||||
|
"renameTitle":"Changement du nom en {0}!",
|
||||||
|
"closeTitle":"Fermé ce ticket!",
|
||||||
|
"deleteTitle":"Suppression de ce ticket...",
|
||||||
|
"reopenTitle":"A rouvert ce ticket!",
|
||||||
|
|
||||||
|
"claimTitle":"Ce ticket est maintenant réclamé à {0}",
|
||||||
|
"unclaimTitle":"Ce ticket n'est pas réclamé!",
|
||||||
|
"changeTitle":"Modification du type de ticket en {0}!",
|
||||||
|
|
||||||
|
"statsTitle":"Voici les statistiques pour {0}!",
|
||||||
|
"autocloseTitle":"Ce ticket sera automatiquement clôturé après {0}!",
|
||||||
|
"autocloseRejectTitle":"Ce ticket ne sera plus clôturé automatiquement!",
|
||||||
|
"autocloseWarn":"Cela n'affecte que les tickets inactifs!",
|
||||||
|
|
||||||
|
"goToTicket":"Aller au ticket",
|
||||||
|
"ticketWarning":"L'intégration est dans le message ci-dessous!",
|
||||||
|
"maxTicketWarning":"**Attention :** _Vous ne pouvez créer que {0} ticket(s) à la fois !_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"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.",
|
||||||
|
"changeCmd":"Changer le type de ticket.",
|
||||||
|
"claimCmd":"Réclamer un billet",
|
||||||
|
"unclaimCmd":"Annuler la réclamation d'un ticket.",
|
||||||
|
"statsCmd":"Afficher les statistiques des tickets.",
|
||||||
|
"autocloseCmd":"Définir une minuterie pour fermer automatiquement le ticket"
|
||||||
|
},
|
||||||
|
"buttons":{
|
||||||
|
"close":"Fermer le ticket",
|
||||||
|
"delete":"Supprimer le billet",
|
||||||
|
"reopen":"Billet de réouverture",
|
||||||
|
"closeWithReason":"fermer avec une raison"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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éé !",
|
||||||
|
"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 !",
|
||||||
|
|
||||||
|
"chooseCategory":"choisissez une catégorie:",
|
||||||
|
"gettingdeleted":"Le ticket est en cours de suppression...",
|
||||||
|
|
||||||
|
"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:",
|
||||||
|
"available":"La transcript est disponible ici"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"david.#8276 ",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Ungültiges Argument!",
|
||||||
|
"missingArgsDescription":"Fehlendes Argument!",
|
||||||
|
"noPermsTitle":"Du hast keine Rechte!",
|
||||||
|
"noPermsDescription":"Du benötigst die `ADMINISTRATOR` Rechte oder die erlaubte Rolle",
|
||||||
|
"noPermsDelete":"Nur Administratoren können ein Ticket löschen!",
|
||||||
|
"chooseFromListTitle":"Ungültige ID",
|
||||||
|
"chooseFromListDescription":"Wählen Sie eine der folgenden ID's:",
|
||||||
|
"boterror":"Bot Fehler!",
|
||||||
|
"notInTicketTitle":"Du bist in keinem Ticket!",
|
||||||
|
"notInTicketDescription":"Der Befehl funktioniert außerhalb eines Tickets nicht!",
|
||||||
|
"ticketDoesntExist":"Das Ticket exisitert nicht mehr!",
|
||||||
|
"roleDoesntExist":"Die Rolle exisitiert nicht mehr!",
|
||||||
|
"anotherOption":"Diese Option ist kein Ticket, sondern eine andere Art!",
|
||||||
|
"maxAmountTitle":"Das Limit wurde erreicht!",
|
||||||
|
"maxAmountDescription":"Sie haben die maximal zulässige Anzahl von Tickets erreicht!\nSie können also keine neuen erstellen.!",
|
||||||
|
"somethingWentWrong":"**Etwas ist schief gelaufen!**\nBitte versuchen Sie es ein anderes Mal!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"User geaddet!",
|
||||||
|
"userRemovedTitle":"User entfernt!",
|
||||||
|
"renameTitle":"Der Name wurde geändert!",
|
||||||
|
"closeTitle":"Dieses Ticket schließen!",
|
||||||
|
"deleteTitle":"Löschen Sie dieses Ticket!",
|
||||||
|
"reopenTitle":"Öffne dieses Ticket erneut!",
|
||||||
|
|
||||||
|
"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:** _Es können maximal {0} Tickets zur gleichen Zeit geöffnet sein!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Hilfe Menu:",
|
||||||
|
"header1":"**Gehe zu {0} um ein Ticket zu erstellen!**\n\n",
|
||||||
|
"header2":"**Führen Sie den Befehl `/new` oder `/ticket` um ein Ticket zu erstellen!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Eine Einbettung mit Schaltflächen erzeugen. (nur admins)",
|
||||||
|
"renameCmd":"Ein Ticket umbenennen. (keine Leerzeichen)",
|
||||||
|
"closeCmd":"Schließen Sie ein Ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Ticket löschen",
|
||||||
|
"reopen":"Ticket wieder öffnen",
|
||||||
|
"closeWithReason":"Geschlossen mit dem Grund"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"Neues Ticket!",
|
||||||
|
"closedTicketDmTitle":"Ticket schließen!",
|
||||||
|
"deletedTicketDmTitle":"Ticket löschen!",
|
||||||
|
"closedTicketDmDescription":"Ihr Ticket ist geschlossen!",
|
||||||
|
"deletedTicketDmDescription":"Ihr Ticket ist gelöscht!",
|
||||||
|
"newTranscriptTitle":"Eine neue Transcript finden Sie hier!",
|
||||||
|
"hereIsTheTranscript":"Hier ist das Transcript:",
|
||||||
|
|
||||||
|
"chooseCategory":"Wähle eine Kategorie:",
|
||||||
|
"gettingdeleted":"Ticket wird gelöscht...",
|
||||||
|
|
||||||
|
"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!"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcript",
|
||||||
|
"processed":"Das Transcript wird erstellt",
|
||||||
|
"wait":"Bitte warten!",
|
||||||
|
"estimated":"Verbleibende Zeit",
|
||||||
|
"available":"Das Transcript ist hier verfügbar"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"ꙅoᴎɒᎸɘƚꙅ#3744",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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":"Το αντίγραφο είναι ανοιχτώ εδώ!"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Snowy",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"erxg",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Maurizio#0268",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Argomenti non validi!",
|
||||||
|
"missingArgsDescription":"Argomenti mancanti",
|
||||||
|
"noPermsTitle":"Non hai i permessi sufficienti!",
|
||||||
|
"noPermsDescription":"Hai bisogno del permesso `ADMINISTRATOR` o essere nella lista dei ruoli consentiti!",
|
||||||
|
"noPermsDelete":"Solo gli amministratori possono eliminare i ticket!",
|
||||||
|
"chooseFromListTitle":"ID non valido",
|
||||||
|
"chooseFromListDescription":"Scegli uno degli id sottostanti:",
|
||||||
|
"boterror":"Errore del bot!",
|
||||||
|
"notInTicketTitle":"Non sei in un ticket!",
|
||||||
|
"notInTicketDescription":"Questo comando non funziona al di fuori di un ticket!",
|
||||||
|
"ticketDoesntExist":"Questo ticket non esiste!",
|
||||||
|
"roleDoesntExist":"Questo ruolo non esiste!",
|
||||||
|
"anotherOption":"Questa opzione non è un ticket ma un'altra!",
|
||||||
|
"maxAmountTitle":"Massimo ammontare raggiunto!",
|
||||||
|
"maxAmountDescription":"Hai raggiunto il massimo di ticket aperti!\nNon puoi creare altri!",
|
||||||
|
"somethingWentWrong":"*Qualcosa è andato storto!*\nPerfavore riprova un'altra volta!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"Aggiunti {0} a questo ticket!",
|
||||||
|
"userRemovedTitle":"Rimossi {0} da questo ticket!",
|
||||||
|
"renameTitle":"Cambiato il nome a {0}!",
|
||||||
|
"closeTitle":"Ticket chiuso!",
|
||||||
|
"deleteTitle":"Eliminando questo ticket...",
|
||||||
|
"reopenTitle":"Ri-aperto questo ticket!",
|
||||||
|
|
||||||
|
"claimTitle":"Questo ticket adesso è gestito da {0}",
|
||||||
|
"unclaimTitle":"Questo ticket non è più gestito!",
|
||||||
|
"changeTitle":"Ticket cambiato in {0}!",
|
||||||
|
|
||||||
|
"statsTitle":"Queste sono le stats per {0}!",
|
||||||
|
"autocloseTitle":"Questo ticket sarà eliminato direttamente dopo {0}!",
|
||||||
|
"autocloseRejectTitle":"Questo ticket non sarà più chiuso automaticamente!",
|
||||||
|
"autocloseWarn":"Questo vale solo per i ticket inattivi!",
|
||||||
|
|
||||||
|
"goToTicket":"vai al ticket",
|
||||||
|
"ticketWarning":"L'embed è nel messaggio sotto!",
|
||||||
|
"maxTicketWarning":"*Attenzione:* Tu puoi creare solo {0} ticket alla volta!"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Comandi disponibili:",
|
||||||
|
"header1":"*Vai a {0} per creare un ticket!*\n\n",
|
||||||
|
"header2":"*Esegui il comando `/new` o `/ticket` per creare un ticket!*\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Crea un embed con bottoni. (solo amministratori)",
|
||||||
|
"renameCmd":"Rinomina un ticket. (senza spazi)",
|
||||||
|
"closeCmd":"Chiudi un ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Elimini",
|
||||||
|
"reopen":"Ri-apri un ticket",
|
||||||
|
"closeWithReason":"chiudi con motivo"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"Nuovo ticket!",
|
||||||
|
"closedTicketDmTitle":"Ticket chiuso!",
|
||||||
|
"deletedTicketDmTitle":"Ticket eliminato!",
|
||||||
|
"closedTicketDmDescription":"Il tuo ticket è chiuso!",
|
||||||
|
"deletedTicketDmDescription":"Il tuo ticket è eliminato!",
|
||||||
|
"reopenTicketDmTitle":"Ticket ri-aperto!",
|
||||||
|
"reopenTicketDmDescription":"Il tuo ticket è stato ri-aperto!",
|
||||||
|
|
||||||
|
"chooseCategory":"scegli una categoria:",
|
||||||
|
"gettingdeleted":"Il ticket sta per essere chiuso...",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Trascrizione",
|
||||||
|
"processed":"Questo ticket sta per essere processato",
|
||||||
|
"wait":"Perfavore attendi!",
|
||||||
|
"estimated":"Tempo estimato",
|
||||||
|
"available":"La trascrizione è disponibile qui"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"NoOneNook#0266",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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!"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"MKevas#8311",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"QuirAddon#9778",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Argumentos inválidos!",
|
||||||
|
"missingArgsDescription":"Argumento ausente",
|
||||||
|
"noPermsTitle":"Sem permissões!",
|
||||||
|
"noPermsDescription":"Você precisa da permissão `ADMINISTRATOR` ou estar na lista de funções permitidas!",
|
||||||
|
"noPermsDelete":"Somente administradores podem deletar um ticket!",
|
||||||
|
"chooseFromListTitle":"ID inválido",
|
||||||
|
"chooseFromListDescription":"Escolha um dos IDs abaixo:",
|
||||||
|
"boterror":"Erro de bot!",
|
||||||
|
"notInTicketTitle":"Você não está em um ticket!",
|
||||||
|
"notInTicketDescription":"Este comando não funciona fora dos tickets!",
|
||||||
|
"ticketDoesntExist":"Este ticket não existe mais!",
|
||||||
|
"roleDoesntExist":"Esta função não existe mais!",
|
||||||
|
"anotherOption":"Esta opção não é um ticket, mas sim outro tipo!",
|
||||||
|
"maxAmountTitle":"Quantidade máxima atingida!",
|
||||||
|
"maxAmountDescription":"Você atingiu o número máximo de tickets permitidos!\nEntão você não pode criar um novo!",
|
||||||
|
"somethingWentWrong":"**Algo deu errado!**\nPor favor, tente novamente outra vez!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"Adicionado {0} a este ticket!",
|
||||||
|
"userRemovedTitle":"Removido {0} deste ticket!",
|
||||||
|
"renameTitle":"Mudou o nome para {0}!",
|
||||||
|
"closeTitle":"Fechado este ticket!",
|
||||||
|
"deleteTitle":"Excluindo este ticket...",
|
||||||
|
"reopenTitle":"Reabriu este ticket!",
|
||||||
|
|
||||||
|
"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!!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Comandos Disponíveis:",
|
||||||
|
"header1":"**Vá para {0} para criar um ticket!**\n\n",
|
||||||
|
"header2":"**Execute o comando `/new` ou `/ticket` para criar um ticket!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Gerar uma incorporação com botões. (somente administradores)",
|
||||||
|
"renameCmd":"Renomear um ticket. (sem espaços)",
|
||||||
|
"closeCmd":"Fechar um ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Excluir Ticket",
|
||||||
|
"reopen":"Reabrir Ticket",
|
||||||
|
"closeWithReason":"fechado com motivo"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"Novo Ticket!",
|
||||||
|
"closedTicketDmTitle":"Ticket fechado!",
|
||||||
|
"deletedTicketDmTitle":"Ticket excluído!",
|
||||||
|
"closedTicketDmDescription":"Seu ticket está fechado!",
|
||||||
|
"deletedTicketDmDescription":"Seu bilhete foi excluído!",
|
||||||
|
"reopenTicketDmTitle":"Ticket reaberto!",
|
||||||
|
"reopenTicketDmDescription":"Seu ticket foi reaberto!",
|
||||||
|
|
||||||
|
"chooseCategory":"Escolha a categoria:",
|
||||||
|
"gettingdeleted":"Ticket está sendo deletado...",
|
||||||
|
|
||||||
|
"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":{
|
||||||
|
"title":"Transcrever",
|
||||||
|
"processed":"A Transcrição está em andamento",
|
||||||
|
"wait":"Por favor espere!",
|
||||||
|
"estimated":"Tempo estimado",
|
||||||
|
"available":"A Transcrição está disponível aqui"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Sanke#6086",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"Argumente Invalide",
|
||||||
|
"missingArgsDescription":"Argument Lipsa",
|
||||||
|
"noPermsTitle":"Nu ai permisiunea necesara!",
|
||||||
|
"noPermsDescription":"Ai nevoie de permisiunea de `ADMINISTRATOR`!",
|
||||||
|
"noPermsDelete":"Doar adminii pot inchide un ticket!",
|
||||||
|
"chooseFromListTitle":"Invalid ID",
|
||||||
|
"chooseFromListDescription":"Alege unul dintre id-urile urmatoare:",
|
||||||
|
"boterror":"Eroare bot!",
|
||||||
|
"notInTicketTitle":"Nu esti intr-un ticket!",
|
||||||
|
"notInTicketDescription":"Aceasta comanda nu merge inafara unui ticket!",
|
||||||
|
"ticketDoesntExist":"Acest ticket nu mai exista!",
|
||||||
|
"roleDoesntExist":"Acest rol nu mai exista!",
|
||||||
|
"anotherOption":"Aceasta optiune este altceva decat un tip de ticket!",
|
||||||
|
"maxAmountTitle":"Limita atinsa!",
|
||||||
|
"maxAmountDescription":"Ai atins limita de tickets!\nAsa ca nu mai poti creea altele noi!",
|
||||||
|
"somethingWentWrong":"**Ceva nu a mers bine!**\nTe rugam sa incerci mai tarziu!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"{0} a fost adaugat in acest ticket!",
|
||||||
|
"userRemovedTitle":"{0} a fost scos din acest ticket!",
|
||||||
|
"renameTitle":"Nume schimbat in {0}!",
|
||||||
|
"closeTitle":"Ticket inchis!",
|
||||||
|
"deleteTitle":"Se sterge ticket-ul...",
|
||||||
|
"reopenTitle":"Ticket Re-deschis!",
|
||||||
|
|
||||||
|
"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!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Comenzi disponibile:",
|
||||||
|
"header1":"**Mergi la {0} pentru a creea un ticket!**\n\n",
|
||||||
|
"header2":"**Ruleaza comanda `/new` ori `/ticket` pentru a creea un ticket!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Trimite embed-ul cu tickete. (doar admini)",
|
||||||
|
"renameCmd":"Redenumeste un ticket. (fara spatii)",
|
||||||
|
"closeCmd":"Inchide un ticket.",
|
||||||
|
"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.",
|
||||||
|
"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",
|
||||||
|
"delete":"Sterge ticket-ul",
|
||||||
|
"reopen":"Re-deschide un ticket",
|
||||||
|
"closeWithReason":"Inchide cu motiv"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"Ticket nou!",
|
||||||
|
"closedTicketDmTitle":"Ticket Inchis!",
|
||||||
|
"deletedTicketDmTitle":"Ticket Sters!",
|
||||||
|
"closedTicketDmDescription":"Ticket-ul tau este inchis!",
|
||||||
|
"deletedTicketDmDescription":"Ticket-ul tau este sters!",
|
||||||
|
"reopenTicketDmTitle":"Ticket Re-deschis!",
|
||||||
|
"reopenTicketDmDescription":"Ticket-ul tau este re-deschis!",
|
||||||
|
|
||||||
|
"chooseCategory":"Alege o categorie:",
|
||||||
|
"gettingdeleted":"Ticket-ul se sterge...",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcript",
|
||||||
|
"processed":"Transcript in curs de procesare...",
|
||||||
|
"wait":"Te rugam sa astepti!",
|
||||||
|
"estimated":"Timp estimat",
|
||||||
|
"available":"Transcriptul este disponibil aici"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Apexo#0723",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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":"Транскрипт здесь доступен"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
{
|
||||||
|
"examples":{
|
||||||
|
"en-GB":"english",
|
||||||
|
"en-US":"english",
|
||||||
|
"no": "Norwegian",
|
||||||
|
"nl":"dutch",
|
||||||
|
"ro":"romanian",
|
||||||
|
"de":"german",
|
||||||
|
"cs":"czech",
|
||||||
|
"fr":"french",
|
||||||
|
"es-ES":"spanish",
|
||||||
|
"it":"italian",
|
||||||
|
"ru":"russian",
|
||||||
|
"tr": "Türkçe",
|
||||||
|
|
||||||
|
"MISSING":"arabic,portuguese",
|
||||||
|
"NOTAVAILABLE":"arabic,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.",
|
||||||
|
"cs":"A list of the available commands",
|
||||||
|
"fr":"Une liste des commandes.",
|
||||||
|
"es-ES":"Una lista de los comandos disponibles.",
|
||||||
|
"it":"Una lista di tutti i comandi disponibili.",
|
||||||
|
"ru":"Список доступных команд",
|
||||||
|
"tr": "Kullanılabilir komutların listesi."
|
||||||
|
},
|
||||||
|
"message":{
|
||||||
|
"en-GB":"Spawn an embed with buttons.",
|
||||||
|
"en-US":"Spawn an embed with buttons.",
|
||||||
|
"no":"Legg inn en melding i denne kanalen",
|
||||||
|
"nl":"Spawn een embed met knoppen.",
|
||||||
|
"ro":"Deschide un embed cu butoane.",
|
||||||
|
"de":"Sendet ein Embed mit Knöpfen.",
|
||||||
|
"cs":"Spawn an embed with buttons.",
|
||||||
|
"fr":"Créer un embed avec des boutons.",
|
||||||
|
"es-ES":"Genera un embed con botones.",
|
||||||
|
"it":"Genera un embed con un pulsante.",
|
||||||
|
"ru":"Создать embed с кнопками",
|
||||||
|
"tr": "Butonlar ile bir yerleştirme oluşturun."
|
||||||
|
},
|
||||||
|
"close":{
|
||||||
|
"en-GB":"Close a ticket.",
|
||||||
|
"en-US":"Close a ticket.",
|
||||||
|
"no":"Lukk ticket.",
|
||||||
|
"nl":"Sluit een ticket",
|
||||||
|
"ro":"Inchide un ticket.",
|
||||||
|
"de":"Schließe ein Ticket.",
|
||||||
|
"cs":"Close a ticket.",
|
||||||
|
"fr":"Fermer un ticket.",
|
||||||
|
"es-ES":"Cierra un ticket.",
|
||||||
|
"it":"Chiudi un ticket.",
|
||||||
|
"ru":"Закрыть тикет",
|
||||||
|
"tr": "Bileti kapat."
|
||||||
|
},
|
||||||
|
"delete":{
|
||||||
|
"en-GB":"Delete a ticket.",
|
||||||
|
"en-US":"Delete a ticket.",
|
||||||
|
"no":"Slett ticket.",
|
||||||
|
"nl":"Verwijder een ticket",
|
||||||
|
"ro":"Sterge un ticket.",
|
||||||
|
"de":"Lösche ein Ticket.",
|
||||||
|
"cs":"Delete a ticket.",
|
||||||
|
"fr":"Supprimer un ticket.",
|
||||||
|
"es-ES":"Elimina un ticket.",
|
||||||
|
"it":"Elimina un ticket.",
|
||||||
|
"ru":"Удалить тикет",
|
||||||
|
"tr": "Bileti sil."
|
||||||
|
},
|
||||||
|
"reopen":{
|
||||||
|
"en-GB":"Re-Open a ticket.",
|
||||||
|
"en-US":"Re-Open a ticket.",
|
||||||
|
"no":"Gjenåpne ticket.",
|
||||||
|
"nl":"Heropen een ticket.",
|
||||||
|
"ro":"Re-deschide un ticket.",
|
||||||
|
"de":"Wiedereröffnung eines Tickets.",
|
||||||
|
"cs":"Re-Open a ticket.",
|
||||||
|
"fr":"Re-ouvrir un ticket.",
|
||||||
|
"es-ES":"Re-abre un ticket.",
|
||||||
|
"it":"Ri-Apri un ticket.",
|
||||||
|
"ru":"Открыть заново тикет",
|
||||||
|
"tr": "Bileti yeniden aç."
|
||||||
|
},
|
||||||
|
"add":{
|
||||||
|
"en-GB":"Add another user to a ticket.",
|
||||||
|
"en-US":"Add another user to a ticket.",
|
||||||
|
"no":"Legg til en annen bruker til ticket.",
|
||||||
|
"nl":"Voeg een andere user toe aan een ticket.",
|
||||||
|
"ro":"Adauga un utilizator la acest ticket.",
|
||||||
|
"de":"Füge einen anderen Nutzer zum Ticket hinzu.",
|
||||||
|
"cs":"Add another user to a ticket.",
|
||||||
|
"fr":"Ajouter un utilisateur au ticket.",
|
||||||
|
"es-ES":"Agrega otro usuario al ticket.",
|
||||||
|
"it":"Aggiungi un membro al ticket",
|
||||||
|
"ru":"Добавить другого пользователя в тикет",
|
||||||
|
"tr": "Bilete başka bir kullanıcı ekle."
|
||||||
|
},
|
||||||
|
"remove":{
|
||||||
|
"en-GB":"Remove a user from a ticket.",
|
||||||
|
"en-US":"Remove a user from a ticket.",
|
||||||
|
"no":"Fjern en bruker fra ticket.",
|
||||||
|
"nl":"Verwijder een user van een ticket.",
|
||||||
|
"ro":"Sterge un utilizator dintr-un ticket.",
|
||||||
|
"de":"Entferne einen Nutzer von dem Ticket.",
|
||||||
|
"cs":"Remove a user from a ticket.",
|
||||||
|
"fr":"Enlever quelqu’un du ticket.",
|
||||||
|
"es-ES":"Elimina otro usuario del ticket.",
|
||||||
|
"it":"Rimuovi un membro dal ticket",
|
||||||
|
"ru":"Удалить пользователя из тикета",
|
||||||
|
"tr": "Kullanıcıyı bir biletten kaldır."
|
||||||
|
},
|
||||||
|
"newticket":{
|
||||||
|
"en-GB":"Create a ticket",
|
||||||
|
"en-US":"Create a ticket",
|
||||||
|
"no":"Lag en ny ticket",
|
||||||
|
"nl":"Maak een ticket aan",
|
||||||
|
"ro":"Creeaza un ticket.",
|
||||||
|
"de":"Erstelle ein Ticket.",
|
||||||
|
"cs":"Create a ticket",
|
||||||
|
"fr":"Créer un ticket",
|
||||||
|
"es-ES":"Crear un ticket.",
|
||||||
|
"it":"Crea un ticket",
|
||||||
|
"ru":"Создать тикет",
|
||||||
|
"tr": "Bilet oluştur"
|
||||||
|
},
|
||||||
|
"rename":{
|
||||||
|
"en-GB":"Rename a ticket channel.",
|
||||||
|
"en-US":"Rename a ticket channel.",
|
||||||
|
"no":"Gi nytt navn til ticket kanalen.",
|
||||||
|
"nl":"Hernoem een ticket channel.",
|
||||||
|
"ro":"Redenumeste un ticket.",
|
||||||
|
"de":"Benenne einen Ticket Channel.",
|
||||||
|
"cs":"Rename a ticket channel",
|
||||||
|
"fr":"Renommer un ticket.",
|
||||||
|
"es-ES":"Renombrar un canal de ticket.",
|
||||||
|
"it":"Rinomina il canale di un ticket.",
|
||||||
|
"ru":"Переименовать канал тикета",
|
||||||
|
"tr": "Bilet kanalını yeniden adlandır."
|
||||||
|
},
|
||||||
|
"claim":{
|
||||||
|
"en-GB":"Claim a ticket.",
|
||||||
|
"en-US":"Claim a ticket.",
|
||||||
|
"no":"Overta ticket.",
|
||||||
|
"nl":"Claim een ticket.",
|
||||||
|
"ro":" ",
|
||||||
|
"de":" ",
|
||||||
|
"cs":" ",
|
||||||
|
"fr":" ",
|
||||||
|
"es-ES":" ",
|
||||||
|
"it":" ",
|
||||||
|
"ru":"Взять тикет",
|
||||||
|
"tr":"Bilet talep et."
|
||||||
|
},
|
||||||
|
"unclaim":{
|
||||||
|
"en-GB":"Un-claim a ticket.",
|
||||||
|
"en-US":"Un-claim a ticket.",
|
||||||
|
"no":"Frigjør ticket.",
|
||||||
|
"nl":"Ontclaim een ticket.",
|
||||||
|
"ro":" ",
|
||||||
|
"de":" ",
|
||||||
|
"cs":" ",
|
||||||
|
"fr":" ",
|
||||||
|
"es-ES":" ",
|
||||||
|
"it":" ",
|
||||||
|
"ru":"Снять тикет",
|
||||||
|
"tr":"Bileti iptal et."
|
||||||
|
},
|
||||||
|
"category":{
|
||||||
|
"en-GB":"Change ticket type.",
|
||||||
|
"en-US":"Change ticket type.",
|
||||||
|
"no":"Endre ticket type.",
|
||||||
|
"nl":"Verander ticket type.",
|
||||||
|
"ro":" ",
|
||||||
|
"de":" ",
|
||||||
|
"cs":" ",
|
||||||
|
"fr":" ",
|
||||||
|
"es-ES":" ",
|
||||||
|
"it":" ",
|
||||||
|
"ru":"Изменить тип тикета",
|
||||||
|
"tr":"Bilet türünü değiştir."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"n1kkec#5341",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Redactado#1673 & josuens14#5267",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"errors":{
|
||||||
|
"missingArgsTitle":"¡Argumentos inválidos!",
|
||||||
|
"missingArgsDescription":"Argumento faltante.",
|
||||||
|
"noPermsTitle":"¡Sin permisos!",
|
||||||
|
"noPermsDescription":"Necesitas el permiso de `ADMINISTRADOR` o estar en la lista de roles permitidos!",
|
||||||
|
"noPermsDelete":"Solo los administradores pueden eliminar un ticket.!",
|
||||||
|
"chooseFromListTitle":"ID Invalida",
|
||||||
|
"chooseFromListDescription":"Elije una de las ID de abajo:",
|
||||||
|
"boterror":"¡Error del bot!",
|
||||||
|
"notInTicketTitle":"¡No te encuentras en un ticket!",
|
||||||
|
"notInTicketDescription":"¡Este comando no funciona fuera de los tickets!",
|
||||||
|
"ticketDoesntExist":"¡Este ticket no existe!",
|
||||||
|
"roleDoesntExist":"¡Este rol no existe!",
|
||||||
|
"anotherOption":"¡Esta opción no es un ticket, si no otra cosa!",
|
||||||
|
"maxAmountTitle":"¡Máxima cantidad alcanzada!",
|
||||||
|
"maxAmountDescription":"¡Has alcanzado la máxima cantidad de tickets permitida!\n¡Por lo que no puedes crear otro!",
|
||||||
|
"somethingWentWrong":"**¡Algo salió mal!**\n¡Prueba dentro de un rato!"
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"userAddedTitle":"Se agregó {0} al ticket!",
|
||||||
|
"userRemovedTitle":"Se eliminó {0} del ticket!",
|
||||||
|
"renameTitle":"Cambió el nombre a {0}!",
|
||||||
|
"closeTitle":"Cerró este ticket!",
|
||||||
|
"deleteTitle":"Eliminando este ticket...",
|
||||||
|
"reopenTitle":"Re-abrió este boleto!",
|
||||||
|
|
||||||
|
"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!_"
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"title":"Comandos disponibles:",
|
||||||
|
"header1":"**¡Dirígete a {0} para crear un nuevo ticket!**\n\n",
|
||||||
|
"header2":"**¡Ejecuta el comando `/new` o `/ticket` para crear un ticket!**\n\n",
|
||||||
|
|
||||||
|
"msgCmd":"Generar un embed con botones. (Solo admins)",
|
||||||
|
"renameCmd":"Renombrar un ticket. (Sin espacios)",
|
||||||
|
"closeCmd":"Cerrar un ticket.",
|
||||||
|
"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.",
|
||||||
|
"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.",
|
||||||
|
"delete":"Eliminar ticket",
|
||||||
|
"reopen":"Re-Abrir ticket",
|
||||||
|
"closeWithReason":"cerrar con razón"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"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!",
|
||||||
|
|
||||||
|
"newTicketDmTitle":"¡Nuevo ticket!",
|
||||||
|
"closedTicketDmTitle":"¡Ticket cerrado!",
|
||||||
|
"deletedTicketDmTitle":"¡Ticket eliminado!",
|
||||||
|
"closedTicketDmDescription":"¡Tu ticket fué cerrado!",
|
||||||
|
"deletedTicketDmDescription":"¡Tu ticket fué eliminado!",
|
||||||
|
"reopenTicketDmTitle":"¡Ticket re-abierto!",
|
||||||
|
"reopenTicketDmDescription":"¡Tu ticket se vió abierto de nuevo!",
|
||||||
|
|
||||||
|
"chooseCategory":"Elije una categoría:",
|
||||||
|
"gettingdeleted":"El ticket se está viendo eliminado...",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"title":"Transcripción",
|
||||||
|
"processed":"La transcripción del ticket está siendo procesada...",
|
||||||
|
"wait":"¡Por favor, espere!",
|
||||||
|
"estimated":"Tiempo estimado",
|
||||||
|
"available":"La transcripción estará disponible aquí"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Mods HD#0661",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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":"บันทึกการสนทนาสามารถใช้งานได้ที่นี่"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
{
|
||||||
|
"_CREDITS":"Hydrâelčhâvø#1575",
|
||||||
|
"_INFO":"This file is a translation for open ticket 3.4.4",
|
||||||
|
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user