Compare commits
281
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c2aca7039 | ||
|
|
9326d0fae8 | ||
|
|
fd3ae39150 | ||
|
|
1b0da061ba | ||
|
|
07eb8f34e9 | ||
|
|
64fef62bf5 | ||
|
|
b2be76f5b6 | ||
|
|
856ccc10b9 | ||
|
|
8c6681f025 | ||
|
|
cc21e28470 | ||
|
|
7815400472 | ||
|
|
fda8a397d6 | ||
|
|
ae306332bb | ||
|
|
bc46d4ab46 | ||
|
|
b0b4e21aff | ||
|
|
fb3764eefb | ||
|
|
d5efe06fe5 | ||
|
|
cdb2673217 | ||
|
|
6018a183fb | ||
|
|
73f9f4037f | ||
|
|
b5b537e85e | ||
|
|
6ebeb7a93c | ||
|
|
7584c25e93 | ||
|
|
94b3788cfb | ||
|
|
e7d9ad374e | ||
|
|
0e597232f0 | ||
|
|
acc89990c2 | ||
|
|
ee9f8eaca1 | ||
|
|
ae8a8d1b14 | ||
|
|
38afb9c2a6 | ||
|
|
5bdb7941b6 | ||
|
|
01c1f3150e | ||
|
|
e524cccd19 | ||
|
|
ede102bddf | ||
|
|
ab5d5c06be | ||
|
|
355f078ee5 | ||
|
|
c207560743 | ||
|
|
b29dfaeaae | ||
|
|
1710111fcb | ||
|
|
805c6b8e55 | ||
|
|
d0ab311da4 | ||
|
|
92a3671768 | ||
|
|
71074e1afe | ||
|
|
e80ce1a64a | ||
|
|
5dfbce1856 | ||
|
|
407e56a806 | ||
|
|
e0f42834e5 | ||
|
|
d03abd9eeb | ||
|
|
466a4aea81 | ||
|
|
9d96d11cd3 | ||
|
|
e3b99e656e | ||
|
|
07e2a68d06 | ||
|
|
795ca4f981 | ||
|
|
5231129278 | ||
|
|
f62bc7adf9 | ||
|
|
5de6b1e906 | ||
|
|
62413505d6 | ||
|
|
20b617f6eb | ||
|
|
94510bbfb0 | ||
|
|
d51511fdb5 | ||
|
|
3447a37603 | ||
|
|
4b17aa640f | ||
|
|
3b7674f1a5 | ||
|
|
7de9339da3 | ||
|
|
e2e1e19bc8 | ||
|
|
5f19adf561 | ||
|
|
1bb70745ea | ||
|
|
589bbe5cd5 | ||
|
|
447fddea56 | ||
|
|
bf7a003799 | ||
|
|
6115ab1cc8 | ||
|
|
c2307fd1ed | ||
|
|
2a3850c3cc | ||
|
|
688c40ce7b | ||
|
|
dee2a21be9 | ||
|
|
d7ae040d60 | ||
|
|
7b6202985a | ||
|
|
a2f2c601a5 | ||
|
|
b27016df2e | ||
|
|
6341f2f71b | ||
|
|
56a5b9c7d0 | ||
|
|
f608cb71ce | ||
|
|
7c7c325307 | ||
|
|
832021d72a | ||
|
|
030554a7f5 | ||
|
|
ada5ea0c5d | ||
|
|
fb6b891835 | ||
|
|
739ad81f3f | ||
|
|
a6f67a9452 | ||
|
|
56a6540663 | ||
|
|
5f8812d261 | ||
|
|
7a3dcf4c42 | ||
|
|
7cebd4dd6a | ||
|
|
27912a0c37 | ||
|
|
67871d885a | ||
|
|
1bd0d013ed | ||
|
|
a074a17519 | ||
|
|
67af96ef5c | ||
|
|
a041f28cf7 | ||
|
|
a8c9c2ea8d | ||
|
|
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 | ||
|
|
5fc3ba3279 | ||
|
|
6df23d84bc | ||
|
|
8cab4cc686 | ||
|
|
21e3a88b87 | ||
|
|
1451769ebf | ||
|
|
da3017ff95 | ||
|
|
43186c8a0e | ||
|
|
63632e3a66 |
@@ -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,41 @@
|
|||||||
|
# 🎥 Content Creators
|
||||||
|
Hi there! We're searching for content creators to create tutorials & setup guides for Open Ticket.
|
||||||
|
You can get many great rewards from helpin us!
|
||||||
|
|
||||||
|
You can choose which type of tutorial you want to make. You can create a quick setup, full setup, plugin tutorial or something else!
|
||||||
|
You are not required to talk in the video, but make sure it has some kind of subtitles instead.
|
||||||
|
|
||||||
|
### 📄 Requirements
|
||||||
|
- 📌 At least 2k subscribers!
|
||||||
|
- 📌 A little bit of channel activity! *(minimum 2 uploads/month)*
|
||||||
|
- 📌 Video length of at least 3 minutes!
|
||||||
|
- 📌 Provide a clear link to the Open Ticket repository!
|
||||||
|
- 📌 Recommended language is English!
|
||||||
|
- 📌 Recommended platform is YouTube!
|
||||||
|
- 📌 Must be for the latest version of Open Ticket!
|
||||||
|
- 📌 **(OPTIONAL)** Speech in the video *(AI is allowed)*
|
||||||
|
|
||||||
|
|
||||||
|
### 🎁 Rewards
|
||||||
|
We won't give out any compensation in money, but we will give you some advantages!
|
||||||
|
- ✅ Advertisement of tutorial in the [README.md](../README.md)!
|
||||||
|
- ✅ Advertisement of channel in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- ✅ `Content Creator` role in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- ✅ Advertisement of tutorial & channel in documentation!
|
||||||
|
- ✅ Lot's of of views generated from GitHub traffic!
|
||||||
|
- ✅ A completely free 24/7 hosted Open Ticket bot!
|
||||||
|
- ✅ We will advertise the video to all our socials!
|
||||||
|
|
||||||
|
### 💤 Outdated Content
|
||||||
|
When a tutorial or setup guide is outdated or no longer applicable,
|
||||||
|
we will remove it from the `README.md` & documentation.
|
||||||
|
Your channel will still stay in the list of contributors, so don't worry about that!
|
||||||
|
|
||||||
|
You will be noticed at least a month before removal.
|
||||||
|
This way you can take time to create an updated tutorial if you want.
|
||||||
|
|
||||||
|
### 💬 Contact Us
|
||||||
|
If you've read all these guidelines, requirements & rewards,
|
||||||
|
you can create a ticket in our [discord server](https://discord.dj-dj.be) to start working on it!
|
||||||
|
|
||||||
|
We will try to help you as fast as possible!
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# Contributing Guidelines
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
||||||
|
|
||||||
|
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v4.0.0)
|
||||||
|
|
||||||
|
These are the Contributing Guidelines of Open Ticket!<br>
|
||||||
|
Here you can find everything you need to know about contributing to Open Ticket.<br>
|
||||||
|
This includes new features, translations & bug fixes.
|
||||||
|
|
||||||
|
### 💬 Translations
|
||||||
|
#### Step 1: View & Check
|
||||||
|
1. Check the [`./languages/`](./languages/) folder for existing translations.
|
||||||
|
2. When it doesn't exist yet, visit **[step 2](#step-2-translation)**.
|
||||||
|
3. When it does exist, check if it is outdated, incorrect or incomplete.
|
||||||
|
4. If you match one of these requirements, you can also visit **[step 2](#step-2-translating)**.
|
||||||
|
|
||||||
|
#### Step 2: Translation
|
||||||
|
1. If your language doesn't exist yet, copy the [`english.json`](./../languages/english.json) file and rename it to your language.
|
||||||
|
2. You are allowed to use a little bit of `Google Translate` or `DeepL` when mentioned in the upload. (❌ Not Recommended)
|
||||||
|
3. Only translate existing values in the json file. Don't add or remove any values from the file.
|
||||||
|
4. If you are unable to translate something, leave it in `English`.
|
||||||
|
|
||||||
|
#### Step 3: Metadata
|
||||||
|
Metadata can be found in the `_TRANSLATION` variable.
|
||||||
|
|Value |Notes |
|
||||||
|
|-------------|-------------------------------------------------------------------------------------------------|
|
||||||
|
|`otversion` |The Open Ticket version of this translation. Don't edit this! |
|
||||||
|
|`translator` |The translator discord username. When improving existing translation, add your name to the list. |
|
||||||
|
|`lastedited` |The last edited date in the `DD/MM/YYYY` format. |
|
||||||
|
|`language` |The full name of the language with capital letter. |
|
||||||
|
|
||||||
|
> #### ✅ You are also allowed to add your username to the [`README.md`](./../README.md) translator list!
|
||||||
|
|
||||||
|
#### Step 4: Uploading
|
||||||
|
1. When adding a new language, please mention @DJj123dj. He will add the code required for the language to work.
|
||||||
|
2. There are currently 3 ways of uploading translations:
|
||||||
|
- Create a pull request to the [__`dev` branch!__](https://github.com/DJj123dj/open-ticket/tree/dev)
|
||||||
|
- Create a ticket in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- Send a DM to @DJj123dj on discord!
|
||||||
|
3. Now you'll need to wait until the next Open Ticket version for it to be added.
|
||||||
|
|
||||||
|
#### Step 5: Rewards
|
||||||
|
Translators get some rewards for translating Open Ticket!
|
||||||
|
- ✅ Credits in the [`README.md`](./../README.md) translator list!
|
||||||
|
- ✅ Credits in the changelog!
|
||||||
|
- ✅ Credits in the documentation!
|
||||||
|
- ✅ Credits in the translation JSON file!
|
||||||
|
- ✅ A special role in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
|
||||||
|
### 🧩 Plugins (temporary)
|
||||||
|
Currently plugins can only be added to the list via our [discord server](https://discord.dj-dj.be)!
|
||||||
|
|
||||||
|
### 📦 Features (temporary)
|
||||||
|
Currently features can only be suggested in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
|
||||||
|
### 🕷️ Bug Fixes (temporary)
|
||||||
|
Currently bug fixes can only be reported in the following ways:
|
||||||
|
- Create an issue in the repository!
|
||||||
|
- Create a ticket in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
|
||||||
|
#### Please try to always include the `otdebug.txt` file!
|
||||||
|
|
||||||
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
|
**Contributing Guidelines**<br>
|
||||||
|
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
|
||||||
|
|
||||||
|
© 2024 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
github: DJj123dj
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
about: Report bugs to help us improve Open Ticket!
|
||||||
|
title: "[BUG] Your Bug"
|
||||||
|
labels: bug
|
||||||
|
assignees: DJj123dj
|
||||||
|
---
|
||||||
|
|
||||||
|
### Bug Description:
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
### Steps To Reproduce:
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
> Leave empty when you are unable to reproduce the bug!
|
||||||
|
|
||||||
|
### Expected Behaviour:
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
### Screenshots:
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
### Files:
|
||||||
|
Please include the `otdebug.txt` file in your report! With this file, we can take a deep-dive in to the error that happend.
|
||||||
|
> This file doesn't contain any credentials or sensitive information!
|
||||||
|
|
||||||
|
### Additional Notes:
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# Security Policy
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
|
||||||
|
|
||||||
|
[](https://discord.com/invite/26vT9wt3n3) [](https://github.com/DJj123dj/open-ticket/releases/tag/v4.0.0)
|
||||||
|
|
||||||
|
This is the Security Policy of Open Ticket!<br>
|
||||||
|
Here you can find a list of all supported & deprecated versions of the bot.<br>
|
||||||
|
You will also find some guidelines about how to report vulnerabilities, bugs & errors.
|
||||||
|
|
||||||
|
### 📦 Supported Versions
|
||||||
|
Below, you can find a list with the status of every Open Ticket version.<br>
|
||||||
|
This list will be updated on every release.
|
||||||
|
|
||||||
|
- 🟦 Early Access **(ideas, bugs, support, html transcripts)**
|
||||||
|
- ✅ Supported **(features, bugs, support, docs, html transcripts)**
|
||||||
|
- 🚧 Maintenance **(support, docs, html transcripts)**
|
||||||
|
- 🟧 Deprecated **(docs)**
|
||||||
|
- ❌ Fully Deprecated
|
||||||
|
|
||||||
|
| Version | Supported | Notes |
|
||||||
|
|------------|-----------|--------------------------------|
|
||||||
|
| 4.0.0-beta | 🟦 | For v4.0.0 Full Release |
|
||||||
|
| 3.5.8 | ✅ | Supported until October 2024 |
|
||||||
|
| 3.5.7 | ✅ | Supported until September 2024 |
|
||||||
|
| 3.5.6 | 🟧 | Documentation Only |
|
||||||
|
| < 3.5.6 | 🟧 | Documentation Only |
|
||||||
|
| < 3.5.0 | ❌ | |
|
||||||
|
|
||||||
|
### 🕷️ Reporting Vulnerabilities
|
||||||
|
You can report vulnerabilities, errors & bugs using one of the following methods:
|
||||||
|
- Create an issue on GitHub!
|
||||||
|
- Create a ticket in our [discord server](https://discord.dj-dj.be)!
|
||||||
|
- Message @DJj123dj in DM on discord!
|
||||||
|
- Send an E-mail to [support@dj-dj.be](mailto:support@dj-dj.be)!
|
||||||
|
|
||||||
|
When you report a problem, please **give a small description** about what & how it happend.<br>
|
||||||
|
Try to explain the issue in as much detail as possible.
|
||||||
|
|
||||||
|
If possible, try to provide screenshots!
|
||||||
|
|
||||||
|
### Please upload the `otdebug.txt` file together with your bug report!
|
||||||
|
|
||||||
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
|
**Security Policy**<br>
|
||||||
|
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
|
||||||
|
|
||||||
|
© 2024 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
|
||||||
+11
@@ -1,2 +1,13 @@
|
|||||||
node_modules/
|
node_modules/
|
||||||
package-lock.json
|
package-lock.json
|
||||||
|
devconfig/
|
||||||
|
devdatabase/
|
||||||
|
otdebug.txt
|
||||||
|
.DS_Store
|
||||||
|
*/.DS_Store
|
||||||
|
*/*/.DS_Store
|
||||||
|
*/*/*/.DS_Store
|
||||||
|
TEMP/
|
||||||
|
.vscode/
|
||||||
|
plugins/*
|
||||||
|
!plugins/example-plugin/
|
||||||
@@ -1,85 +1,142 @@
|
|||||||
# open-ticket
|
> ### 🎥 Content Creators 🎥
|
||||||
This is an open-source discord ticket bot, you can configure it and it comes with cool features like transcripts & custom options!
|
> Hey there! We're searching for content creators that would want to create a tutorial or setup guide for Open Ticket!<br>
|
||||||
|
> [📌 More Information](.github/CONTENT_CREATORS.md)
|
||||||
|
---
|
||||||
|
|
||||||
<img src="logo.png" alt="Open Ticket logo" style="height: 300px; width:300px;"/>
|
<p align="center">
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket" width="650px">
|
||||||
|
<br>Powered By<br>
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Ticket" width="170px"><br>
|
||||||
|
<a href="https://discord.com/invite/26vT9wt3n3"><img alt="Discord Invite Link" src="https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord"></img></a>
|
||||||
|
<a href="https://github.com/DJj123dj/open-ticket/releases/tag/v4.0.0"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.0.0-brightgreen.svg?style=flat-square"></img></a>
|
||||||
|
<a href="https://otdocs.dj-dj.be"><img alt="Open Ticket Documentation" src="https://img.shields.io/badge/discord.js-v14-CB3837.svg?style=flat-square&logo=npm"></img></a>
|
||||||
|
<a href="https://github.com/DJj123dj/open-ticket/blob/main/LICENSE"><img alt="Open Ticket License" src="https://img.shields.io/badge/license-GPL%203.0-important.svg?style=flat-square"></img></a>
|
||||||
|
<a href="https://otdocs.dj-dj.be"><img alt="Open Ticket Stars" src="https://img.shields.io/github/stars/djj123dj/open-ticket?color=yellow&label=stars&logo=github&style=flat-square"></img></a>
|
||||||
|
</p>
|
||||||
|
|
||||||
## features
|
<p align="center">
|
||||||
- discord interaction buttons
|
Open Ticket is the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes <code>Html Transcripts</code>, <code>Advanced Plugins</code>, <code>Custom Embeds</code>, <code>Questions/Modals</code>, <code>Stats</code> & more!
|
||||||
- transcripts
|
You're also able to customise every little aspect of the bot! From embeds to transcripts. Open Ticket is also translated in more than <code>32 Languages</code>! If you need any help, feel free to join our <a href="https://discord.dj-dj.be">discord server</a>!
|
||||||
- add/remove users from ticket
|
</p>
|
||||||
- custom colors & name
|
|
||||||
- has tickets for questions, partners & job applications
|
<p align="center"><b>⭐️ Help us grow by giving a star! ⭐️</b></p>
|
||||||
- uses discord.js 13
|
|
||||||
- configure your own ticket options
|
> [!WARNING]
|
||||||
- remove credits if you want
|
> Open Ticket v4 is still in beta! Please report all bugs in our [discord server](https://discord.dj-dj.be)!<br>
|
||||||
|
> The translation count may not be accurate!
|
||||||
|
|
||||||
|
### 📌 Features
|
||||||
|
- **📄 html transcripts** - Make use of the most customisable, beautiful and easy-to-use HTML Transcripts!
|
||||||
|
- **✅ ticket actions** - Close, Reopen, Delete, Rename & Move all your tickets!
|
||||||
|
- **🇬🇧 translation** - Open Ticket has been translated in more than **32 languages** by our community!
|
||||||
|
- **🎨 customisation** - Open Ticket has been created around customisation, everything can be customised!
|
||||||
|
- **🖥️ interactions** - The bot has full support for Buttons, Dropdowns, Slash Commands and Modals!
|
||||||
|
- **∞ unlimited everywhere** - Create an infinite amount of tickets & panels!
|
||||||
|
- **📝 advanced plugins** - Create the most advanced plugins that you want or use premade ones by our community!
|
||||||
|
- **👥 user management** - Add & Remove users from all tickets!
|
||||||
|
- **📊 detailed stats** - Open Ticket has ticket, user & global staticstics available for everyone!
|
||||||
|
- **🚫 blacklist** - Blacklist users to prevent them from creating a ticket!
|
||||||
|
- **❓ questions** - Let users answer questions in a modal before the ticket is created!
|
||||||
|
- **📦 commands** - Open Ticket supports both slash & text commands!
|
||||||
|
- **📥 extra types** - The bot also supports Reaction Roles & Url Buttons, because why not ¯\\_(ツ)_/¯
|
||||||
|
- **🎛️ dependencies** - We try to use as little external dependencies as needed!
|
||||||
|
|
||||||
|
> ### 📦 Resources
|
||||||
|
> Resources might not be accurate yet! *(because v4 is still in beta)*<br>
|
||||||
|
> <a href="https://www.youtube.com/watch?v=2jK9kAf6ASU"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-tutorial.png" alt="Open Ticket Tutorial" width="180px"></a>
|
||||||
|
> <a href="https:/otdocs.dj-dj.be"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-docs.png" alt="Open Ticket Docs" width="180px"></a>
|
||||||
|
> <a href="https://github.com/DJj123dj/open-discord-plugins"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-plugins.png" alt="Open Ticket Plugins" width="180px"></a>
|
||||||
|
|
||||||
|
## 📸 Preview
|
||||||
|
*Previews are not available yet in the beta release!*
|
||||||
|
|
||||||
|
## 🧩 Plugins
|
||||||
|
View all available Open Ticket plugins in our [Official Plugin Repository](https://github.com/DJj123dj/open-discord-plugins)!
|
||||||
|
|
||||||
|
### 📦 Official *(made by us)*
|
||||||
|
|Name |Description |
|
||||||
|
|----------------------|-------------------------|
|
||||||
|
|`nothing yet :)` |Lorem Ipsum Beta 4.0 🙃 |
|
||||||
|
|
||||||
|
### ✅ Verified *(made by community)*
|
||||||
|
|Name |Description |
|
||||||
|
|----------------------|-------------------------|
|
||||||
|
|`nothing yet :)` |Lorem Ipsum Beta 4.0 🙃 |
|
||||||
|
|
||||||
|
## 🛠️ Contributors
|
||||||
|
### 🖥️ Team
|
||||||
|
The team behind Open Ticket!
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><img src="https://github.com/DJj123dj.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
<td><img src="https://github.com/Sank34.png" alt="Profile Picture" width="80px"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th><a href="https://github.com/DJj123dj">DJj123dj</a></th>
|
||||||
|
<th><a href="https://github.com/Sank34">Sanke</a></th>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
### ❤️ Sponsors
|
||||||
|
A big thanks to all our sponsors! Without them, it wouldn't be possible to create this project!
|
||||||
|
|
||||||
|
|<img src="https://github.com/SpyEye2.png" alt="Profile Picture" width="80px"></img>|<img src="https://github.com/DOSEV5.png" alt="Profile Picture" width="80px"></img>|<img src="https://github.com/mods-hd.png" alt="Profile Picture" width="80px"></img>|
|
||||||
|
|----|-|-|
|
||||||
|
|**[SpyEye](https://github.com/SpyEye2)**|**[DOSEV5](https://github.com/DOSEV5)**|**[Mods HD](https://github.com/mods-hd)**|
|
||||||
|
|
||||||
|
### 💬 Translators
|
||||||
|
|Language |Maintainer (discord name) |Status |
|
||||||
|
|---------------------|--------------------------|---------------|
|
||||||
|
|🇬🇧 English |djj123dj |🟢 Up To Date |
|
||||||
|
|🇳🇱 Dutch |djj123dj |🟢 Up To Date |
|
||||||
|
|🇵🇹 Portuguese |quiradon |🟢 Up To Date |
|
||||||
|
|🇨🇿 Czech |spyeye_ |🟢 Up To Date |
|
||||||
|
|🇫🇷 French |sankedev & tostam |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇷🇴 Romanian |sankedev |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇪🇸 Spanish |redactado & josuens |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇩🇪 German |david.3 |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇮🇹 Italian |maurizio26 |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇦🇪 Arabic |deqressing |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇩🇰 Danish |.the_gamer |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇷🇺 Russian |apexo & ander |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇺🇦 Ukrainian |ander |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇹🇷 Turkish |0x15d3 |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇵🇱 Polish |mkevas |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇸🇮 Slovenian |n1kkec |🔴 Outdated |
|
||||||
|
|🇹🇭 Thai |modshd |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇳🇴 Norwegian |noonenook |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇬🇷 Greek |stefanos__. |🔴 Outdated |
|
||||||
|
|🇮🇩 Indonesian |erxg |🟠 Temporary Outdated (beta) |
|
||||||
|
|❓ Kurdish |raze.hama |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇭🇺 Hungarian |kornel0706 |🟠 Temporary Outdated (beta) |
|
||||||
|
|❓ Persian |sasanwm |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇱🇻 Latvian |ronalds1398 |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇪🇪 Estonian |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇯🇵 Japanese |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇰🇷 Korean |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇨🇳 Simplified Chinese |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇨🇳 Traditional Chinese|iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇫🇮 Finnish |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇸🇪 Swedish |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|🇻🇳 Vietnamese |iamnotmega |🟠 Temporary Outdated (beta) |
|
||||||
|
|
||||||
|
|
||||||
## installation
|
|
||||||
You need `node.js 16` to run this project, if you don't want to install `node.js 16` then there is a npm package that can help you.
|
|
||||||
|
|
||||||
You can clone this project for download.
|
## ⭐️ Star History
|
||||||
|
Please help us grow by giving a star! It would help us a lot!
|
||||||
|
|
||||||
### packages
|
<a href="https://star-history.com/#DJj123dj/open-ticket&Date">
|
||||||
- canvas => version `^2.8.0`
|
<picture>
|
||||||
- discord.js => version `^13.2.0`
|
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=DJj123dj/open-ticket&type=Date&theme=dark" />
|
||||||
- express => version `^4.17.1`
|
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=DJj123dj/open-ticket&type=Date" />
|
||||||
- node-localstorage => version `^2.2.1`
|
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=DJj123dj/open-ticket&type=Date" />
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
|
||||||
The packages are also in package.json!
|
---
|
||||||
|
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
|
||||||
|
|
||||||
### node.js 16 package
|
**README.md**<br>
|
||||||
if you don't want to install `node.js 16`, you can install this package too
|
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
|
||||||
- node => version ^16.10.0
|
|
||||||
|
|
||||||
_npm install node@16_
|
© 2024 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
|
||||||
|
|
||||||
## running
|
|
||||||
you can run `node index.js` but i would recommend you to use `npm start`
|
|
||||||
|
|
||||||
if there are any errors, you can open an **issue on github** or **contact me in the discord server**.
|
|
||||||
|
|
||||||
### config (required)
|
|
||||||
=> main config
|
|
||||||
- `server_name` => the name from your server.
|
|
||||||
- `server_logo`=> the logo from your server.
|
|
||||||
- `bot_name`=> the bot's name.
|
|
||||||
- `main_color`=> the color used in all embeds.
|
|
||||||
- `auth_token`=> the bot's token (Discord Developer Portal)
|
|
||||||
- `botperms_role`=> the id from a role that can run admin commands with the bot.
|
|
||||||
- `prefix`=> the bot's prefix.
|
|
||||||
|
|
||||||
- `credits_please-do-not-remove` => remove the credits or not
|
|
||||||
|
|
||||||
=> status config
|
|
||||||
- `status/type` => PLAYING | STREAMING | LISTENING | WATCHING | CUSTOM | COMPETING
|
|
||||||
- `status/text` => the status text
|
|
||||||
|
|
||||||
=> ticket system config
|
|
||||||
- `system/ticket_channel` => the channel where you are going to put the !ticket msg.
|
|
||||||
- `system/ticket_category` => the category for tickets.
|
|
||||||
- `system/member_role` => this role doesn't have access to tickets
|
|
||||||
(WARNING: @everyone does have access to tickets, so make sure all members have a member role!).
|
|
||||||
- `system/transcript_channel` => the channel for transcripts.
|
|
||||||
- `system/enable_transcripts` => enable transcripts.
|
|
||||||
- `system/enable_category` => enable tickets in category.
|
|
||||||
|
|
||||||
=> ticket options config
|
|
||||||
- `options/ticket.../enabled` => set this option TRUE or FALSE.
|
|
||||||
- `options/ticket.../icon` => set an emoji for this ticket option.
|
|
||||||
- `options/ticket.../description` => set a description for this ticket option.
|
|
||||||
- `options/ticket.../name` => set a name for this ticket option.
|
|
||||||
- `options/ticket.../channel_prefix` => this will be the prefix for channel names (empty is disabled!)
|
|
||||||
|
|
||||||
### intents & permissions
|
|
||||||
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`
|
|
||||||
|
|
||||||
The bot needs `ADMINISTRATOR` permissions to work the best.
|
|
||||||
|
|
||||||
## credits
|
|
||||||
Please don't remove the credits from the bot 😊.
|
|
||||||
|
|
||||||
_v1.2.2_
|
|
||||||
|
|
||||||
© 2021 - DJdj Development | [website](https://www.dj-dj.be) | [discord](https://discord.com/invite/26vT9wt3n3)
|
|
||||||
@@ -1,22 +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"){
|
|
||||||
if (msg.author.id == client.application.owner.id){
|
|
||||||
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("if it doesn't work, create an issue on github or DM me on discord!")
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[databaseEmbed]})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,81 +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 => {
|
|
||||||
if (msg.content == config.prefix+"ticket msg"){
|
|
||||||
if (msg.member.roles.cache.has(config.botperms_role) == false && msg.author.id != "779742674932072469"){
|
|
||||||
msg.channel.send({content:"You don't have permissons for this command!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var ticketButton = new discord.MessageActionRow()
|
|
||||||
|
|
||||||
|
|
||||||
if (config.options.ticket1.enabled){
|
|
||||||
ticketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket1")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setEmoji(config.options.ticket1.icon)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket2.enabled){
|
|
||||||
ticketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket2")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setEmoji(config.options.ticket2.icon)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket3.enabled){
|
|
||||||
ticketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket3")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setEmoji(config.options.ticket3.icon)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.options.ticket4.enabled){
|
|
||||||
ticketButton.addComponents(
|
|
||||||
new discord.MessageButton()
|
|
||||||
.setCustomId("newTicket4")
|
|
||||||
.setDisabled(false)
|
|
||||||
.setStyle("SECONDARY")
|
|
||||||
.setEmoji(config.options.ticket4.icon)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
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}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var ticketEmbed = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.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 1 ticket at a time!_")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[ticketEmbed],components:[ticketButton]})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,139 +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._")
|
|
||||||
|
|
||||||
if (config['credits_please-do-not-remove']){
|
|
||||||
TicketHelpMsg.setFooter("OpenTicket by DJdj Development | view on github for source code")
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.send({embeds:[TicketHelpMsg]})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
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 aren't 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]})
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
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:"You don't have permissions for this command!"})
|
|
||||||
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]
|
|
||||||
msg.channel.messages.fetchPinned().then(msglist => {
|
|
||||||
if (msglist.last().author.id == client.user.id){
|
|
||||||
msg.channel.send({content:"De naam is veranderd!"}).then(rmsg => {
|
|
||||||
rmsg.channel.setName(name)
|
|
||||||
})
|
|
||||||
}else{
|
|
||||||
msg.channel.send({content:"You aren't in a ticket!"})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
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:"You don't have permissions for this command!"})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.channel.messages.fetch().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.create(user.id, { VIEW_CHANNEL:true, ADD_REACTIONS:true,ATTACH_FILES:true, EMBED_LINKS:true, SEND_MESSAGES:true})
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
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:"You don't have permissions for this command!"})
|
|
||||||
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)
|
|
||||||
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -1,245 +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("❌")
|
|
||||||
)
|
|
||||||
|
|
||||||
client.on("interactionCreate",interaction => {
|
|
||||||
|
|
||||||
if (interaction.isButton() == false){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (interaction.customId == "newTicket1"||interaction.customId == "newTicket2"||interaction.customId == "newTicket3"||interaction.customId == "newTicket4"){
|
|
||||||
|
|
||||||
interaction.deferUpdate()
|
|
||||||
|
|
||||||
if (ticketStorage.getItem(interaction.member.id) == null ||ticketStorage.getItem(interaction.member.id) == "false"){
|
|
||||||
|
|
||||||
try{
|
|
||||||
interaction.member.send("**You created a ticket in our server!**")
|
|
||||||
}
|
|
||||||
catch{console.log("can't send DM to member || member doesn't allow dm's")}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ticketStorage.setItem(interaction.member.id,"true")
|
|
||||||
|
|
||||||
var ticketNumber = interaction.member.user.username
|
|
||||||
|
|
||||||
if (interaction.customId == "newTicket1"){
|
|
||||||
var ticketName = config.options.ticket1.channel_prefix+ticketNumber
|
|
||||||
}else if (interaction.customId == "newTicket2"){
|
|
||||||
var ticketName = config.options.ticket2.channel_prefix+ticketNumber
|
|
||||||
}else if (interaction.customId == "newTicket3"){
|
|
||||||
var ticketName = config.options.ticket3.channel_prefix+ticketNumber
|
|
||||||
}else if (interaction.customId == "newTicket4"){
|
|
||||||
var ticketName = config.options.ticket4.channel_prefix+ticketNumber
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config.system.enable_category){
|
|
||||||
var Category = config.system.ticket_category
|
|
||||||
}else{var Category = null}
|
|
||||||
|
|
||||||
interaction.guild.channels.create(ticketName,{
|
|
||||||
type:"GUILD_TEXT",
|
|
||||||
parent:Category,
|
|
||||||
permissionOverwrites:[
|
|
||||||
{
|
|
||||||
id:interaction.member.id,
|
|
||||||
type:"member",
|
|
||||||
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id:config.botperms_role,
|
|
||||||
type:"role",
|
|
||||||
allow:["ADD_REACTIONS","ATTACH_FILES","EMBED_LINKS","SEND_MESSAGES","VIEW_CHANNEL"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id:config.system.member_role,
|
|
||||||
type:"role",
|
|
||||||
deny:["VIEW_CHANNEL"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}).then(tChannel => {
|
|
||||||
userTicketStorage.setItem(tChannel.id,interaction.member.id)
|
|
||||||
|
|
||||||
|
|
||||||
var ticketEmbed = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
|
|
||||||
ticketEmbed.setDescription("You created a ticket!\n\n_Click on the close button below to close this ticket_")
|
|
||||||
|
|
||||||
tChannel.send({content:"<@"+interaction.member.id+"> <@&"+config.botperms_role+">",embeds:[ticketEmbed],components:[closeButton]}).then(firstmsg => {
|
|
||||||
firstmsg.pin()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}else{
|
|
||||||
try {
|
|
||||||
interaction.member.send("**You have already created a ticket!**")
|
|
||||||
}
|
|
||||||
catch{console.log("can't send DM to member || member doesn't allow dm's")}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
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(config.main_color)
|
|
||||||
.setAuthor(interaction.channel.name + " - ticket created by "+getuserNAME)
|
|
||||||
.setTitle("There is a new transcript!")
|
|
||||||
.setDescription(splittedTranscript[0])
|
|
||||||
.setFooter("ticket closed by "+interaction.member.user.username)
|
|
||||||
|
|
||||||
if (transcript.length > 4000){
|
|
||||||
var transcriptEmbed2 = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setAuthor(interaction.channel.name + " - ticket created by "+getuserNAME)
|
|
||||||
.setTitle("transcript #2")
|
|
||||||
.setDescription(splittedTranscript[1])
|
|
||||||
.setFooter("ticket closed by "+interaction.member.user.username)
|
|
||||||
var transcriptEmbed3 = new discord.MessageEmbed()
|
|
||||||
.setColor(config.main_color)
|
|
||||||
.setAuthor(interaction.channel.name + " - ticket created by "+getuserNAME)
|
|
||||||
.setTitle("transcript #3")
|
|
||||||
.setDescription(splittedTranscript[1])
|
|
||||||
.setFooter("ticket closed by "+interaction.member.user.username)
|
|
||||||
|
|
||||||
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(config.main_color)
|
|
||||||
.setAuthor(interaction.channel.name + " - ticket created by "+getuserNAME)
|
|
||||||
.setTitle("transcript #2")
|
|
||||||
.setDescription(splittedTranscript[1])
|
|
||||||
.setFooter("ticket closed by "+interaction.member.user.username)
|
|
||||||
|
|
||||||
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()
|
|
||||||
|
|
||||||
|
|
||||||
ticketStorage.setItem(getuserID,"false")
|
|
||||||
|
|
||||||
try {
|
|
||||||
interaction.member.send("**your ticket is closed by "+interaction.member.user.username+"!**")
|
|
||||||
}
|
|
||||||
catch{console.log("can't send DM to member || member doesn't allow dm's")}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
process.on('unhandledRejection',error => {
|
|
||||||
console.log("ERROR: "+error)
|
|
||||||
})
|
|
||||||
|
|
||||||
}
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
{
|
|
||||||
"server_name":"Ticket Bot Land",
|
|
||||||
"server_logo":"https://www.example.com/another-example/yourlogo.png",
|
|
||||||
"bot_name":"Wumpus",
|
|
||||||
"main_color":"#fffff",
|
|
||||||
"auth_token":"the bot's auth token",
|
|
||||||
"botperms_role":"the id from a role that can do anything with the bot",
|
|
||||||
"prefix":"!",
|
|
||||||
|
|
||||||
"credits_please-do-not-remove":true,
|
|
||||||
|
|
||||||
"status":{
|
|
||||||
"type":"PLAYING | STREAMING | LISTENING | WATCHING | CUSTOM | COMPETING",
|
|
||||||
"text":"!ticket"
|
|
||||||
},
|
|
||||||
|
|
||||||
"system":{
|
|
||||||
"ticket_channel":"id of the channel with the !ticket msg",
|
|
||||||
|
|
||||||
"enable_category":false,
|
|
||||||
"ticket_category":"the id of a category for the tickets",
|
|
||||||
|
|
||||||
"member_role":"this role doesn't have access to tickets (WARNING: @everyone does have access to tickets, so make sure all members have a member role!)",
|
|
||||||
|
|
||||||
"enable_transcript":false,
|
|
||||||
"transcript_channel":"the channel for transcripts"
|
|
||||||
},
|
|
||||||
|
|
||||||
"options":{
|
|
||||||
"ticket1":{
|
|
||||||
"enabled":true,
|
|
||||||
"icon":"🎫",
|
|
||||||
"description":"Create a general ticket.",
|
|
||||||
"name":"Ticket",
|
|
||||||
"channel_prefix":"ticket-"
|
|
||||||
},
|
|
||||||
"ticket2":{
|
|
||||||
"enabled":false,
|
|
||||||
"icon":"💼",
|
|
||||||
"description":"Do you want to apply? Then click here!",
|
|
||||||
"name":"Apply",
|
|
||||||
"channel_prefix":"apply-"
|
|
||||||
},
|
|
||||||
"ticket3":{
|
|
||||||
"enabled":false,
|
|
||||||
"icon":"❓",
|
|
||||||
"description":"Click here if you have a question about the server.",
|
|
||||||
"name":"Question",
|
|
||||||
"channel_prefix":"question-"
|
|
||||||
},
|
|
||||||
"ticket4":{
|
|
||||||
"enabled":false,
|
|
||||||
"icon":"🛒",
|
|
||||||
"description":"Buy something in our shop.",
|
|
||||||
"name":"Shop",
|
|
||||||
"channel_prefix":"shop-"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
{
|
||||||
|
"_INFO":{
|
||||||
|
"support":"https://otdocs.dj-dj.be",
|
||||||
|
"discord":"https://discord.dj-dj.be",
|
||||||
|
"version":"open-ticket-v4.0.0"
|
||||||
|
},
|
||||||
|
|
||||||
|
"token":"your bot token here! Or leave empty when you use tokenFromENV",
|
||||||
|
"tokenFromENV":false,
|
||||||
|
|
||||||
|
"mainColor":"#f8ba00",
|
||||||
|
"language":"english",
|
||||||
|
"prefix":"!ticket ",
|
||||||
|
"serverId":"discord server id",
|
||||||
|
"globalAdmins":["discord role id"],
|
||||||
|
|
||||||
|
"slashCommands":true,
|
||||||
|
"textCommands":true,
|
||||||
|
|
||||||
|
"status":{
|
||||||
|
"enabled":true,
|
||||||
|
"type":"listening OR watching OR playing OR custom",
|
||||||
|
"text":"/help",
|
||||||
|
"status":"online OR invisible OR idle OR dnd"
|
||||||
|
},
|
||||||
|
|
||||||
|
"system":{
|
||||||
|
"removeParticipantsOnClose":false,
|
||||||
|
"replyOnTicketCreation":true,
|
||||||
|
"replyOnReactionRole":true,
|
||||||
|
"useTranslatedConfigChecker":true,
|
||||||
|
"preferSlashOverText":true,
|
||||||
|
"sendErrorOnUnknownCommand":true,
|
||||||
|
"questionFieldsInCodeBlock":true,
|
||||||
|
"disableVerifyBars":false,
|
||||||
|
"useRedErrorEmbeds":true,
|
||||||
|
"emojiStyle":"before (OR after OR double OR disabled)",
|
||||||
|
|
||||||
|
"enableTicketClaimButtons":true,
|
||||||
|
"enableTicketCloseButtons":true,
|
||||||
|
"enableTicketPinButtons":true,
|
||||||
|
"enableTicketDeleteButtons":true,
|
||||||
|
"enableTicketActionWithReason":true,
|
||||||
|
"enableDeleteWithoutTranscript":true,
|
||||||
|
|
||||||
|
"logs":{
|
||||||
|
"enabled":false,
|
||||||
|
"channel":"discord channel id"
|
||||||
|
},
|
||||||
|
|
||||||
|
"limits":{
|
||||||
|
"enabled":true,
|
||||||
|
"globalMaximum":50,
|
||||||
|
"userMaximum":3
|
||||||
|
},
|
||||||
|
|
||||||
|
"permissions":{
|
||||||
|
"help":"everyone (OR admin OR none OR role id)",
|
||||||
|
"panel":"admin (OR everyone OR none OR role id)",
|
||||||
|
"ticket":"none (OR admin OR everyone OR role id)",
|
||||||
|
"close":"everyone (OR admin OR none OR role id)",
|
||||||
|
"delete":"admin (OR everyone OR none OR role id)",
|
||||||
|
"reopen":"everyone (OR admin OR none OR role id)",
|
||||||
|
"claim":"admin (OR everyone OR none OR role id)",
|
||||||
|
"unclaim":"admin (OR everyone OR none OR role id)",
|
||||||
|
"pin":"admin (OR everyone OR none OR role id)",
|
||||||
|
"unpin":"admin (OR everyone OR none OR role id)",
|
||||||
|
"move":"admin (OR everyone OR none OR role id)",
|
||||||
|
"rename":"admin (OR everyone OR none OR role id)",
|
||||||
|
"add":"admin (OR everyone OR none OR role id)",
|
||||||
|
"remove":"admin (OR everyone OR none OR role id)",
|
||||||
|
"blacklist":"admin (OR everyone OR none OR role id)",
|
||||||
|
"stats":"everyone (OR admin OR none OR role id)",
|
||||||
|
"clear":"admin (OR everyone OR none OR role id)",
|
||||||
|
"autoclose":"admin (OR everyone OR none OR role id)",
|
||||||
|
"autodelete":"admin (OR everyone OR none OR role id)"
|
||||||
|
},
|
||||||
|
|
||||||
|
"messages":{
|
||||||
|
"creation":{"dm":false, "logs":true},
|
||||||
|
"closing":{"dm":false, "logs":true},
|
||||||
|
"deleting":{"dm":false, "logs":true},
|
||||||
|
"reopening":{"dm":false, "logs":true},
|
||||||
|
"claiming":{"dm":false, "logs":true},
|
||||||
|
"pinning":{"dm":false, "logs":true},
|
||||||
|
"adding":{"dm":false, "logs":true},
|
||||||
|
"removing":{"dm":false, "logs":true},
|
||||||
|
"renaming":{"dm":false, "logs":true},
|
||||||
|
"moving":{"dm":false, "logs":true},
|
||||||
|
"blacklisting":{"dm":false, "logs":true},
|
||||||
|
"roleAdding":{"dm":false, "logs":true},
|
||||||
|
"roleRemoving":{"dm":false, "logs":true}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id":"example-ticket",
|
||||||
|
"name":"Question",
|
||||||
|
"description":"Create this ticket if you have a question! (or leave empty)",
|
||||||
|
"type":"ticket",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
"emoji":"🎫 (or leave empty)",
|
||||||
|
"label":"question (or leave empty)",
|
||||||
|
"color":"gray OR red OR green OR blue"
|
||||||
|
},
|
||||||
|
|
||||||
|
"ticketAdmins":["discord role id"],
|
||||||
|
"readonlyAdmins":["discord role id"],
|
||||||
|
"allowCreationByBlacklistedUsers":false,
|
||||||
|
"questions":["example-question-1","example-question-2"],
|
||||||
|
|
||||||
|
"channel":{
|
||||||
|
"prefix":"question-",
|
||||||
|
"suffix":"user-name OR user-id OR random-number OR random-hex OR counter-dynamic OR counter-fixed",
|
||||||
|
"category":"category id (or leave empty)",
|
||||||
|
"closedCategory":"category id (or leave empty)",
|
||||||
|
"backupCategory":"category id (or leave empty)",
|
||||||
|
"claimedCategory":[
|
||||||
|
{"user":"user id","category":"category id"}
|
||||||
|
],
|
||||||
|
"description":"This is a question ticket (or leave empty)"
|
||||||
|
},
|
||||||
|
|
||||||
|
"dmMessage":{
|
||||||
|
"enabled":false,
|
||||||
|
"text":"Thanks for creating a ticket in our server! (or leave empty)",
|
||||||
|
"embed":{
|
||||||
|
"enabled":false,
|
||||||
|
"title":"Embed Title! (or leave empty)",
|
||||||
|
"description":"Description (or leave empty)",
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
|
||||||
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"fields":[
|
||||||
|
{"name":"field name","value":"field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ticketMessage":{
|
||||||
|
"enabled":true,
|
||||||
|
"text":"",
|
||||||
|
"embed":{
|
||||||
|
"enabled":true,
|
||||||
|
"title":"Question Ticket",
|
||||||
|
"description":"Thanks for creating a 'Question' ticket in our server!\nOur support team will help you soon!",
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
|
||||||
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"fields":[
|
||||||
|
{"name":"field name","value":"field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
},
|
||||||
|
"ping":{
|
||||||
|
"@here":true,
|
||||||
|
"@everyone":false,
|
||||||
|
"custom":["discord role id"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoclose":{
|
||||||
|
"enableInactiveHours":false,
|
||||||
|
"inactiveHours":24,
|
||||||
|
"enableUserLeave":true,
|
||||||
|
"disableOnClaim":false
|
||||||
|
},
|
||||||
|
"autodelete":{
|
||||||
|
"enableInactiveDays":false,
|
||||||
|
"inactiveDays":7,
|
||||||
|
"enableUserLeave":true,
|
||||||
|
"disableOnClaim":false
|
||||||
|
},
|
||||||
|
"cooldown":{
|
||||||
|
"enabled":false,
|
||||||
|
"cooldownMinutes":10
|
||||||
|
},
|
||||||
|
"limits":{
|
||||||
|
"enabled":false,
|
||||||
|
"globalMaximum":20,
|
||||||
|
"userMaximum":3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"example-website",
|
||||||
|
"name":"Website",
|
||||||
|
"description":"Go to our website.",
|
||||||
|
"type":"website",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
"emoji":"😃",
|
||||||
|
"label":"Visit our website"
|
||||||
|
},
|
||||||
|
|
||||||
|
"url":"https://www.dj-dj.be"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"example-role",
|
||||||
|
"name":"Update Ping",
|
||||||
|
"description":"Click here to get notified on updates!",
|
||||||
|
"type":"role",
|
||||||
|
|
||||||
|
"button":{
|
||||||
|
"emoji":"📢",
|
||||||
|
"label":"Update Ping",
|
||||||
|
"color":"gray OR red OR green OR blue"
|
||||||
|
},
|
||||||
|
|
||||||
|
"roles":["discord role id"],
|
||||||
|
"mode":"add&remove OR remove OR add",
|
||||||
|
"removeRolesOnAdd":["discord role id"],
|
||||||
|
"addOnMemberJoin":false
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id":"example-embed",
|
||||||
|
"name":"Example Embed",
|
||||||
|
"dropdown":false,
|
||||||
|
"options":["example-ticket","example-website","example-role"],
|
||||||
|
|
||||||
|
"text":"",
|
||||||
|
"embed":{
|
||||||
|
"enabled":true,
|
||||||
|
"title":"Tickets:",
|
||||||
|
"description":"Create a ticket by clicking one of the buttons below!",
|
||||||
|
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
"url":"https://openticket.dj-dj.be (or leave empty)",
|
||||||
|
|
||||||
|
"image":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
"thumbnail":"https://www.example.com/image.png (or leave empty)",
|
||||||
|
|
||||||
|
"footer":"Open Ticket v4.0.0 (or leave empty)",
|
||||||
|
"fields":[
|
||||||
|
{"name":"field name","value":"field value","inline":false}
|
||||||
|
],
|
||||||
|
"timestamp":false
|
||||||
|
},
|
||||||
|
"settings":{
|
||||||
|
"dropdownPlaceholder":"Create a ticket!",
|
||||||
|
|
||||||
|
"enableMaxTicketsWarningInText":false,
|
||||||
|
"enableMaxTicketsWarningInEmbed":true,
|
||||||
|
|
||||||
|
"describeOptionsLayout":"simple OR normal OR detailed",
|
||||||
|
"describeOptionsCustomTitle":"",
|
||||||
|
"describeOptionsInText":false,
|
||||||
|
"describeOptionsInEmbedFields":true,
|
||||||
|
"describeOptionsInEmbedDescription":false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id":"example-question-1",
|
||||||
|
"name":"Example Question 1",
|
||||||
|
"type":"short",
|
||||||
|
|
||||||
|
"required":true,
|
||||||
|
"placeholder":"Insert your short answer here!",
|
||||||
|
"length":{
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":1000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"example-question-2",
|
||||||
|
"name":"Example Question 2",
|
||||||
|
"type":"paragraph",
|
||||||
|
|
||||||
|
"required":false,
|
||||||
|
"placeholder":"Insert your long answer here!",
|
||||||
|
"length":{
|
||||||
|
"enabled":false,
|
||||||
|
"min":0,
|
||||||
|
"max":1000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"general":{
|
||||||
|
"enabled":false,
|
||||||
|
|
||||||
|
"enableChannel":false,
|
||||||
|
"enableCreatorDM":false,
|
||||||
|
"enableParticipantDM":false,
|
||||||
|
"enableActiveAdminDM":false,
|
||||||
|
"enableEveryAdminDM":false,
|
||||||
|
|
||||||
|
"channel":"transcript channel id (or leave empty)",
|
||||||
|
"mode":"html OR text"
|
||||||
|
},
|
||||||
|
"embedSettings":{
|
||||||
|
"customColor":"#f8ab00 (or leave empty)",
|
||||||
|
"listAllParticipants":false,
|
||||||
|
"includeTicketStats":false
|
||||||
|
},
|
||||||
|
"textTranscriptStyle":{
|
||||||
|
"layout":"simple OR normal OR detailed",
|
||||||
|
"includeStats":true,
|
||||||
|
"includeIds":false,
|
||||||
|
"includeEmbeds":true,
|
||||||
|
"includeFiles":true,
|
||||||
|
"includeBotMessages":true,
|
||||||
|
|
||||||
|
"fileMode":"custom OR channel-name OR channel-id OR user-name OR user-id",
|
||||||
|
"customFileName":"this-is-a-transcript (or leave empty)"
|
||||||
|
},
|
||||||
|
"htmlTranscriptStyle":{
|
||||||
|
"background":{
|
||||||
|
"enableCustomBackground":false,
|
||||||
|
"backgroundColor":"#f8ba00 (or leave empty)",
|
||||||
|
"backgroundImage":"https://www.example.com/image.png (or leave empty)"
|
||||||
|
|
||||||
|
},
|
||||||
|
"header":{
|
||||||
|
"enableCustomHeader":false,
|
||||||
|
"backgroundColor":"#202225",
|
||||||
|
"decoColor":"#f8ba00",
|
||||||
|
"textColor":"#ffffff"
|
||||||
|
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"enableCustomStats":false,
|
||||||
|
"backgroundColor":"#202225",
|
||||||
|
"keyTextColor":"#737373",
|
||||||
|
"valueTextColor":"#ffffff",
|
||||||
|
"hideBackgroundColor":"#40444a",
|
||||||
|
"hideTextColor":"#ffffff"
|
||||||
|
},
|
||||||
|
"favicon":{
|
||||||
|
"enableCustomFavicon":false,
|
||||||
|
"imageUrl":"https://transcripts.dj-dj.be/favicon.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[
|
||||||
|
{"category":"openticket:last-version","key":"openticket:version","value":"v4.0.0"},
|
||||||
|
{"category":"openticket:last-version","key":"openticket:api","value":"v1.0.0"},
|
||||||
|
{"category":"openticket:last-version","key":"openticket:transcripts","value":"v2.0.0"},
|
||||||
|
{"category":"openticket:last-version","key":"openticket:livestatus","value":"v2.0.0"},
|
||||||
|
{"category":"openticket:last-version","key":"openticket:last-version","value":"v4.0.0"}
|
||||||
|
]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
[]
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
client.on('ready',() => {
|
|
||||||
console.log('ready')
|
|
||||||
client.user.setActivity(config.status.text,{type:config.status.type})
|
|
||||||
})
|
|
||||||
|
|
||||||
var storage = require('./storage/storage')
|
|
||||||
exports.TicketStorage = storage.ticketStorage
|
|
||||||
exports.userTicketStorage = storage.userTicketStorage
|
|
||||||
exports.transcriptStorage = storage.transcriptStorage
|
|
||||||
exports.ticketNumberStorage = storage.ticketNumberStorage
|
|
||||||
|
|
||||||
var ticket = require('./commands/ticket')
|
|
||||||
ticket()
|
|
||||||
|
|
||||||
var ticketSystem = require('./commands/ticketSystem')
|
|
||||||
ticketSystem()
|
|
||||||
|
|
||||||
var ticketExtra = require("./commands/ticketExtra")
|
|
||||||
ticketExtra()
|
|
||||||
|
|
||||||
var database = require('./commands/database')
|
|
||||||
database()
|
|
||||||
|
|
||||||
|
|
||||||
client.login(config.auth_token)
|
|
||||||
@@ -0,0 +1,477 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.0",
|
||||||
|
"translator":"DJj123dj",
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"Custom"
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[WARNING]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"CONFIG CHECKER",
|
||||||
|
"headerDescription":"check for errors in you config files!",
|
||||||
|
"footerError":"the bot won't start until all {0}'s are fixed!",
|
||||||
|
"footerWarning":"it's recommended to fix all {0}'s before starting!",
|
||||||
|
"footerSupport":"SUPPORT: {0} - DOCS: {1}",
|
||||||
|
"compactInformation":"use {0} for more information!",
|
||||||
|
"dataPath":"path",
|
||||||
|
"dataDocs":"docs",
|
||||||
|
"dataMessages":"message"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"This string can't be shorter than {0} characters!",
|
||||||
|
"stringTooLong":"This string can't be longer than {0} characters!",
|
||||||
|
"stringLengthInvalid":"This string needs to be {0} characters long!",
|
||||||
|
"stringStartsWith":"This string needs to start with {0}!",
|
||||||
|
"stringEndsWith":"This string needs to end with {0}!",
|
||||||
|
"stringContains":"This string needs to contain {0}!",
|
||||||
|
"stringChoices":"This string can only be one of the following values: {0}!",
|
||||||
|
"stringRegex":"This string is invalid!",
|
||||||
|
|
||||||
|
"numberTooShort":"This number can't be shorter than {0} characters!",
|
||||||
|
"numberTooLong":"This number can't be longer than {0} characters!",
|
||||||
|
"numberLengthInvalid":"This number needs to be {0} characters long!",
|
||||||
|
"numberTooSmall":"This number needs to be at least {0}!",
|
||||||
|
"numberTooLarge":"This number needs to be at most {0}!",
|
||||||
|
"numberNotEqual":"This number needs to be {0}!",
|
||||||
|
"numberStep":"This number needs to be a multiple of {0}!",
|
||||||
|
"numberStepOffset":"This number needs to be a multiple of {0} starting with {1}!",
|
||||||
|
"numberStartsWith":"This number needs to start with {0}!",
|
||||||
|
"numberEndsWith":"This number needs to end with {0}!",
|
||||||
|
"numberContains":"This number needs to contain {0}!",
|
||||||
|
"numberChoices":"This number can only be one of the following values: {0}!",
|
||||||
|
"numberFloat":"This number can't be a decimal!",
|
||||||
|
"numberNegative":"This number can't be negative!",
|
||||||
|
"numberPositive":"This number can't be positive!",
|
||||||
|
"numberZero":"This number can't be zero!",
|
||||||
|
|
||||||
|
"booleanTrue":"This boolean can't be true!",
|
||||||
|
"booleanFalse":"This boolean can't be false!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"This array isn't allowed to be empty!",
|
||||||
|
"arrayEmptyRequired":"This array is required to be empty!",
|
||||||
|
"arrayTooShort":"This array needs to have a length of at least {0}!",
|
||||||
|
"arrayTooLong":"This array needs to have a length of at most {0}!",
|
||||||
|
"arrayLengthInvalid":"This array needs to have a length of {0}!",
|
||||||
|
"arrayInvalidTypes":"This array can only contain the following types: {0}!",
|
||||||
|
"arrayDouble":"This array doesn't allow the same value twice!",
|
||||||
|
|
||||||
|
"discordInvalidId":"This is an invalid discord {0} id!",
|
||||||
|
"discordInvalidIdOptions":"This is an invalid discord {0} id! You can also use one of these: {1}!",
|
||||||
|
"discordInvalidToken":"This is an invalid discord token (syntactically)!",
|
||||||
|
"colorInvalid":"This is an invalid hex color!",
|
||||||
|
"emojiTooShort":"This string needs to have at least {0} emoji's!",
|
||||||
|
"emojiTooLong":"This string needs to have at most {0} emoji's!",
|
||||||
|
"emojiCustom":"This emoji can't be a custom discord emoji!",
|
||||||
|
"emojiInvalid":"This is an invalid emoji!",
|
||||||
|
"urlInvalid":"This url is invalid!",
|
||||||
|
"urlInvalidHttp":"This url can only use the https:// protocol!",
|
||||||
|
"urlInvalidProtocol":"This url can only use the http:// & https:// protocols!",
|
||||||
|
"urlInvalidHostname":"This url has a disallowed hostname!",
|
||||||
|
"urlInvalidExtension":"This url has an invalid extension! Choose between: {0}!",
|
||||||
|
"urlInvalidPath":"This url has an invalid path!",
|
||||||
|
"idNotUnique":"This id isn't unique, use another id instead!",
|
||||||
|
"idNonExistent":"The id {0} doesn't exist!",
|
||||||
|
|
||||||
|
"invalidType":"This property needs to be the type: {0}!",
|
||||||
|
"propertyMissing":"The property {0} is missing from this object!",
|
||||||
|
"propertyOptional":"The property {0} is optional in this object!",
|
||||||
|
"objectDisabled":"This object is disabled, enable it using {0}!",
|
||||||
|
"nullInvalid":"This property can't be null!",
|
||||||
|
"switchInvalidType":"This needs to be one of the following types: {0}!",
|
||||||
|
"objectSwitchInvalid":"This object needs to be one of the following types: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"This is an invalid language!",
|
||||||
|
"invalidButton":"This button needs to have at least an {0} or {1}!",
|
||||||
|
"unusedOption":"The option {0} isn't used anywhere!",
|
||||||
|
"unusedQuestion":"The question {0} isn't used anywhere!",
|
||||||
|
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Visit Ticket",
|
||||||
|
"close":"Close Ticket",
|
||||||
|
"delete":"Delete Ticket",
|
||||||
|
"reopen":"Reopen Ticket",
|
||||||
|
"claim":"Claim Ticket",
|
||||||
|
"unclaim":"Unclaim Ticket",
|
||||||
|
"pin":"Pin Ticket",
|
||||||
|
"unpin":"Unpin Ticket",
|
||||||
|
"clear":"Delete Tickets",
|
||||||
|
"helpSwitchSlash":"View Slash Commands",
|
||||||
|
"helpSwitchText":"View Text Commands",
|
||||||
|
"helpPage":"Page {0}",
|
||||||
|
"withReason":"With Reason",
|
||||||
|
"withoutTranscript":"Without Transcript"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket Created",
|
||||||
|
"close":"Ticket Closed",
|
||||||
|
"delete":"Ticket Deleted",
|
||||||
|
"reopen":"Ticket Reopened",
|
||||||
|
"claim":"Ticket Claimed",
|
||||||
|
"unclaim":"Ticket Unclaimed",
|
||||||
|
"pin":"Ticket Pinned",
|
||||||
|
"unpin":"Ticket Unpinned",
|
||||||
|
"rename":"Ticket Renamed",
|
||||||
|
"move":"Ticket Moved",
|
||||||
|
"add":"Ticket User Added",
|
||||||
|
"remove":"Ticket User Removed",
|
||||||
|
|
||||||
|
"help":"Available Commands",
|
||||||
|
"statsReset":"Reset Stats",
|
||||||
|
"blacklistAdd":"User Blacklisted",
|
||||||
|
"blacklistRemove":"User Released",
|
||||||
|
"blacklistGet":"Blacklisted User",
|
||||||
|
"blacklistView":"Current Blacklist",
|
||||||
|
"blacklistAddDm":"Added To Blacklist",
|
||||||
|
"blacklistRemoveDm":"Removed From Blacklist",
|
||||||
|
"clear":"Tickets Cleared",
|
||||||
|
"roles":"Roles Updated",
|
||||||
|
|
||||||
|
"autoclose":"Ticket Autoclosed",
|
||||||
|
"autocloseEnabled":"Autoclose Enabled",
|
||||||
|
"autocloseDisabled":"Autoclose Disabled",
|
||||||
|
"autodelete":"Ticket Autodeleted",
|
||||||
|
"autodeleteEnabled":"Autodelete Enabled",
|
||||||
|
"autodeleteDisabled":"Autodelete Disabled"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"Your ticket has been created. Click the button below to access it!",
|
||||||
|
"close":"The ticket has been closed succesfully!",
|
||||||
|
"delete":"The ticket has been deleted succesfully!",
|
||||||
|
"reopen":"The ticket has been reopened succesfully!",
|
||||||
|
"claim":"The ticket has been claimed succesfully!",
|
||||||
|
"unclaim":"The ticket has been unclaimed succesfully!",
|
||||||
|
"pin":"The ticket has been pinned succesfully!",
|
||||||
|
"unpin":"The ticket has been unpinned succesfully!",
|
||||||
|
"rename":"The ticket has been renamed to {0} succesfully!",
|
||||||
|
"move":"The ticket has been moved to {0} succesfully!",
|
||||||
|
"add":"{0} has been added to the ticket succesfully!",
|
||||||
|
"remove":"{0} has been removed from the ticket succesfully!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<name>` => required parameter\n`[name]` => optional parameter",
|
||||||
|
"statsReset":"The bot stats have been reset successfully!",
|
||||||
|
"statsError":"Unable to view ticket stats!\n{0} is not a ticket!",
|
||||||
|
"blacklistAdd":"{0} has been blacklisted successfully!",
|
||||||
|
"blacklistRemove":"{0} has been released successfully!",
|
||||||
|
"blacklistGetSuccess":"{0} is currently blacklisted!",
|
||||||
|
"blacklistGetEmpty":"{0} is currently not blacklisted!",
|
||||||
|
"blacklistViewEmpty":"No-one has been blacklisted yet!",
|
||||||
|
"blacklistViewTip":"Use \"/blacklist add\" to blacklist a user!",
|
||||||
|
"clearVerify":"Are you sure you want to delete multiple tickets?\nThis action can't be undone!",
|
||||||
|
"clearReady":"{0} tickets have been deleted succesfully!",
|
||||||
|
"rolesEmpty":"No roles have been updated!",
|
||||||
|
|
||||||
|
"autocloseLeave":"This ticket has been autoclosed because the creator left the server!",
|
||||||
|
"autocloseTimeout":"This ticket has been autoclosed because it has been inactive for more than `{0}h`!",
|
||||||
|
"autodeleteLeave":"This ticket has been autodeleted because the creator left the server!",
|
||||||
|
"autodeleteTimeout":"This ticket has been autodeleted because it has been inactive for more than `{0} days`!",
|
||||||
|
"autocloseEnabled":"Autoclose has been enabled in this ticket!\nIt will be closed when it is inactive for more than `{0}h`!",
|
||||||
|
"autocloseDisabled":"Autoclose has been disabled in this ticket!\nIt won't be closed automatically anymore!",
|
||||||
|
"autodeleteEnabled":"Autodelete has been enabled in this ticket!\nIt will be deleted when it is inactive for more than `{0} days`!",
|
||||||
|
"autodeleteDisabled":"Autodelete has been disabled in this ticket!\nIt won't be deleted automatically anymore!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"You can only create {0} ticket(s) at the same time!",
|
||||||
|
"ticketMessageAutoclose":"This ticket will be autoclosed when inactive for {0}h!",
|
||||||
|
"ticketMessageAutodelete":"This ticket will be autodeleted when inactive for {0} days!",
|
||||||
|
"panelReady":"You can find the panel below!\nThis message can now be deleted!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Why did you close this ticket?",
|
||||||
|
"deletePlaceholder":"Why did you delete this ticket?",
|
||||||
|
"reopenPlaceholder":"Why did you reopen this ticket?",
|
||||||
|
"claimPlaceholder":"Why did you claim this ticket?",
|
||||||
|
"unclaimPlaceholder":"Why did you unclaim this ticket?",
|
||||||
|
"pinPlaceholder":"Why did you pin this ticket?",
|
||||||
|
"unpinPlaceholder":"Why did you unpin this ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"A new ticket got created by {0}!",
|
||||||
|
"closeLog":"This ticket has been closed by {0}!",
|
||||||
|
"closeDm":"Your ticket has been closed in our server!",
|
||||||
|
"deleteLog":"This ticket has been deleted by {0}!",
|
||||||
|
"deleteDm":"Your ticket has been deleted in our server!",
|
||||||
|
"reopenLog":"This ticket has been reopened by {0}!",
|
||||||
|
"reopenDm":"Your ticket has been reopened in our server!",
|
||||||
|
"claimLog":"This ticket has been claimed by {0}!",
|
||||||
|
"claimDm":"Your ticket has been claimed in our server!",
|
||||||
|
"unclaimLog":"This ticket has been unclaimed by {0}!",
|
||||||
|
"unclaimDm":"Your ticket has been unclaimed in our server!",
|
||||||
|
"pinLog":"This ticket has been pinned by {0}!",
|
||||||
|
"pinDm":"Your ticket has been pinned in our server!",
|
||||||
|
"unpinLog":"This ticket has been unpinned by {0}!",
|
||||||
|
"unpinDm":"Your ticket has been unpinned in our server!",
|
||||||
|
"renameLog":"This ticket has been renamed to {0} by {1}!",
|
||||||
|
"renameDm":"Your ticket has been renamed to {0} in our server!",
|
||||||
|
"moveLog":"This ticket has been moved to {0} by {1}!",
|
||||||
|
"moveDm":"Your ticket has been moved to {0} in our server!",
|
||||||
|
"addLog":"{0} has been added to this ticket by {1}!",
|
||||||
|
"addDm":"{0} has been added to your ticket in our server!",
|
||||||
|
"removeLog":"{0} has been removed from this ticket by {1}!",
|
||||||
|
"removeDm":"{0} has been removed from your ticket in our server!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} was blacklisted by {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} was removed from the blacklist by {1}!",
|
||||||
|
"blacklistAddDm":"You have been blacklisted in our server!\nFrom now on, you are unable to create a ticket!",
|
||||||
|
"blacklistRemoveDm":"You have been removed from the blacklist in our server!\nNow you can create tickets again!",
|
||||||
|
"clearLog":"{0} tickets have been deleted by {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Visit Transcript",
|
||||||
|
"ready":"Transcript Created",
|
||||||
|
"textFileDescription":"This is the text transcript of a deleted ticket!",
|
||||||
|
"htmlProgress":"Please wait while this html transcript is getting processed...",
|
||||||
|
|
||||||
|
"createdChannel":"A new {0} transcript has been created in the server!",
|
||||||
|
"createdCreator":"A new {0} transcript has been created for one of your tickets!",
|
||||||
|
"createdParticipant":"A new {0} transcript has been created in one of the tickets you participated in!",
|
||||||
|
"createdActiveAdmin":"A new {0} transcript has been created in one of the tickets you participated as admin!",
|
||||||
|
"createdEveryAdmin":"A new {0} transcript has been created in one of the tickets you were admin in!",
|
||||||
|
"createdOther":"A new {0} transcript has been created!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Retry",
|
||||||
|
"continue":"Delete Without Transcript",
|
||||||
|
"backup":"Create Backup Transcript",
|
||||||
|
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Internal Error",
|
||||||
|
"optionMissing":"Command Option Missing",
|
||||||
|
"optionInvalid":"Command Option Invalid",
|
||||||
|
"unknownCommand":"Unknown Command",
|
||||||
|
"noPermissions":"No Permissions",
|
||||||
|
"unknownTicket":"Unknown Ticket",
|
||||||
|
"deprecatedTicket":"Deprecated Ticket",
|
||||||
|
"unknownOption":"Unknown Option",
|
||||||
|
"unknownPanel":"Unknown Panel",
|
||||||
|
"notInGuild":"Not In Server",
|
||||||
|
"channelRename":"Unable To Rename Channel",
|
||||||
|
"busy":"Ticket Is Busy"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Contact the owner of this bot for more info!",
|
||||||
|
"askForInfoResolve":"Contact the bot owner of this bot if this issue doesn't resolve after a few tries.",
|
||||||
|
"internalError":"Failed to respond to this {0} due to an internal error!",
|
||||||
|
"optionMissing":"A required parameter is missing in this command!",
|
||||||
|
"optionInvalid":"A parameter in this command is invalid!",
|
||||||
|
"optionInvalidChoose":"Choose between",
|
||||||
|
"unknownCommand":"Try visiting the help menu for more info!",
|
||||||
|
"noPermissions":"You are not allowed to use this {0}!",
|
||||||
|
"noPermissionsList":"Required Permissions: (one of them)",
|
||||||
|
"noPermissionsCooldown":"You are not allowed to use this {0} because you have a cooldown!",
|
||||||
|
"noPermissionsBlacklist":"You are not allowed to use this {0} because you have been blacklisted!",
|
||||||
|
"noPermissionsLimitGlobal":"You are not allowed to create a ticket because the server reached the max tickets limit!",
|
||||||
|
"noPermissionsLimitGlobalUser":"You are not allowed to create a ticket because you reached the max tickets limit!",
|
||||||
|
"noPermissionsLimitOption":"You are not allowed to create a ticket because the server reached the max tickets limit for this option!",
|
||||||
|
"noPermissionsLimitOptionUser":"You are not allowed to create a ticket because you reached the max tickets limit for this option!",
|
||||||
|
"unknownTicket":"Try this command again in a valid ticket!",
|
||||||
|
"deprecatedTicket":"The current channel is not a valid ticket! It might have been a ticket from an old Open Ticket version!",
|
||||||
|
"notInGuild":"This {0} doesn't work in DM! Please try it again in a server!",
|
||||||
|
"channelRename":"Due to discord ratelimits, it's currently impossible for the bot to rename the channel. The channel will automatically be renamed over 10 minutes if the bot isn't rebooted.",
|
||||||
|
"channelRenameSource":"The source of this error is: {0}",
|
||||||
|
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"Value doesn't match pattern!",
|
||||||
|
"stringMinLength":"Value needs to be at least {0} characters!",
|
||||||
|
"stringMaxLength":"Value needs to be at most {0} characters!",
|
||||||
|
"numberInvalid":"Invalid number!",
|
||||||
|
"numberMin":"Number needs to be at least {0}!",
|
||||||
|
"numberMax":"Number needs to be at most {0}!",
|
||||||
|
"numberDecimal":"Number is not allowed to be a decimal!",
|
||||||
|
"numberNegative":"Number is not allowed to be negative!",
|
||||||
|
"numberPositive":"Number is not allowed to be positive!",
|
||||||
|
"numberZero":"Number is not allowed to be zero!",
|
||||||
|
"channelNotFound":"Unable to find channel!",
|
||||||
|
"userNotFound":"Unable to find user!",
|
||||||
|
"roleNotFound":"Unable to find role!",
|
||||||
|
"memberNotFound":"Unable to find user!",
|
||||||
|
"mentionableNotFound":"Unable to find user or role!",
|
||||||
|
"channelType":"Invalid channel type!",
|
||||||
|
"notInGuild":"This option requires you to be in a server!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"You need to be the developer of the bot.",
|
||||||
|
"owner":"You need to be the server owner.",
|
||||||
|
"admin":"You need to be a server admin.",
|
||||||
|
"moderator":"You need to be a moderator.",
|
||||||
|
"support":"You need to be in the support team.",
|
||||||
|
"member":"You need to be a member.",
|
||||||
|
"discord-administrator":"You need to have the `ADMINISTRATOR` permission."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"Ticket is already closed!",
|
||||||
|
"reopen":"Ticket is not closed yet!",
|
||||||
|
"claim":"Ticket is already claimed!",
|
||||||
|
"unclaim":"Ticket is not claimed yet!",
|
||||||
|
"pin":"Ticket is already pinned!",
|
||||||
|
"unpin":"Ticket is not pinned yet!",
|
||||||
|
"add":"This user is already able to access the ticket!",
|
||||||
|
"remove":"Unable to remove this user from the ticket!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickets",
|
||||||
|
"reason":"Reason",
|
||||||
|
"creator":"Creator",
|
||||||
|
"remaining":"Time Remaining",
|
||||||
|
"added":"Added",
|
||||||
|
"removed":"Removed",
|
||||||
|
"filter":"Filter",
|
||||||
|
"claimedBy":"Claimed By {0}",
|
||||||
|
"method":"Method",
|
||||||
|
"type":"Type",
|
||||||
|
"blacklisted":"Blacklisted",
|
||||||
|
"panel":"Panel",
|
||||||
|
"command":"Command",
|
||||||
|
"system":"System",
|
||||||
|
"true":"True",
|
||||||
|
"false":"False",
|
||||||
|
"syntax":"Syntax",
|
||||||
|
"originalName":"Original Name",
|
||||||
|
"newName":"New Name",
|
||||||
|
"until":"Until",
|
||||||
|
"validOptions":"Valid Options",
|
||||||
|
"validPanels":"Valid Panels",
|
||||||
|
"autoclose":"Autoclose",
|
||||||
|
"autodelete":"Autodelete",
|
||||||
|
"startupDate":"Startup Date",
|
||||||
|
"version":"Version",
|
||||||
|
"name":"Name",
|
||||||
|
"role":"Role",
|
||||||
|
"status":"Status",
|
||||||
|
"claimed":"Claimed",
|
||||||
|
"pinned":"Pinned",
|
||||||
|
"creationDate":"Creation Date"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"text",
|
||||||
|
"html":"html",
|
||||||
|
"command":"command",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"button",
|
||||||
|
"dropdown":"dropdown",
|
||||||
|
"method":"method"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Specify an optional reason that will be visible in logs.",
|
||||||
|
"help":"Get a list of all the available commands.",
|
||||||
|
"panel":"Spawn a message with a dropdown or buttons (for ticket creation).",
|
||||||
|
"panelId":"The identifier of the panel that you want to spawn.",
|
||||||
|
"panelAutoUpdate":"Do you want this panel to automatically update when edited?",
|
||||||
|
"ticket":"Instantly create a ticket.",
|
||||||
|
"ticketId":"The identifier of the ticket that you want to create.",
|
||||||
|
"close":"Close a ticket.",
|
||||||
|
"delete":"Delete a ticket.",
|
||||||
|
"deleteNoTranscript":"Delete this ticket without creating a transcript.",
|
||||||
|
"reopen":"Reopen a ticket.",
|
||||||
|
"claim":"Claim a ticket.",
|
||||||
|
"claimUser":"Claim this ticket to someone else instead of yourself.",
|
||||||
|
"unclaim":"Unclaim a ticket.",
|
||||||
|
"pin":"Pin a ticket.",
|
||||||
|
"unpin":"Unpin a ticket.",
|
||||||
|
"move":"Move a ticket.",
|
||||||
|
"moveId":"The identifier of the option that you want to move to.",
|
||||||
|
"rename":"Rename a ticket.",
|
||||||
|
"renameName":"The new name for this ticket.",
|
||||||
|
"add":"Add a user to a ticket.",
|
||||||
|
"addUser":"The user to add.",
|
||||||
|
"remove":"Remove a user from a ticket.",
|
||||||
|
"removeUser":"The user to remove.",
|
||||||
|
"blacklist":"Manage the ticket blacklist.",
|
||||||
|
"blacklistView":"View a list of the current blacklist.",
|
||||||
|
"blacklistAdd":"Add a user to the blacklist.",
|
||||||
|
"blacklistRemove":"Remove a user from the blacklist.",
|
||||||
|
"blacklistGet":"Get the details from a blacklisted user.",
|
||||||
|
"blacklistGetUser":"The user to get details from.",
|
||||||
|
"stats":"View statistics from the bot, a member or a ticket.",
|
||||||
|
"statsReset":"Reset all the stats of the bot (and start counting from zero).",
|
||||||
|
"statsGlobal":"View the global stats.",
|
||||||
|
"statsUser":"View the stats from a user in the server.",
|
||||||
|
"statsUserUser":"The user to view.",
|
||||||
|
"statsTicket":"View the stats of a ticket in the server.",
|
||||||
|
"statsTicketTicket":"The ticket to view.",
|
||||||
|
"clear":"Delete multiple tickets at the same time.",
|
||||||
|
"clearFilter":"The filter for clearing tickets.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"All",
|
||||||
|
"open":"Open",
|
||||||
|
"close":"Closed",
|
||||||
|
"claim":"Claimed",
|
||||||
|
"unclaim":"Unclaimed",
|
||||||
|
"pin":"Pinned",
|
||||||
|
"unpin":"Unpinned",
|
||||||
|
"autoclose":"Autoclosed"
|
||||||
|
},
|
||||||
|
"autoclose":"Manage autoclose in a ticket.",
|
||||||
|
"autocloseDisable":"Disable autoclose in this ticket.",
|
||||||
|
"autocloseEnable":"Enable autoclose in this ticket.",
|
||||||
|
"autocloseEnableTime":"The amount of hours this ticket needs to be inactive to close it.",
|
||||||
|
"autodelete":"Manage autodelete in a ticket.",
|
||||||
|
"autodeleteDisable":"Disable autodelete in this ticket.",
|
||||||
|
"autodeleteEnable":"Enable autodelete in this ticket.",
|
||||||
|
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Get a list of all the available commands.",
|
||||||
|
"ticket":"Instantly create a ticket.",
|
||||||
|
"close":"Close a ticket, this disables writing in this channel.",
|
||||||
|
"delete":"Delete a ticket, this creates a transcript when enabled.",
|
||||||
|
"reopen":"Reopen a ticket, this enables writing in this channel again.",
|
||||||
|
"pin":"Pin a ticket. This will move the ticket to the top and will add a '📌' emoij to the name.",
|
||||||
|
"unpin":"Unpin a ticket. The ticket will stay on it's position but will lose the '📌' emoij.",
|
||||||
|
"move":"Move a ticket. This will change the type of this ticket.",
|
||||||
|
"rename":"Rename a ticket. This will change the channel name of this ticket.",
|
||||||
|
"claim":"Claim a ticket. With this, you can let your team know you are handling this ticket.",
|
||||||
|
"unclaim":"Unclaim a ticket. With this, you can let your team know that this ticket is free again.",
|
||||||
|
"add":"Add a user to a ticket. This will allow the user to read & write in this ticket.",
|
||||||
|
"remove":"Remove a user from a ticket. This will remove the ability to read & write for a user in this ticket.",
|
||||||
|
"panel":"Spawn a message with a dropdown or buttons (for ticket creation).",
|
||||||
|
"blacklistView":"View a list of the current blacklist.",
|
||||||
|
"blacklistAdd":"Add a user to the blacklist.",
|
||||||
|
"blacklistRemove":"Remove a user from the blacklist.",
|
||||||
|
"blacklistGet":"Get the details from a blacklisted user.",
|
||||||
|
"statsGlobal":"View the global stats.",
|
||||||
|
"statsTicket":"View the stats of a ticket in the server.",
|
||||||
|
"statsUser":"View the stats from a user in the server.",
|
||||||
|
"statsReset":"Reset all the stats of the bot (and start counting from zero).",
|
||||||
|
"autocloseDisable":"Disable autoclose in this ticket.",
|
||||||
|
"autocloseEnable":"Enable autoclose in this ticket.",
|
||||||
|
"autodeleteDisable":"Disable autodelete in this ticket.",
|
||||||
|
"autodeleteEnable":"Enable autodelete in this ticket."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Global Stats",
|
||||||
|
"system":"System Stats",
|
||||||
|
"user":"User Stats",
|
||||||
|
"ticket":"Ticket Stats",
|
||||||
|
"participants":"Participants"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Tickets Created",
|
||||||
|
"ticketsClosed":"Tickets Closed",
|
||||||
|
"ticketsDeleted":"Tickets Deleted",
|
||||||
|
"ticketsReopened":"Tickets Reopened",
|
||||||
|
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||||
|
"ticketsClaimed":"Tickets Claimed",
|
||||||
|
"ticketsPinned":"Tickets Pinned",
|
||||||
|
"ticketsMoved":"Tickets Moved",
|
||||||
|
"usersBlacklisted":"Users Blacklisted",
|
||||||
|
"transcriptsCreated":"Transcripts Created"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,477 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.0",
|
||||||
|
"translator":"spyeye_",
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"Czech"
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[WARNING]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"CONFIG CHECKER",
|
||||||
|
"headerDescription":"kontrola chyb v konfiguračních souborech!",
|
||||||
|
"footerError":"Bot se nespustí, dokud všechny {0} nebudou opraveny!",
|
||||||
|
"footerWarning":"Doporučejeme opravit všechny {0} před spuštěním!",
|
||||||
|
"footerSupport":"PODPORA: {0} - DOKUMENTACE: {1}",
|
||||||
|
"compactInformation":"Použij {0} pro více informací!",
|
||||||
|
"dataPath":"path",
|
||||||
|
"dataDocs":"docs",
|
||||||
|
"dataMessages":"message"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"Tento string nesmí být kratší než {0} znaků!",
|
||||||
|
"stringTooLong":"Tento string nesmí být delší než {0} znaků!",
|
||||||
|
"stringLengthInvalid":"Tento string musí mít délku {0} znaků!",
|
||||||
|
"stringStartsWith":"Tento string musí začínat {0}!",
|
||||||
|
"stringEndsWith":"Tento string musí končit {0}!",
|
||||||
|
"stringContains":"Tento string musí obsahovat {0}!",
|
||||||
|
"stringChoices":"Tento string může být pouze jednou z následujících možností: {0}!",
|
||||||
|
"stringRegex":"Tento string je neplatný!",
|
||||||
|
|
||||||
|
"numberTooShort":"Toto číslo nesmí být kratší než {0} znaků!",
|
||||||
|
"numberTooLong":"Toto číslo nesmí být delší než {0} znaků.!",
|
||||||
|
"numberLengthInvalid":"Toto číslo musí mít délku {0} znaků.!",
|
||||||
|
"numberTooSmall":"Toto číslo musí být alespoň {0}.!",
|
||||||
|
"numberTooLarge":"Toto číslo musí být nejvýše {0}!",
|
||||||
|
"numberNotEqual":"Toto číslo musí být {0}!",
|
||||||
|
"numberStep":"Toto číslo musí být násobkem {0}.!",
|
||||||
|
"numberStepOffset":"Toto číslo musí být násobkem {0} žačínající {1}.!",
|
||||||
|
"numberStartsWith":"Toto číslo musí začínat {0}!",
|
||||||
|
"numberEndsWith":"Toto číslo musí končit {0}!",
|
||||||
|
"numberContains":"Toto číslo musí obsahovat {0}!",
|
||||||
|
"numberChoices":"Toto číslo může být pouze jedno z následujících hodnot: {0}!",
|
||||||
|
"numberFloat":"Toto číslo nemůže být desetinné!",
|
||||||
|
"numberNegative":"Toto číslo nemůže být záporné!",
|
||||||
|
"numberPositive":"Toto číslo nemůže být kladné!",
|
||||||
|
"numberZero":"Toto číslo nemůže být nula!",
|
||||||
|
|
||||||
|
"booleanTrue":"Tento boolean nemůže být true!",
|
||||||
|
"booleanFalse":"Tento boolean nemůže být false!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"Toto pole nesmí být prázdné.!",
|
||||||
|
"arrayEmptyRequired":"Toto pole musí být prázdné!",
|
||||||
|
"arrayTooShort":"Toto pole musí mít délku alespoň {0}!",
|
||||||
|
"arrayTooLong":"Toto pole musí mít délku maximálně {0}!",
|
||||||
|
"arrayLengthInvalid":"Toto pole musí mít délku {0}!",
|
||||||
|
"arrayInvalidTypes":"Toto pole může obsahovat pouze následující typy: {0}!",
|
||||||
|
"arrayDouble":"Toto pole neumožňuje zadat stejnou hodnotu dvakrát.!",
|
||||||
|
|
||||||
|
"discordInvalidId":"Toto je neplatné discord {0} id!",
|
||||||
|
"discordInvalidIdOptions":"Toto je neplatné Discord ID {0}! Můžete také použít jeden z těchto: {1}!",
|
||||||
|
"discordInvalidToken":"Toto je neplatný discord token (syntakticky)!",
|
||||||
|
"colorInvalid":"Toto je neplatná hex barva!",
|
||||||
|
"emojiTooShort":"Tento string musí obsahovat alespoň {0} emotikonů.!",
|
||||||
|
"emojiTooLong":"Tento string musí obsahovat nejvýše {0} emotikonů.!",
|
||||||
|
"emojiCustom":"Tento emotikon nemůže být custom emotikon!",
|
||||||
|
"emojiInvalid":"Toto je neplatný emotikon!",
|
||||||
|
"urlInvalid":"Tato url adresa je neplatná!",
|
||||||
|
"urlInvalidHttp":"Tato url může používat pouze protokol https://!",
|
||||||
|
"urlInvalidProtocol":"Tato url může používat pouze protokoly http:// a https://!",
|
||||||
|
"urlInvalidHostname":"Tato url má zakázané hostitelské jméno!",
|
||||||
|
"urlInvalidExtension":"Tato url má neplatnou příponu! Vyberte si mezi: {0}!",
|
||||||
|
"urlInvalidPath":"Tato url má neplatnou cestu!",
|
||||||
|
"idNotUnique":"Toto id není jedinečné, místo něj použijte jiné id!",
|
||||||
|
"idNonExistent":"Id {0} neexistuje!",
|
||||||
|
|
||||||
|
"invalidType":"Toto nastavení musí být typu: {0}!",
|
||||||
|
"propertyMissing":"U tohoto objektu chybí vlastnost {0}!",
|
||||||
|
"propertyOptional":"Vlastnost {0} je v tomto objektu nepovinná!",
|
||||||
|
"objectDisabled":"Tento objekt je zakázán, povolte jej pomocí {0}!",
|
||||||
|
"nullInvalid":"Tato vlastnost nemůže být nulová!",
|
||||||
|
"switchInvalidType":"Musí se jednat o jeden z následujících typů: {0}!",
|
||||||
|
"objectSwitchInvalid":"Tento objekt musí být jednoho z následujících typů: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"Jedná se o neplatný jazyk!",
|
||||||
|
"invalidButton":"Toto tlačítko musí mít alespoň {0} nebo {1}!",
|
||||||
|
"unusedOption":"Možnost {0} se nikde nepoužívá!",
|
||||||
|
"unusedQuestion":"Otázka {0} není nikde použita!",
|
||||||
|
"dropdownOption":"Panel s povoleným rozevíracím seznamem může obsahovat pouze možnosti typu „ticketu“!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Zobrazit ticket",
|
||||||
|
"close":"Uzavřít ticket",
|
||||||
|
"delete":"Vymazat ticket",
|
||||||
|
"reopen":"Znovu otevřít ticket",
|
||||||
|
"claim":"Převzít ticket",
|
||||||
|
"unclaim":"Zrušit převzetí ticketu",
|
||||||
|
"pin":"Připnout ticket",
|
||||||
|
"unpin":"Odepnout ticket",
|
||||||
|
"clear":"Vymazat tickety",
|
||||||
|
"helpSwitchSlash":"Zobrazit slash příkazy",
|
||||||
|
"helpSwitchText":"Zobrazit textové příkazy",
|
||||||
|
"helpPage":"Strana {0}",
|
||||||
|
"withReason":"S důvodem",
|
||||||
|
"withoutTranscript":"Bez důvodu"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket vytvořen",
|
||||||
|
"close":"Ticket uzavřen",
|
||||||
|
"delete":"Ticket vymazán",
|
||||||
|
"reopen":"Ticket znovu otevřen",
|
||||||
|
"claim":"Ticket převzat",
|
||||||
|
"unclaim":"Ticket již není převezmut",
|
||||||
|
"pin":"Ticket připnut",
|
||||||
|
"unpin":"Ticket odepnut",
|
||||||
|
"rename":"Ticket přejmenován",
|
||||||
|
"move":"Ticket přesunut",
|
||||||
|
"add":"Uživatel přidán",
|
||||||
|
"remove":"Uživatel odebrán",
|
||||||
|
|
||||||
|
"help":"Dostupné příkazy:",
|
||||||
|
"statsReset":"Resetovat statistiky",
|
||||||
|
"blacklistAdd":"Uživatel blacklistován",
|
||||||
|
"blacklistRemove":"Uživatel odebrán z blacklistu",
|
||||||
|
"blacklistGet":"Uživatel na blacklistu",
|
||||||
|
"blacklistView":"Aktuální blacklist",
|
||||||
|
"blacklistAddDm":"Přidán na blacklistu",
|
||||||
|
"blacklistRemoveDm":"Odebrán z blacklistu",
|
||||||
|
"clear":"Tickety vyčištěny",
|
||||||
|
"roles":"Role aktualizovány",
|
||||||
|
|
||||||
|
"autoclose":"Ticket automaticky uzavřen",
|
||||||
|
"autocloseEnabled":"Automatické uzavření povoleno",
|
||||||
|
"autocloseDisabled":"Automatické uzavření zakázáno",
|
||||||
|
"autodelete":"Ticket automaticky vymazán",
|
||||||
|
"autodeleteEnabled":"Automatické mazání povoleno",
|
||||||
|
"autodeleteDisabled":"Automatické mazání zakázáno"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"Tvůj ticket byl vytvořen. Klikni na tlačítko pod zprávou pro zobrazení!",
|
||||||
|
"close":"Ticket byl úspěšně uzavřen!",
|
||||||
|
"delete":"Ticket byl úspěšně vymazán!",
|
||||||
|
"reopen":"Ticket byl úspěšně znovu otevřen!",
|
||||||
|
"claim":"Ticket byl úspěšně převzat!",
|
||||||
|
"unclaim":"Ticket již není převezmut!",
|
||||||
|
"pin":"Ticket byl úspěšně připnut!",
|
||||||
|
"unpin":"Ticket byl úspěšně odepnut!",
|
||||||
|
"rename":"Ticket byl úspěšně přejmenován na {0}!",
|
||||||
|
"move":"Ticket byl úspěšně přesunut do {0}!",
|
||||||
|
"add":"{0} byl úspěšně přidán do ticketu!",
|
||||||
|
"remove":"{0} byl úspěšně odstraněn z ticketu!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<name>` => povinný parametr\n`[name]` => nepovinný parametr",
|
||||||
|
"statsReset":"Statistiky bota byly úspěšně resetovány!",
|
||||||
|
"statsError":"Nelze zobrazit statistiky ticketu!\n{0} není ticket!",
|
||||||
|
"blacklistAdd":"{0} byl přídán na blacklist!",
|
||||||
|
"blacklistRemove":"{0} byl odebrán z blacklistu!",
|
||||||
|
"blacklistGetSuccess":"{0} je nyní na blacklistu!",
|
||||||
|
"blacklistGetEmpty":"{0} nyní není na blacklistu!",
|
||||||
|
"blacklistViewEmpty":"Na blacklistu ještě nikdo není",
|
||||||
|
"blacklistViewTip":"Použij \"/blacklist add\" pro přidání uživatele na blacklist!",
|
||||||
|
"clearVerify":"Opravdu chcete smazat více ticketů?\nTuto akci nelze vrátit zpět!",
|
||||||
|
"clearReady":"{0} ticketů bylo úspěšně smazány!",
|
||||||
|
"rolesEmpty":"Žádné role nebyly aktualizovány!",
|
||||||
|
|
||||||
|
"autocloseLeave":"Tento ticket byl automaticky uzavřen, protože jeho autor opustil server.!",
|
||||||
|
"autocloseTimeout":"Tento ticket byl automaticky uzavřen, protože byl neaktivní déle než `{0}h`!",
|
||||||
|
"autodeleteLeave":"Tento ticket byl automaticky smazán, protože jeho autor opustil server!",
|
||||||
|
"autodeleteTimeout":"Tento ticket byl automaticky smazán, protože je neaktivní déle než `{0} dní`!",
|
||||||
|
"autocloseEnabled":"U tohoto ticketu bylo povoleno automatické uzavření!\nTicket bude uzavřen, pokud bude neaktivní déle než `{0}h`!",
|
||||||
|
"autocloseDisabled":"U tohoto ticketu bylo vypnuto automatické zavírání!\nUž se nebude automaticky zavírat!",
|
||||||
|
"autodeleteEnabled":"U tohoto ticketu bylo povoleno automatické mazání!\nBude smazán, pokud je neaktivní déle než `{0} dní`!",
|
||||||
|
"autodeleteDisabled":"Automatické mazání bylo v tomto zakázáno!\nUž se nebude automaticky mazat!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"Současně lze vytvořit pouze {0} ticketu!",
|
||||||
|
"ticketMessageAutoclose":"Tento ticket se automaticky uzavře, pokud je neaktivní po dobu {0}h!",
|
||||||
|
"ticketMessageAutodelete":"Tento ticket bude automaticky smazán, pokud bude neaktivní po dobu {0} dnů!",
|
||||||
|
"panelReady":"Panel najdete níže!\nTuto zprávu lze nyní smazat!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Proč jste tento ticket uzavřel?",
|
||||||
|
"deletePlaceholder":"Proč jste tento ticket smazali?",
|
||||||
|
"reopenPlaceholder":"Proč jste tento ticket znovu otevřeli?",
|
||||||
|
"claimPlaceholder":"Proč jste si vyžádal tento ticket?",
|
||||||
|
"unclaimPlaceholder":"Proč jste zrušili převzetí tohoto ticketu?",
|
||||||
|
"pinPlaceholder":"Proč jste připnuli tento ticket?",
|
||||||
|
"unpinPlaceholder":"Proč jste odepnuli tento ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"Nový ticket byl vytvořen uživatelem {0}!",
|
||||||
|
"closeLog":"Tento ticket byl uzavřen uživatelem {0}!",
|
||||||
|
"closeDm":"Tvůj ticket byl uzavřen na našem serveru!",
|
||||||
|
"deleteLog":"Tento ticket byl smazán uživatelem {0}!",
|
||||||
|
"deleteDm":"Tvůj ticket byl smazán na našem serveru!",
|
||||||
|
"reopenLog":"Tento ticket byl znovu otevřen uživatelem {0}!",
|
||||||
|
"reopenDm":"Tvůj ticket byl znovu otevřen na našem serveru!",
|
||||||
|
"claimLog":"Tento ticket byl přidělen uživatelem {0}!",
|
||||||
|
"claimDm":"Tvůj ticket byl přidělen na našem serveru!",
|
||||||
|
"unclaimLog":"Tento ticket byl odhlášen uživatelem {0}!",
|
||||||
|
"unclaimDm":"Tvůj ticket byl odhlášen na našem serveru!",
|
||||||
|
"pinLog":"Tento ticket byl připnut uživatelem {0}!",
|
||||||
|
"pinDm":"Tvůj ticket byl připnut na našem serveru!",
|
||||||
|
"unpinLog":"Tento ticket byl odepnut uživatelem {0}!",
|
||||||
|
"unpinDm":"Tvůj ticket byl odepnut na našem serveru!",
|
||||||
|
"renameLog":"Tento ticket byl přejmenován na {0} uživatelem {1}!",
|
||||||
|
"renameDm":"Tvůj ticket byl přejmenován na {0} na našem serveru!",
|
||||||
|
"moveLog":"Tento ticket byl přesunut do {0} uživatelem {1}!",
|
||||||
|
"moveDm":"Tvůj ticket byl přesunut do {0} na našem serveru!",
|
||||||
|
"addLog":"{0} byl přidán do tohoto ticketu uživatelem {1}!",
|
||||||
|
"addDm":"{0} byl přidán do tvého ticketu na našem serveru!",
|
||||||
|
"removeLog":"{0} byl odstraněn z tohoto ticketu uživatelem {1}!",
|
||||||
|
"removeDm":"{0} byl odstraněn z tvého ticketu na našem serveru!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} byl přidán na blacklist uživatelem {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} byl odstraněn z blacklistu uživatelem {1}!",
|
||||||
|
"blacklistAddDm":"Byl jsi přidán na blacklist na našem serveru!\nOd teď nemůžeš vytvářet tickety!",
|
||||||
|
"blacklistRemoveDm":"Byl jsi odstraněn z blacklistu na našem serveru!\nNyní můžeš opět vytvářet tickety!",
|
||||||
|
"clearLog":"{0} ticketů bylo smazáno uživatelem {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Zobrazit přepis",
|
||||||
|
"ready":"Přepis vytvořen",
|
||||||
|
"textFileDescription":"Toto je textový přepis smazaného ticketu!",
|
||||||
|
"htmlProgress":"Prosím, počkejte, zatímco se zpracovává HTML přepis...",
|
||||||
|
|
||||||
|
"createdChannel":"Na serveru byl vytvořen nový přepis {0}!",
|
||||||
|
"createdCreator":"Byl vytvořen nový přepis {0} pro jeden z tvých ticketů!",
|
||||||
|
"createdParticipant":"Byl vytvořen nový přepis {0} v jednom z ticketů, kterých ses účastnil!",
|
||||||
|
"createdActiveAdmin":"Byl vytvořen nový přepis {0} v jednom z ticketů, kterých ses účastnil jako admin!",
|
||||||
|
"createdEveryAdmin":"Byl vytvořen nový přepis {0} v jednom z ticketů, kde jsi byl adminem!",
|
||||||
|
"createdOther":"Byl vytvořen nový přepis {0}!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Zkusit Znovu",
|
||||||
|
"continue":"Vymazat bez přepisu",
|
||||||
|
"backup":"Vytvořit záložní přepis",
|
||||||
|
"error":"Při pokusu o vytvoření přepisu se něco pokazilo.\nCo chcete udělat?\n\nTento ticket nebude smazán, dokud nekliknete na jedno z těchto tlačítek."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Interní chyba",
|
||||||
|
"optionMissing":"Chybějící možnost příkazu",
|
||||||
|
"optionInvalid":"Neplatná možnost příkazu",
|
||||||
|
"unknownCommand":"Neznámý příkaz",
|
||||||
|
"noPermissions":"Nemáš oprávnění",
|
||||||
|
"unknownTicket":"Neznámý ticket",
|
||||||
|
"deprecatedTicket":"Zastaralý ticket",
|
||||||
|
"unknownOption":"Neznámá možnost",
|
||||||
|
"unknownPanel":"Neznámý panel",
|
||||||
|
"notInGuild":"Nejsi na serveru",
|
||||||
|
"channelRename":"Nepodařilo se přejmenovat kanál",
|
||||||
|
"busy":"Ticket je zaneprázdněn"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Pro více informací kontaktuj vlastníka tohoto bota!",
|
||||||
|
"askForInfoResolve":"Kontaktuj vlastníka tohoto bota, pokud se tento problém nevyřeší po několika pokusech.",
|
||||||
|
"internalError":"Nepodařilo se odpovědět na tento {0} kvůli interní chybě!",
|
||||||
|
"optionMissing":"V tomto příkazu chybí požadovaný parametr!",
|
||||||
|
"optionInvalid":"V tomto příkazu je neplatný parametr!",
|
||||||
|
"optionInvalidChoose":"Vyber z",
|
||||||
|
"unknownCommand":"Zkus navštívit nabídku nápovědy pro více informací!",
|
||||||
|
"noPermissions":"Nemáš oprávnění k použití tohoto {0}!",
|
||||||
|
"noPermissionsList":"Požadovaná oprávnění: (jedno z nich)",
|
||||||
|
"noPermissionsCooldown":"Nemáš oprávnění k použití tohoto {0}, protože máš cooldown!",
|
||||||
|
"noPermissionsBlacklist":"Nemáš oprávnění k použití tohoto {0}, protože jsi byl přidán na blacklist!",
|
||||||
|
"noPermissionsLimitGlobal":"Nemáš oprávnění vytvořit ticket, protože server dosáhl maximálního limitu ticketů!",
|
||||||
|
"noPermissionsLimitGlobalUser":"Nemáš oprávnění vytvořit ticket, protože jsi dosáhl maximálního limitu ticketů!",
|
||||||
|
"noPermissionsLimitOption":"Nemáš oprávnění vytvořit ticket, protože server dosáhl maximálního limitu ticketů pro tuto možnost!",
|
||||||
|
"noPermissionsLimitOptionUser":"Nemáš oprávnění vytvořit ticket, protože jsi dosáhl maximálního limitu ticketů pro tuto možnost!",
|
||||||
|
"unknownTicket":"Zkus tento příkaz znovu v platném ticketu!",
|
||||||
|
"deprecatedTicket":"Aktuální kanál není platný ticket! Může se jednat o ticket ze starší verze Open Ticketu!",
|
||||||
|
"notInGuild":"Tento {0} nefunguje v DM! Zkus to znovu na serveru!",
|
||||||
|
"channelRename":"Kvůli ratelimitům Discordu není momentálně možné, aby bot přejmenoval kanál. Kanál bude automaticky přejmenován do 10 minut, pokud nedojde k restartu bota.",
|
||||||
|
"channelRenameSource":"Zdroj této chyby je: {0}",
|
||||||
|
"busy":"Nelze použít tento {0}!\nTicket je momentálně zpracováván botem.\n\nZkus to prosím znovu za několik sekund!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"Hodnota neodpovídá vzoru!",
|
||||||
|
"stringMinLength":"Hodnota musí mít alespoň {0} znaků!",
|
||||||
|
"stringMaxLength":"Hodnota může mít maximálně {0} znaků!",
|
||||||
|
"numberInvalid":"Neplatné číslo!",
|
||||||
|
"numberMin":"Číslo musí být alespoň {0}!",
|
||||||
|
"numberMax":"Číslo může být maximálně {0}!",
|
||||||
|
"numberDecimal":"Číslo nesmí být desetinné!",
|
||||||
|
"numberNegative":"Číslo nesmí být záporné!",
|
||||||
|
"numberPositive":"Číslo nesmí být kladné!",
|
||||||
|
"numberZero":"Číslo nesmí být nula!",
|
||||||
|
"channelNotFound":"Nelze najít kanál!",
|
||||||
|
"userNotFound":"Nelze najít uživatele!",
|
||||||
|
"roleNotFound":"Nelze najít roli!",
|
||||||
|
"memberNotFound":"Nelze najít uživatele!",
|
||||||
|
"mentionableNotFound":"Nelze najít uživatele nebo roli!",
|
||||||
|
"channelType":"Neplatný typ kanálu!",
|
||||||
|
"notInGuild":"Tato možnost vyžaduje, abys byl na serveru!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"Musíš být vývojářem tohoto bota.",
|
||||||
|
"owner":"Musíš být vlastníkem serveru.",
|
||||||
|
"admin":"Musíš být adminem serveru.",
|
||||||
|
"moderator":"Musíš být moderátorem.",
|
||||||
|
"support":"Musíš být členem týmu podpory.",
|
||||||
|
"member":"Musíš být členem.",
|
||||||
|
"discord-administrator":"Musíš mít oprávnění `ADMINISTRATOR`."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"Ticket je již uzavřený!",
|
||||||
|
"reopen":"Ticket ještě není uzavřený!",
|
||||||
|
"claim":"Ticket je již přidělený!",
|
||||||
|
"unclaim":"Ticket ještě není přidělený!",
|
||||||
|
"pin":"Ticket je již připnutý!",
|
||||||
|
"unpin":"Ticket ještě není připnutý!",
|
||||||
|
"add":"Tento uživatel už má k ticketu přístup!",
|
||||||
|
"remove":"Tohoto uživatele nelze z ticketu odstranit!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickety",
|
||||||
|
"reason":"Důvod",
|
||||||
|
"creator":"Tvůrce",
|
||||||
|
"remaining":"Zbývající čas",
|
||||||
|
"added":"Přidáno",
|
||||||
|
"removed":"Odstraněno",
|
||||||
|
"filter":"Filtr",
|
||||||
|
"claimedBy":"Přiděleno uživatelem {0}",
|
||||||
|
"method":"Metoda",
|
||||||
|
"type":"Typ",
|
||||||
|
"blacklisted":"Na blacklistu",
|
||||||
|
"panel":"Panel",
|
||||||
|
"command":"Příkaz",
|
||||||
|
"system":"Systém",
|
||||||
|
"true":"true",
|
||||||
|
"false":"false",
|
||||||
|
"syntax":"Syntaxe",
|
||||||
|
"originalName":"Původní jméno",
|
||||||
|
"newName":"Nové jméno",
|
||||||
|
"until":"Do",
|
||||||
|
"validOptions":"Platné možnosti",
|
||||||
|
"validPanels":"Platné panely",
|
||||||
|
"autoclose":"Automatické uzavření",
|
||||||
|
"autodelete":"Automatické smazání",
|
||||||
|
"startupDate":"Datum spuštění",
|
||||||
|
"version":"Verze",
|
||||||
|
"name":"Jméno",
|
||||||
|
"role":"Role",
|
||||||
|
"status":"Stav",
|
||||||
|
"claimed":"Přiděleno",
|
||||||
|
"pinned":"Připnuto",
|
||||||
|
"creationDate":"Datum vytvoření"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"text",
|
||||||
|
"html":"html",
|
||||||
|
"command":"příkaz",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"tlačítko",
|
||||||
|
"dropdown":"roletka",
|
||||||
|
"method":"metoda"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Zadej nepovinný důvod, který bude viditelný v logu.",
|
||||||
|
"help":"Získej seznam všech dostupných příkazů.",
|
||||||
|
"panel":"Vytvoř zprávu s roletkou nebo tlačítky (pro vytvoření ticketu).",
|
||||||
|
"panelId":"Identifikátor panelu, který chceš vytvořit.",
|
||||||
|
"panelAutoUpdate":"Chceš, aby se tento panel automaticky aktualizoval při úpravách?",
|
||||||
|
"ticket":"Okamžitě vytvoř ticket.",
|
||||||
|
"ticketId":"Identifikátor ticketu, který chceš vytvořit.",
|
||||||
|
"close":"Uzavři ticket.",
|
||||||
|
"delete":"Smaž ticket.",
|
||||||
|
"deleteNoTranscript":"Smaž tento ticket bez vytvoření přepisu.",
|
||||||
|
"reopen":"Znovu otevři ticket.",
|
||||||
|
"claim":"Přiděl ticket.",
|
||||||
|
"claimUser":"Přiděl tento ticket někomu jinému místo sebe.",
|
||||||
|
"unclaim":"Odeber přidělení ticketu.",
|
||||||
|
"pin":"Připni ticket.",
|
||||||
|
"unpin":"Odepni ticket.",
|
||||||
|
"move":"Přesuň ticket.",
|
||||||
|
"moveId":"Identifikátor možnost, na který chceš přesunout.",
|
||||||
|
"rename":"Přejmenuj ticket.",
|
||||||
|
"renameName":"Nový název pro tento ticket.",
|
||||||
|
"add":"Přidej uživatele k ticketu.",
|
||||||
|
"addUser":"Uživatel k přidání.",
|
||||||
|
"remove":"Odstraň uživatele z ticketu.",
|
||||||
|
"removeUser":"Uživatel k odstranění.",
|
||||||
|
"blacklist":"Spravuj blacklist ticketů.",
|
||||||
|
"blacklistView":"Zobraz seznam aktuálního blacklistu.",
|
||||||
|
"blacklistAdd":"Přidej uživatele na blacklist.",
|
||||||
|
"blacklistRemove":"Odstraň uživatele z blacklistu.",
|
||||||
|
"blacklistGet":"Získej detaily o uživateli na blacklistu.",
|
||||||
|
"blacklistGetUser":"Uživatel, o kterém chceš získat detaily.",
|
||||||
|
"stats":"Zobraz statistiky bota, člena nebo ticketu.",
|
||||||
|
"statsReset":"Resetuj všechny statistiky bota (a začni počítat od nuly).",
|
||||||
|
"statsGlobal":"Zobraz globální statistiky.",
|
||||||
|
"statsUser":"Zobraz statistiky uživatele na serveru.",
|
||||||
|
"statsUserUser":"Uživatel, jehož statistiky chceš zobrazit.",
|
||||||
|
"statsTicket":"Zobraz statistiky ticketu na serveru.",
|
||||||
|
"statsTicketTicket":"Ticket, jehož statistiky chceš zobrazit.",
|
||||||
|
"clear":"Smaž více ticketů najednou. Lze zadat volitelný filtr.",
|
||||||
|
"clearFilter":"Filtr pro vymazání tiketů.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"Vše",
|
||||||
|
"open":"Otevřené",
|
||||||
|
"close":"Uzavřené",
|
||||||
|
"claim":"Přidělené",
|
||||||
|
"unclaim":"Nepřidělené",
|
||||||
|
"pin":"Připnuté",
|
||||||
|
"unpin":"Nepřipnuté",
|
||||||
|
"autoclose":"Automaticky uzavřené"
|
||||||
|
},
|
||||||
|
"autoclose":"Spravuj automatické uzavření ticketu.",
|
||||||
|
"autocloseDisable":"Deaktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autocloseEnable":"Aktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autocloseEnableTime":"Počet hodin neaktivity, po kterých se ticket uzavře.",
|
||||||
|
"autodelete":"Spravuj automatické smazání ticketu.",
|
||||||
|
"autodeleteDisable":"Deaktivuj automatické smazání v tomto ticketu.",
|
||||||
|
"autodeleteEnable":"Aktivuj automatické smazání v tomto ticketu.",
|
||||||
|
"autodeleteEnableTime":"Počet dnů neaktivity, po kterých se ticket smaže."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Získej seznam všech dostupných příkazů.",
|
||||||
|
"ticket":"Okamžitě vytvoř ticket.",
|
||||||
|
"close":"Uzavři ticket, čímž se zakáže psaní v tomto kanálu.",
|
||||||
|
"delete":"Smaž ticket, čímž se vytvoří přepis, pokud je to povoleno.",
|
||||||
|
"reopen":"Znovu otevři ticket, což opět umožní psaní v tomto kanálu.",
|
||||||
|
"pin":"Připni ticket. Tento ticket se přesune na začátek a bude mít ve jménu emoji '📌'.",
|
||||||
|
"unpin":"Odepni ticket. Ticket zůstane na svém místě, ale ztratí emoji '📌'.",
|
||||||
|
"move":"Přesuň ticket. Tím se změní typ tohoto ticketu.",
|
||||||
|
"rename":"Přejmenuj ticket. Tím se změní název kanálu tohoto ticketu.",
|
||||||
|
"claim":"Přiděl ticket. Tím dáš svému týmu najevo, že tento ticket řešíš.",
|
||||||
|
"unclaim":"Odeber přidělení ticketu. Tím dáš svému týmu najevo, že je tento ticket znovu volný.",
|
||||||
|
"add":"Přidej uživatele k ticketu. Tímto uživateli umožníš číst a psát v tomto ticketu.",
|
||||||
|
"remove":"Odstraň uživatele z ticketu. Tímto uživateli odebereš možnost číst a psát v tomto ticketu.",
|
||||||
|
"panel":"Vytvoř zprávu s roletkou nebo tlačítky (pro vytvoření ticketu).",
|
||||||
|
"blacklistView":"Zobraz seznam aktuálního blacklistu.",
|
||||||
|
"blacklistAdd":"Přidej uživatele na blacklist.",
|
||||||
|
"blacklistRemove":"Odstraň uživatele z blacklistu.",
|
||||||
|
"blacklistGet":"Získej detaily o uživateli na blacklistu.",
|
||||||
|
"statsGlobal":"Zobraz globální statistiky.",
|
||||||
|
"statsTicket":"Zobraz statistiky ticketu na serveru.",
|
||||||
|
"statsUser":"Zobraz statistiky uživatele na serveru.",
|
||||||
|
"statsReset":"Resetuj všechny statistiky bota (a začni počítat od nuly).",
|
||||||
|
"autocloseDisable":"Deaktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autocloseEnable":"Aktivuj automatické uzavření v tomto ticketu.",
|
||||||
|
"autodeleteDisable":"Deaktivuj automatické smazání v tomto ticketu.",
|
||||||
|
"autodeleteEnable":"Aktivuj automatické smazání v tomto ticketu."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Globální statistiky",
|
||||||
|
"system":"Statistiky systému",
|
||||||
|
"user":"Statistiky uživatele",
|
||||||
|
"ticket":"Statistiky ticketu",
|
||||||
|
"participants":"Účastníci"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Vytvořené tickety",
|
||||||
|
"ticketsClosed":"Uzavřené tickety",
|
||||||
|
"ticketsDeleted":"Smazané tickety",
|
||||||
|
"ticketsReopened":"Znovu otevřené tickety",
|
||||||
|
"ticketsAutoclosed":"Automaticky uzavřené tickety",
|
||||||
|
"ticketsClaimed":"Přidělené tickety",
|
||||||
|
"ticketsPinned":"Připnuté tickety",
|
||||||
|
"ticketsMoved":"Přesunuté tickety",
|
||||||
|
"usersBlacklisted":"Uživatelé na blacklistu",
|
||||||
|
"transcriptsCreated":"Vytvořené přepisy"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,477 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.0",
|
||||||
|
"translator":"DJj123dj",
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"Dutch"
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[WAARSCHUWING]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"CONFIG CHECKER",
|
||||||
|
"headerDescription":"check voor errors in je config bestanden!",
|
||||||
|
"footerError":"de bot start niet tot alle {0}'s opgelost zijn!",
|
||||||
|
"footerWarning":"het is aangeraden om alle {0}'en op te lossen voor het starten!",
|
||||||
|
"footerSupport":"SUPPORT: {0} - DOCS: {1}",
|
||||||
|
"compactInformation":"gebruik {0} voor meer informatie!",
|
||||||
|
"dataPath":"pad",
|
||||||
|
"dataDocs":"docs",
|
||||||
|
"dataMessages":"bericht"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"Deze tekst kan niet korter dan {0} karakters zijn!",
|
||||||
|
"stringTooLong":"Deze tekst kan niet langer dan {0} karakters zijn!",
|
||||||
|
"stringLengthInvalid":"Deze tekst moet {0} karakters lang zijn!",
|
||||||
|
"stringStartsWith":"Deze tekst moet starten met {0}!",
|
||||||
|
"stringEndsWith":"Deze tekst moet eindigen met {0}!",
|
||||||
|
"stringContains":"Deze tekst moet {0} bevatten!",
|
||||||
|
"stringChoices":"Deze tekst kan alleen de volgende waardes bevatten: {0}!",
|
||||||
|
"stringRegex":"Deze tekst is ongeldig!",
|
||||||
|
|
||||||
|
"numberTooShort":"Dit nummer kan niet korter dan {0} karakters zijn!",
|
||||||
|
"numberTooLong":"Dit nummer kan niet langer dan {0} karakters zijn!",
|
||||||
|
"numberLengthInvalid":"Dit nummer moet {0} karakters lang zijn!",
|
||||||
|
"numberTooSmall":"Dit nummer moet minimum {0} zijn!",
|
||||||
|
"numberTooLarge":"Dit nummer kan maximum {0} zijn!",
|
||||||
|
"numberNotEqual":"Dit nummer moet gelijk zijn aan {0}!",
|
||||||
|
"numberStep":"Dit nummer moet een meervoud zijn van {0}!",
|
||||||
|
"numberStepOffset":"Dit nummer moet een meervoud zijn van {0} startend bij {1}!",
|
||||||
|
"numberStartsWith":"Dit nummer moet starten met {0}!",
|
||||||
|
"numberEndsWith":"Dit nummer moet eindigen met {0}!",
|
||||||
|
"numberContains":"Dit nummer moet {0} bevatten!",
|
||||||
|
"numberChoices":"Dit nummer kan alleen een van de volgende waardes bevatten: {0}!",
|
||||||
|
"numberFloat":"Dit nummer kan geen kommagetal zijn!",
|
||||||
|
"numberNegative":"Dit nummer kan niet negatief zijn!",
|
||||||
|
"numberPositive":"Dit nummer kan niet positief zijn!",
|
||||||
|
"numberZero":"Dit nummer kan niet nul zijn!",
|
||||||
|
|
||||||
|
"booleanTrue":"Deze boolean kan niet true zijn!",
|
||||||
|
"booleanFalse":"Deze boolean kan niet false zijn!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"Deze array mag niet leeg zijn!",
|
||||||
|
"arrayEmptyRequired":"Deze array moet leeg zijn!",
|
||||||
|
"arrayTooShort":"Deze array moet een minimum lengte hebben van {0}!",
|
||||||
|
"arrayTooLong":"Deze array mag niet langer zijn dan {0}!",
|
||||||
|
"arrayLengthInvalid":"Deze array moet een lengte hebben van {0}!",
|
||||||
|
"arrayInvalidTypes":"Deze array kan alleen de volgende waardes bevatten: {0}!",
|
||||||
|
"arrayDouble":"Deze array staat dubbele waardes niet toe!",
|
||||||
|
|
||||||
|
"discordInvalidId":"Dit is een ongeldig discord {0} id!",
|
||||||
|
"discordInvalidIdOptions":"Dit is an ongeldig discord {0} id! Je kan ook een van deze gebruiken: {1}!",
|
||||||
|
"discordInvalidToken":"Dit is een ongeldig discord token (syntactisch)!",
|
||||||
|
"colorInvalid":"Dit is een ongeldig hex kleur!",
|
||||||
|
"emojiTooShort":"Deze tekst moet minimum {0} emoji's hebben!",
|
||||||
|
"emojiTooLong":"Deze tekst mag maximum {0} emoji's hebben!",
|
||||||
|
"emojiCustom":"Deze emoji kan geen custom discord emoji zijn!",
|
||||||
|
"emojiInvalid":"Dit is een ongeldige emoji!",
|
||||||
|
"urlInvalid":"Deze url is ongeldig!",
|
||||||
|
"urlInvalidHttp":"Deze url kan alleen het https:// protocol gebruiken!",
|
||||||
|
"urlInvalidProtocol":"Deze url kan alleen de http:// & https:// protocolen gebruiken!",
|
||||||
|
"urlInvalidHostname":"Deze url heeft een verboden hostnaam (domein)!",
|
||||||
|
"urlInvalidExtension":"Deze url heeft een ongeldige extensie! Kies tussen: {0}!",
|
||||||
|
"urlInvalidPath":"Deze url heeft een ongeldig pad!",
|
||||||
|
"idNotUnique":"Dit id is niet uniek, gebruik een andere in de plaats!",
|
||||||
|
"idNonExistent":"Het id {0} bestaat niet!",
|
||||||
|
|
||||||
|
"invalidType":"Het type van deze property moet gelijk zijn aan: {0}!",
|
||||||
|
"propertyMissing":"De property {0} mist in dit object!",
|
||||||
|
"propertyOptional":"De property {0} is optioneel in dit object!",
|
||||||
|
"objectDisabled":"Dit object is uitgeschakeld, gebruik het met behulp van {0}!",
|
||||||
|
"nullInvalid":"Deze property kan niet null zijn!",
|
||||||
|
"switchInvalidType":"Dit moet een van de volgende types zijn: {0}!",
|
||||||
|
"objectSwitchInvalid":"Dit object moet een van de volgende types zijn: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"Dit is een ongeldige taal!",
|
||||||
|
"invalidButton":"Deze knop moet een {0} of {1} hebben!",
|
||||||
|
"unusedOption":"De optie {0} wordt nergens gebruikt!",
|
||||||
|
"unusedQuestion":"The vraag {0} wordt nergens gebruikt!",
|
||||||
|
"dropdownOption":"Een paneel met dropdown mag alleen opties bevaten van het 'ticket' type!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Bekijk Ticket",
|
||||||
|
"close":"Sluit Ticket",
|
||||||
|
"delete":"Verwijder Ticket",
|
||||||
|
"reopen":"Heropen Ticket",
|
||||||
|
"claim":"Claim Ticket",
|
||||||
|
"unclaim":"Ontclaim Ticket",
|
||||||
|
"pin":"Pin Ticket",
|
||||||
|
"unpin":"Maak Ticket Los",
|
||||||
|
"clear":"Verwijder Tickets",
|
||||||
|
"helpSwitchSlash":"Bekijk Slash Commands",
|
||||||
|
"helpSwitchText":"Bekijk Text Commands",
|
||||||
|
"helpPage":"Pagina {0}",
|
||||||
|
"withReason":"Met Reden",
|
||||||
|
"withoutTranscript":"Zonder Transcript"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket Gecreëerd",
|
||||||
|
"close":"Ticket Gesloten",
|
||||||
|
"delete":"Ticket Verwijderd",
|
||||||
|
"reopen":"Ticket Heropend",
|
||||||
|
"claim":"Ticket Geclaimd",
|
||||||
|
"unclaim":"Ticket Ontclaimd",
|
||||||
|
"pin":"Ticket Gepind",
|
||||||
|
"unpin":"Ticket Losgemaakt",
|
||||||
|
"rename":"Ticket Hernoemd",
|
||||||
|
"move":"Ticket Verplaatst",
|
||||||
|
"add":"Ticket Gebruiker Toegevoegd",
|
||||||
|
"remove":"Ticket Gebruiker Verwijderd",
|
||||||
|
|
||||||
|
"help":"Beschikbare Commands",
|
||||||
|
"statsReset":"Reset Stats",
|
||||||
|
"blacklistAdd":"Gebruiker Geblacklisted",
|
||||||
|
"blacklistRemove":"Gebruiker Vrijgelaten",
|
||||||
|
"blacklistGet":"Geblackliste Gebruiker",
|
||||||
|
"blacklistView":"Huidige Blacklist",
|
||||||
|
"blacklistAddDm":"Toegevoegd Aan Blacklist",
|
||||||
|
"blacklistRemoveDm":"Verwijderd Van Blacklist",
|
||||||
|
"clear":"Tickets Opgeruimd",
|
||||||
|
"roles":"Rollen Bijgewerkt",
|
||||||
|
|
||||||
|
"autoclose":"Ticket Automatisch Gesloten",
|
||||||
|
"autocloseEnabled":"Autoclose Ingeschakeld",
|
||||||
|
"autocloseDisabled":"Autoclose Uitgeschakeld",
|
||||||
|
"autodelete":"Ticket Automatisch Verwijderd",
|
||||||
|
"autodeleteEnabled":"Autodelete Ingeschakeld",
|
||||||
|
"autodeleteDisabled":"Autodelete Uitgeschakeld"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"Je ticket is aangemaakt. Klik op de knop hier onder om er naar toe te gaan!",
|
||||||
|
"close":"Het ticket is succesvol gesloten!",
|
||||||
|
"delete":"Het ticket is succesvol verwijderd!",
|
||||||
|
"reopen":"Het ticket is succesvol heropend!",
|
||||||
|
"claim":"Het ticket is succesvol geclaimd!",
|
||||||
|
"unclaim":"Het ticket is succesvol ontclaimd!",
|
||||||
|
"pin":"Het ticket is succesvol gepind!",
|
||||||
|
"unpin":"Het ticket is succesvol losgemaakt!",
|
||||||
|
"rename":"Het ticket is succesvol hernoemd naar {0}!",
|
||||||
|
"move":"Het ticket is succesvol verplaatst naar {0}!",
|
||||||
|
"add":"{0} is succesvol toegevoegd aan het ticket!",
|
||||||
|
"remove":"{0} is succesvol verwijderd van het ticket!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<naam>` => verplichte parameter\n`[naam]` => optionele parameter",
|
||||||
|
"statsReset":"De bot stats zijn succesvol gereset!",
|
||||||
|
"statsError":"Kan ticket stats niet bekijken!\n{0} is geen ticket!",
|
||||||
|
"blacklistAdd":"{0} is succesvol geblacklist!",
|
||||||
|
"blacklistRemove":"{0} is succesvol vrijgelaten!",
|
||||||
|
"blacklistGetSuccess":"{0} is op dit moment geblacklist!",
|
||||||
|
"blacklistGetEmpty":"{0} is op dit moment niet geblacklist!",
|
||||||
|
"blacklistViewEmpty":"Nog niemand is geblacklist!",
|
||||||
|
"blacklistViewTip":"Gebruik \"/blacklist add\" om een gebruiker te blacklisten!",
|
||||||
|
"clearVerify":"Weet je zeker dat je meerdere tickets wilt verwijderen? Deze actie kan niet teruggedraaid worden!",
|
||||||
|
"clearReady":"{0} tickets zijn succesvol verwijderd!",
|
||||||
|
"rolesEmpty":"Geen enkele rollen zijn bijgewerkt!",
|
||||||
|
|
||||||
|
"autocloseLeave":"Dit ticket is automatisch gesloten omdat de maker de server verlaten is!",
|
||||||
|
"autocloseTimeout":"Dit ticket is automatisch gesloten omdat het inactief was voor meer dan `{0} uur`!",
|
||||||
|
"autodeleteLeave":"Dit ticket is automatisch verwijderd omdat de maker de server verlaten is!",
|
||||||
|
"autodeleteTimeout":"Dit ticket is automatisch verwijderd omdat het inactief was voor meer dan `{0} dagen`!",
|
||||||
|
"autocloseEnabled":"Autoclose is ingeschakeld in dit ticket!\nHet wordt gesloten wanneer het inactief is voor meer dan `{0} uur`!",
|
||||||
|
"autocloseDisabled":"Autoclose is uitgeschakeld in dit ticket!\nHet wordt niet meer automatisch gesloten!",
|
||||||
|
"autodeleteEnabled":"Autodelete is ingeschakeld in dit ticket!\nHet wordt verwijderd wanneer het inactief is voor meer dan `{0} dagen`!",
|
||||||
|
"autodeleteDisabled":"Autodelete is uitgeschakeld in dit ticket!\nHet wordt niet meer automatisch verwijderd!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"Je kan maar {0} ticket(s) op het zelfde moment aanmaken!",
|
||||||
|
"ticketMessageAutoclose":"Dit ticket wordt automatisch gesloten wanneer het inactief is voor {0} uur!",
|
||||||
|
"ticketMessageAutodelete":"Dit ticket wordt automatisch verwijderd wanneer het inactief is voor {0} dagen!",
|
||||||
|
"panelReady":"Je kan het paneel hier onder vinden!\nDit bericht kan nu verwijderd worden!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Waarom heb je dit ticket gesloten?",
|
||||||
|
"deletePlaceholder":"Waarom heb je dit ticket verwijderd?",
|
||||||
|
"reopenPlaceholder":"Waarom heb je dit ticket heropend?",
|
||||||
|
"claimPlaceholder":"Waarom heb je dit ticket geclaimd?",
|
||||||
|
"unclaimPlaceholder":"Waarom heb je dit ticket ontclaimd?",
|
||||||
|
"pinPlaceholder":"Waarom heb je dit ticket gepind?",
|
||||||
|
"unpinPlaceholder":"Waarom heb je dit ticket losgemaakt?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"Een nieuw ticket is aangemaakt door {0}!",
|
||||||
|
"closeLog":"Dit ticket is gesloten door {0}!",
|
||||||
|
"closeDm":"Jouw ticket is gesloten in onze server!",
|
||||||
|
"deleteLog":"Dit ticket is verwijderd door {0}!",
|
||||||
|
"deleteDm":"Jouw ticket is verwijderd in onze server!",
|
||||||
|
"reopenLog":"Dit ticket is heropend door {0}!",
|
||||||
|
"reopenDm":"Jouw ticket is heropend in onze server!",
|
||||||
|
"claimLog":"Dit ticket is geclaimd door {0}!",
|
||||||
|
"claimDm":"Jouw ticket is geclaimd in onze server!",
|
||||||
|
"unclaimLog":"Dit ticket is ontclaimd door {0}!",
|
||||||
|
"unclaimDm":"Jouw ticket is ontclaimd in onze server!",
|
||||||
|
"pinLog":"Dit ticket is gepind door {0}!",
|
||||||
|
"pinDm":"Jouw ticket is gepind in onze server!",
|
||||||
|
"unpinLog":"Dit ticket is losgemaakt door {0}!",
|
||||||
|
"unpinDm":"Jouw ticket is losgemaakt in onze server!",
|
||||||
|
"renameLog":"Dit ticket is hernoemd naar {0} door {1}!",
|
||||||
|
"renameDm":"Jouw ticket is hernoemd naar {0} in onze server!",
|
||||||
|
"moveLog":"Dit ticket is verplaatst naar {0} door {1}!",
|
||||||
|
"moveDm":"Jouw ticket is verplaatst naar {0} in onze server!",
|
||||||
|
"addLog":"{0} is toegevoegd aan dit ticket door {1}!",
|
||||||
|
"addDm":"{0} is toegevoegd aan jouw ticket in onze server!",
|
||||||
|
"removeLog":"{0} is verwijderd van dit ticket door {1}!",
|
||||||
|
"removeDm":"{0} is verwijderd van jouw ticket in onze server!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} is geblacklist door {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} is verwijderd van de blacklist door {1}!",
|
||||||
|
"blacklistAddDm":"Je bent geblacklist in onze server!\nVanaf nu kan je geen tickets meer aanmaken!",
|
||||||
|
"blacklistRemoveDm":"Je bent verwijderd van de blacklist in onze server!\nNormaal zou je nu terug tickets kunnen aanmaken!",
|
||||||
|
"clearLog":"{0} tickets zijn verwijderd door by {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Bekijk Transcript",
|
||||||
|
"ready":"Transcript Aangemaakt",
|
||||||
|
"textFileDescription":"Dit is een tekst transcript van een verwijderd ticket!",
|
||||||
|
"htmlProgress":"Gelieve te wachten terwijl dit html transcript verwerkt wordt...",
|
||||||
|
|
||||||
|
"createdChannel":"Een nieuw {0} transcript is aangemaakt in de server!",
|
||||||
|
"createdCreator":"Een nieuw {0} transcript is aangemaakt voor een van jouw tickets!",
|
||||||
|
"createdParticipant":"Een nieuw {0} transcript is aangemaakt in een van de tickets waar jij lid van was!",
|
||||||
|
"createdActiveAdmin":"Een nieuw {0} transcript is aangemaakt in een van de tickets waar jij een actieve admin was!",
|
||||||
|
"createdEveryAdmin":"Een nieuw {0} transcript is aangemaakt in een van de tickets waar jij admin was!",
|
||||||
|
"createdOther":"Een nieuw {0} transcript is aangemaakt!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Herprobeer",
|
||||||
|
"continue":"Verwijder Zonder Transcript",
|
||||||
|
"backup":"Maak Backup Transcript",
|
||||||
|
"error":"Er is iets misgegaan bij het maken van het transcript.\nWat wil je doen?\n\nDit ticket wordt niet meer verwijderd to je een van de onderstaande knoppen gebruikt."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Interne Error",
|
||||||
|
"optionMissing":"Missende Command Optie",
|
||||||
|
"optionInvalid":"Onjuiste Command Optie",
|
||||||
|
"unknownCommand":"Onbekende Command",
|
||||||
|
"noPermissions":"Geen Permissies",
|
||||||
|
"unknownTicket":"Onbekend Ticket",
|
||||||
|
"deprecatedTicket":"Verouderd Ticket",
|
||||||
|
"unknownOption":"Onbekende Optie",
|
||||||
|
"unknownPanel":"Onbekend Paneel",
|
||||||
|
"notInGuild":"Niet In Server",
|
||||||
|
"channelRename":"Kan Kanaal Niet Hernoemen",
|
||||||
|
"busy":"Ticket Is Bezig"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Contacteer the eigenaar van deze bot voor meer info!",
|
||||||
|
"askForInfoResolve":"Contacteer de eigenaar van deze bot als het probleem niet opgelost wordt na enkele keren.",
|
||||||
|
"internalError":"Gefaald om te reageren op deze {0} door een interne error!",
|
||||||
|
"optionMissing":"Een verplichte parameter mist in deze command!",
|
||||||
|
"optionInvalid":"Een parameter in deze command is ongeldig!",
|
||||||
|
"optionInvalidChoose":"Kies tussen",
|
||||||
|
"unknownCommand":"Probeer het help menu te bekijken voor meer info!",
|
||||||
|
"noPermissions":"Je bent niet toegestaan om deze {0} te gebruiken!",
|
||||||
|
"noPermissionsList":"Benodigde Permissies: (één van deze)",
|
||||||
|
"noPermissionsCooldown":"Je bent niet toegestaan om deze {0} te gebruiken omdat je een cooldown hebt!",
|
||||||
|
"noPermissionsBlacklist":"Je bent niet toegestaan om deze {0} te gebruiken omdat je geblacklist bent!",
|
||||||
|
"noPermissionsLimitGlobal":"Je bent niet toegestaan om een ticket aan te maken omdat de server het maximum tickets limiet heeft bereikt!",
|
||||||
|
"noPermissionsLimitGlobalUser":"Je bent niet toegestaan om een ticket aan te maken omdat je het maximum tickets limiet hebt bereikt!",
|
||||||
|
"noPermissionsLimitOption":"Je bent niet toegestaan om een ticket aan te maken omdat de server het maximum tickets limiet van deze optie heeft bereikt!",
|
||||||
|
"noPermissionsLimitOptionUser":"Je bent niet toegestaan om een ticket aan te maken omdat je het maximum tickets limiet van deze optie hebt bereikt!",
|
||||||
|
"unknownTicket":"Probeer deze command opnieuw in een geldig ticket!",
|
||||||
|
"deprecatedTicket":"Het huidige kanaal is geen geldig ticket! Het is misschien een ticket van een oudere Open Ticket versie!",
|
||||||
|
"notInGuild":"Deze {0} werkt niet in DM! Probeer het opnieuw in een server!",
|
||||||
|
"channelRename":"Door discord ratelimits is het op dit moment onmogelijk voor de bot om het kanaal te hernoemen. Het kanaal zal automatisch hernoemd worden over 10 min als de bot niet herstart wordt.",
|
||||||
|
"channelRenameSource":"De bron van deze error is: {0}",
|
||||||
|
"busy":"Kan deze {0} niet gebruiken!\nHet ticket wordt op dit moment verwerkt door de bot.\n\nProbeer het opnieuw binnen een paar seconden!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"Waarde is niet gelijk aan het patroon!",
|
||||||
|
"stringMinLength":"Waarde moet minstens {0} karakters hebben!",
|
||||||
|
"stringMaxLength":"Waarde moet maximum {0} karakters hebben!",
|
||||||
|
"numberInvalid":"Ongeldig nummer!",
|
||||||
|
"numberMin":"Nummer moet minstens {0} zijn!",
|
||||||
|
"numberMax":"Nummer moet maximum {0} zijn!",
|
||||||
|
"numberDecimal":"Nummer kan geen kommagetal zijn!",
|
||||||
|
"numberNegative":"Nummer mag niet negatief zijn!",
|
||||||
|
"numberPositive":"Nummer mag niet positief zijn!",
|
||||||
|
"numberZero":"Nummer mag niet nul zijn!",
|
||||||
|
"channelNotFound":"Kan kanaal niet vinden!",
|
||||||
|
"userNotFound":"Kan gebruiker niet vinden!",
|
||||||
|
"roleNotFound":"Kan rol niet vinden!",
|
||||||
|
"memberNotFound":"Kan gebruiker niet vinden!",
|
||||||
|
"mentionableNotFound":"Kan gebruiker of rol niet vinden!",
|
||||||
|
"channelType":"Ongeldig kanaal type!",
|
||||||
|
"notInGuild":"Voor deze optie moet je in een server zitten!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"Je moet de ontwikkelaar van de bot zijn.",
|
||||||
|
"owner":"Je moet de server eigenaar zijn.",
|
||||||
|
"admin":"Je moet een server admin zijn.",
|
||||||
|
"moderator":"Je moet een server moderator zijn.",
|
||||||
|
"support":"Je moet in het support team zitten.",
|
||||||
|
"member":"Je moet een member van de server zijn.",
|
||||||
|
"discord-administrator":"Je hebt de `ADMINISTRATOR` permissie nodig."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"Ticket is al gesloten!",
|
||||||
|
"reopen":"Ticket is nog niet gesloten!",
|
||||||
|
"claim":"Ticket is al geclaimd!",
|
||||||
|
"unclaim":"Ticket nog niet geclaimd!",
|
||||||
|
"pin":"Ticket is al gepind!",
|
||||||
|
"unpin":"Ticket nog niet gepind!",
|
||||||
|
"add":"Deze gebruiker heeft al toegang tot dit ticket!",
|
||||||
|
"remove":"Deze gebruiker kan niet verwijderd worden van dit ticket!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickets",
|
||||||
|
"reason":"Reden",
|
||||||
|
"creator":"Maker",
|
||||||
|
"remaining":"Resterende Tijd",
|
||||||
|
"added":"Toegevoegd",
|
||||||
|
"removed":"Verwijderd",
|
||||||
|
"filter":"Filter",
|
||||||
|
"claimedBy":"Geclaimd Door {0}",
|
||||||
|
"method":"Methode",
|
||||||
|
"type":"Type",
|
||||||
|
"blacklisted":"Geblacklist",
|
||||||
|
"panel":"Paneel",
|
||||||
|
"command":"Command",
|
||||||
|
"system":"Systeem",
|
||||||
|
"true":"Waar",
|
||||||
|
"false":"Onwaar",
|
||||||
|
"syntax":"Syntax",
|
||||||
|
"originalName":"Originele Naam",
|
||||||
|
"newName":"Nieuwe Naam",
|
||||||
|
"until":"Tot",
|
||||||
|
"validOptions":"Geldige Opties",
|
||||||
|
"validPanels":"Geldige Panelen",
|
||||||
|
"autoclose":"Autoclose",
|
||||||
|
"autodelete":"Autodelete",
|
||||||
|
"startupDate":"Opstart Datum",
|
||||||
|
"version":"Versie",
|
||||||
|
"name":"Naam",
|
||||||
|
"role":"Rol",
|
||||||
|
"status":"Status",
|
||||||
|
"claimed":"Geclaimd",
|
||||||
|
"pinned":"Gepind",
|
||||||
|
"creationDate":"Aanmaakdatum"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"tekst",
|
||||||
|
"html":"html",
|
||||||
|
"command":"command",
|
||||||
|
"modal":"form",
|
||||||
|
"button":"knop",
|
||||||
|
"dropdown":"dropdown",
|
||||||
|
"method":"methode"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Specifieer een optionele reden die zichtbaar is in de logs.",
|
||||||
|
"help":"Verkrijg een lijst met alle beschikbare commands.",
|
||||||
|
"panel":"Spawn een bericht met een dropdown of knoppen (voor ticket creatie).",
|
||||||
|
"panelId":"Het id van het paneel dat je wilt spawnen.",
|
||||||
|
"panelAutoUpdate":"Wil je dat dit paneel automatisch bijwerkt wanneer het aangepast wordt?",
|
||||||
|
"ticket":"Maak een instant ticket.",
|
||||||
|
"ticketId":"Het id van het ticket dat je wilt aanmaken.",
|
||||||
|
"close":"Sluit een ticket, dit schakelt schrijven in het kanaal uit.",
|
||||||
|
"delete":"Verwijder een ticket, dit maakt een transcript waneer ingeschakeld.",
|
||||||
|
"deleteNoTranscript":"Verwijder dit ticket zonder een transcript aan te maken.",
|
||||||
|
"reopen":"Heropen een ticket, dit schakelt schrijven in het kanaal terug aan.",
|
||||||
|
"claim":"Claim een ticket.",
|
||||||
|
"claimUser":"Claim dit ticket voor iemand anders.",
|
||||||
|
"unclaim":"Ontclaim dit ticket.",
|
||||||
|
"pin":"Pin dit ticket.",
|
||||||
|
"unpin":"Maak dit ticket los.",
|
||||||
|
"move":"Verplaats een ticket.",
|
||||||
|
"moveId":"Het id van de optie waarnaar je wilt verplaatsen.",
|
||||||
|
"rename":"Hernoem een ticket.",
|
||||||
|
"renameName":"De nieuwe naam voor dit ticket.",
|
||||||
|
"add":"Voeg een gebruiker toe aan dit ticket.",
|
||||||
|
"addUser":"De gebruiker om toe te voegen.",
|
||||||
|
"remove":"Verwijder een user van dit ticket.",
|
||||||
|
"removeUser":"De gebruiker om te verwijderen.",
|
||||||
|
"blacklist":"Beheer de ticket blacklist.",
|
||||||
|
"blacklistView":"Bekijk de huidige blacklist.",
|
||||||
|
"blacklistAdd":"Voeg een gebruiker toe aan de blacklist.",
|
||||||
|
"blacklistRemove":"Verwijder een gebruiker van de blacklist.",
|
||||||
|
"blacklistGet":"Verkrijg de details van een geblackliste gebruiker.",
|
||||||
|
"blacklistGetUser":"De gebruiker om details van te verkrijgen.",
|
||||||
|
"stats":"Bekijk statistieken van de bot, een gebruiker of ticket.",
|
||||||
|
"statsReset":"Reset alle stats van de bot (en begin terug bij nul).",
|
||||||
|
"statsGlobal":"Bekijk de globale stats.",
|
||||||
|
"statsUser":"Bekijk de stats van een gebruiker in de server.",
|
||||||
|
"statsUserUser":"De gebruiker om te bekijken.",
|
||||||
|
"statsTicket":"Bekijk de stats van een ticket in de server.",
|
||||||
|
"statsTicketTicket":"Het ticket om te bekijken.",
|
||||||
|
"clear":"Verwijder meerdere tickets tegelijkertijd.",
|
||||||
|
"clearFilter":"De filter om tickets op te ruimen.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"Allemaal",
|
||||||
|
"open":"Open (niet gesloten)",
|
||||||
|
"close":"Gesloten",
|
||||||
|
"claim":"Geclaimd",
|
||||||
|
"unclaim":"Ontclaimd (niet geclaimd)",
|
||||||
|
"pin":"Gepind",
|
||||||
|
"unpin":"Losgemaakt (niet gepind)",
|
||||||
|
"autoclose":"Automatisch Gesloten"
|
||||||
|
},
|
||||||
|
"autoclose":"Beheer autoclose in een ticket.",
|
||||||
|
"autocloseDisable":"Schakel autoclose in dit ticket uit.",
|
||||||
|
"autocloseEnable":"Schakel autoclose in dit ticket in.",
|
||||||
|
"autocloseEnableTime":"De hoeveelheid uren dat dit ticket inactief moet zijn voor het te sluiten.",
|
||||||
|
"autodelete":"Beheer autodelete in een ticket.",
|
||||||
|
"autodeleteDisable":"Schakel autodelete in dit ticket aan.",
|
||||||
|
"autodeleteEnable":"Schakel autodelete in dit ticket aan.",
|
||||||
|
"autodeleteEnableTime":"De hoeveelheid dagen dat dit ticket inactief moet zijn voor het te verwijderen."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Krijg een lijst van alle beschikbare commands.",
|
||||||
|
"ticket":"Maak een instant ticket.",
|
||||||
|
"close":"Sluit een ticket, dit schakelt schrijven in het kanaal uit.",
|
||||||
|
"delete":"Verwijder een ticket, dit maakt een transcript wanneer ingeschakeld.",
|
||||||
|
"reopen":"Heropen een ticket, dit schakeld schrijven in het kanaal terug aan.",
|
||||||
|
"pin":"Pin een ticket. Dit verplaatst het ticket naar boven & voegt een '📌' emoij toe.",
|
||||||
|
"unpin":"Maak een ticket los. Het ticket zal blijven staan, maar de '📌' emoij verliezen.",
|
||||||
|
"move":"Verplaats een ticket. Dit verandert het soort van dit ticket.",
|
||||||
|
"rename":"Hernoem een ticket. Dit zal de kanaalnaam veranderen.",
|
||||||
|
"claim":"Claim een ticket. Hiermee kan je laten weten dat je bezig bent met dit ticket.",
|
||||||
|
"unclaim":"Ontclaim een ticket. Hiermee kan je laten weten dat het ticket terug vrij is.",
|
||||||
|
"add":"Voeg een user toe aan een ticket.",
|
||||||
|
"remove":"Verwijder een user van een ticket.",
|
||||||
|
"panel":"Spawn een bericht met dropdown of knoppen.",
|
||||||
|
"blacklistView":"Bekijk een lijst van de huidige blacklist.",
|
||||||
|
"blacklistAdd":"Voeg een user toe aan de blacklist.",
|
||||||
|
"blacklistRemove":"Verwijder een user van de blacklist.",
|
||||||
|
"blacklistGet":"Verkrijg de details van een geblacklisted user.",
|
||||||
|
"statsGlobal":"Bekijk de globale stats.",
|
||||||
|
"statsTicket":"Bekijk de stats van een ticket in de server.",
|
||||||
|
"statsUser":"Bekijk de stats van een user in de server.",
|
||||||
|
"statsReset":"Reset alle stats van de bot (en begin terug vanaf 0).",
|
||||||
|
"autocloseDisable":"Zet autoclose uit in dit ticket.",
|
||||||
|
"autocloseEnable":"Zet autoclose in aan dit ticket.",
|
||||||
|
"autodeleteDisable":"Zet autodelete uit in dit ticket.",
|
||||||
|
"autodeleteEnable":"Zet autodelete aan in dit ticket."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Globale Stats",
|
||||||
|
"system":"Systeem Stats",
|
||||||
|
"user":"User Stats",
|
||||||
|
"ticket":"Ticket Stats",
|
||||||
|
"participants":"Deelnemers"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Tickets Aangemaakt",
|
||||||
|
"ticketsClosed":"Tickets Gesloten",
|
||||||
|
"ticketsDeleted":"Tickets Verwijderd",
|
||||||
|
"ticketsReopened":"Tickets Heropend",
|
||||||
|
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||||
|
"ticketsClaimed":"Tickets Geclaimd",
|
||||||
|
"ticketsPinned":"Tickets Gepind",
|
||||||
|
"ticketsMoved":"Tickets Verplaatst",
|
||||||
|
"usersBlacklisted":"Users Geblacklist",
|
||||||
|
"transcriptsCreated":"Transcripts Aangemaakt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,477 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.0",
|
||||||
|
"translator":"DJj123dj",
|
||||||
|
"lastedited":"21/08/2024",
|
||||||
|
"language":"English"
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError":"[ERROR]",
|
||||||
|
"headerOpenTicket":"OPEN TICKET",
|
||||||
|
"typeWarning":"[WARNING]",
|
||||||
|
"typeInfo":"[INFO]",
|
||||||
|
"headerConfigChecker":"CONFIG CHECKER",
|
||||||
|
"headerDescription":"check for errors in you config files!",
|
||||||
|
"footerError":"the bot won't start until all {0}'s are fixed!",
|
||||||
|
"footerWarning":"it's recommended to fix all {0}'s before starting!",
|
||||||
|
"footerSupport":"SUPPORT: {0} - DOCS: {1}",
|
||||||
|
"compactInformation":"use {0} for more information!",
|
||||||
|
"dataPath":"path",
|
||||||
|
"dataDocs":"docs",
|
||||||
|
"dataMessages":"message"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort":"This string can't be shorter than {0} characters!",
|
||||||
|
"stringTooLong":"This string can't be longer than {0} characters!",
|
||||||
|
"stringLengthInvalid":"This string needs to be {0} characters long!",
|
||||||
|
"stringStartsWith":"This string needs to start with {0}!",
|
||||||
|
"stringEndsWith":"This string needs to end with {0}!",
|
||||||
|
"stringContains":"This string needs to contain {0}!",
|
||||||
|
"stringChoices":"This string can only be one of the following values: {0}!",
|
||||||
|
"stringRegex":"This string is invalid!",
|
||||||
|
|
||||||
|
"numberTooShort":"This number can't be shorter than {0} characters!",
|
||||||
|
"numberTooLong":"This number can't be longer than {0} characters!",
|
||||||
|
"numberLengthInvalid":"This number needs to be {0} characters long!",
|
||||||
|
"numberTooSmall":"This number needs to be at least {0}!",
|
||||||
|
"numberTooLarge":"This number needs to be at most {0}!",
|
||||||
|
"numberNotEqual":"This number needs to be {0}!",
|
||||||
|
"numberStep":"This number needs to be a multiple of {0}!",
|
||||||
|
"numberStepOffset":"This number needs to be a multiple of {0} starting with {1}!",
|
||||||
|
"numberStartsWith":"This number needs to start with {0}!",
|
||||||
|
"numberEndsWith":"This number needs to end with {0}!",
|
||||||
|
"numberContains":"This number needs to contain {0}!",
|
||||||
|
"numberChoices":"This number can only be one of the following values: {0}!",
|
||||||
|
"numberFloat":"This number can't be a decimal!",
|
||||||
|
"numberNegative":"This number can't be negative!",
|
||||||
|
"numberPositive":"This number can't be positive!",
|
||||||
|
"numberZero":"This number can't be zero!",
|
||||||
|
|
||||||
|
"booleanTrue":"This boolean can't be true!",
|
||||||
|
"booleanFalse":"This boolean can't be false!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled":"This array isn't allowed to be empty!",
|
||||||
|
"arrayEmptyRequired":"This array is required to be empty!",
|
||||||
|
"arrayTooShort":"This array needs to have a length of at least {0}!",
|
||||||
|
"arrayTooLong":"This array needs to have a length of at most {0}!",
|
||||||
|
"arrayLengthInvalid":"This array needs to have a length of {0}!",
|
||||||
|
"arrayInvalidTypes":"This array can only contain the following types: {0}!",
|
||||||
|
"arrayDouble":"This array doesn't allow the same value twice!",
|
||||||
|
|
||||||
|
"discordInvalidId":"This is an invalid discord {0} id!",
|
||||||
|
"discordInvalidIdOptions":"This is an invalid discord {0} id! You can also use one of these: {1}!",
|
||||||
|
"discordInvalidToken":"This is an invalid discord token (syntactically)!",
|
||||||
|
"colorInvalid":"This is an invalid hex color!",
|
||||||
|
"emojiTooShort":"This string needs to have at least {0} emoji's!",
|
||||||
|
"emojiTooLong":"This string needs to have at most {0} emoji's!",
|
||||||
|
"emojiCustom":"This emoji can't be a custom discord emoji!",
|
||||||
|
"emojiInvalid":"This is an invalid emoji!",
|
||||||
|
"urlInvalid":"This url is invalid!",
|
||||||
|
"urlInvalidHttp":"This url can only use the https:// protocol!",
|
||||||
|
"urlInvalidProtocol":"This url can only use the http:// & https:// protocols!",
|
||||||
|
"urlInvalidHostname":"This url has a disallowed hostname!",
|
||||||
|
"urlInvalidExtension":"This url has an invalid extension! Choose between: {0}!",
|
||||||
|
"urlInvalidPath":"This url has an invalid path!",
|
||||||
|
"idNotUnique":"This id isn't unique, use another id instead!",
|
||||||
|
"idNonExistent":"The id {0} doesn't exist!",
|
||||||
|
|
||||||
|
"invalidType":"This property needs to be the type: {0}!",
|
||||||
|
"propertyMissing":"The property {0} is missing from this object!",
|
||||||
|
"propertyOptional":"The property {0} is optional in this object!",
|
||||||
|
"objectDisabled":"This object is disabled, enable it using {0}!",
|
||||||
|
"nullInvalid":"This property can't be null!",
|
||||||
|
"switchInvalidType":"This needs to be one of the following types: {0}!",
|
||||||
|
"objectSwitchInvalid":"This object needs to be one of the following types: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage":"This is an invalid language!",
|
||||||
|
"invalidButton":"This button needs to have at least an {0} or {1}!",
|
||||||
|
"unusedOption":"The option {0} isn't used anywhere!",
|
||||||
|
"unusedQuestion":"The question {0} isn't used anywhere!",
|
||||||
|
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create":"Visit Ticket",
|
||||||
|
"close":"Close Ticket",
|
||||||
|
"delete":"Delete Ticket",
|
||||||
|
"reopen":"Reopen Ticket",
|
||||||
|
"claim":"Claim Ticket",
|
||||||
|
"unclaim":"Unclaim Ticket",
|
||||||
|
"pin":"Pin Ticket",
|
||||||
|
"unpin":"Unpin Ticket",
|
||||||
|
"clear":"Delete Tickets",
|
||||||
|
"helpSwitchSlash":"View Slash Commands",
|
||||||
|
"helpSwitchText":"View Text Commands",
|
||||||
|
"helpPage":"Page {0}",
|
||||||
|
"withReason":"With Reason",
|
||||||
|
"withoutTranscript":"Without Transcript"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket Created",
|
||||||
|
"close":"Ticket Closed",
|
||||||
|
"delete":"Ticket Deleted",
|
||||||
|
"reopen":"Ticket Reopened",
|
||||||
|
"claim":"Ticket Claimed",
|
||||||
|
"unclaim":"Ticket Unclaimed",
|
||||||
|
"pin":"Ticket Pinned",
|
||||||
|
"unpin":"Ticket Unpinned",
|
||||||
|
"rename":"Ticket Renamed",
|
||||||
|
"move":"Ticket Moved",
|
||||||
|
"add":"Ticket User Added",
|
||||||
|
"remove":"Ticket User Removed",
|
||||||
|
|
||||||
|
"help":"Available Commands",
|
||||||
|
"statsReset":"Reset Stats",
|
||||||
|
"blacklistAdd":"User Blacklisted",
|
||||||
|
"blacklistRemove":"User Released",
|
||||||
|
"blacklistGet":"Blacklisted User",
|
||||||
|
"blacklistView":"Current Blacklist",
|
||||||
|
"blacklistAddDm":"Added To Blacklist",
|
||||||
|
"blacklistRemoveDm":"Removed From Blacklist",
|
||||||
|
"clear":"Tickets Cleared",
|
||||||
|
"roles":"Roles Updated",
|
||||||
|
|
||||||
|
"autoclose":"Ticket Autoclosed",
|
||||||
|
"autocloseEnabled":"Autoclose Enabled",
|
||||||
|
"autocloseDisabled":"Autoclose Disabled",
|
||||||
|
"autodelete":"Ticket Autodeleted",
|
||||||
|
"autodeleteEnabled":"Autodelete Enabled",
|
||||||
|
"autodeleteDisabled":"Autodelete Disabled"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create":"Your ticket has been created. Click the button below to access it!",
|
||||||
|
"close":"The ticket has been closed succesfully!",
|
||||||
|
"delete":"The ticket has been deleted succesfully!",
|
||||||
|
"reopen":"The ticket has been reopened succesfully!",
|
||||||
|
"claim":"The ticket has been claimed succesfully!",
|
||||||
|
"unclaim":"The ticket has been unclaimed succesfully!",
|
||||||
|
"pin":"The ticket has been pinned succesfully!",
|
||||||
|
"unpin":"The ticket has been unpinned succesfully!",
|
||||||
|
"rename":"The ticket has been renamed to {0} succesfully!",
|
||||||
|
"move":"The ticket has been moved to {0} succesfully!",
|
||||||
|
"add":"{0} has been added to the ticket succesfully!",
|
||||||
|
"remove":"{0} has been removed from the ticket succesfully!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<name>` => required parameter\n`[name]` => optional parameter",
|
||||||
|
"statsReset":"The bot stats have been reset successfully!",
|
||||||
|
"statsError":"Unable to view ticket stats!\n{0} is not a ticket!",
|
||||||
|
"blacklistAdd":"{0} has been blacklisted successfully!",
|
||||||
|
"blacklistRemove":"{0} has been released successfully!",
|
||||||
|
"blacklistGetSuccess":"{0} is currently blacklisted!",
|
||||||
|
"blacklistGetEmpty":"{0} is currently not blacklisted!",
|
||||||
|
"blacklistViewEmpty":"No-one has been blacklisted yet!",
|
||||||
|
"blacklistViewTip":"Use \"/blacklist add\" to blacklist a user!",
|
||||||
|
"clearVerify":"Are you sure you want to delete multiple tickets?\nThis action can't be undone!",
|
||||||
|
"clearReady":"{0} tickets have been deleted succesfully!",
|
||||||
|
"rolesEmpty":"No roles have been updated!",
|
||||||
|
|
||||||
|
"autocloseLeave":"This ticket has been autoclosed because the creator left the server!",
|
||||||
|
"autocloseTimeout":"This ticket has been autoclosed because it has been inactive for more than `{0}h`!",
|
||||||
|
"autodeleteLeave":"This ticket has been autodeleted because the creator left the server!",
|
||||||
|
"autodeleteTimeout":"This ticket has been autodeleted because it has been inactive for more than `{0} days`!",
|
||||||
|
"autocloseEnabled":"Autoclose has been enabled in this ticket!\nIt will be closed when it is inactive for more than `{0}h`!",
|
||||||
|
"autocloseDisabled":"Autoclose has been disabled in this ticket!\nIt won't be closed automatically anymore!",
|
||||||
|
"autodeleteEnabled":"Autodelete has been enabled in this ticket!\nIt will be deleted when it is inactive for more than `{0} days`!",
|
||||||
|
"autodeleteDisabled":"Autodelete has been disabled in this ticket!\nIt won't be deleted automatically anymore!",
|
||||||
|
|
||||||
|
"ticketMessageLimit":"You can only create {0} ticket(s) at the same time!",
|
||||||
|
"ticketMessageAutoclose":"This ticket will be autoclosed when inactive for {0}h!",
|
||||||
|
"ticketMessageAutodelete":"This ticket will be autodeleted when inactive for {0} days!",
|
||||||
|
"panelReady":"You can find the panel below!\nThis message can now be deleted!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder":"Why did you close this ticket?",
|
||||||
|
"deletePlaceholder":"Why did you delete this ticket?",
|
||||||
|
"reopenPlaceholder":"Why did you reopen this ticket?",
|
||||||
|
"claimPlaceholder":"Why did you claim this ticket?",
|
||||||
|
"unclaimPlaceholder":"Why did you unclaim this ticket?",
|
||||||
|
"pinPlaceholder":"Why did you pin this ticket?",
|
||||||
|
"unpinPlaceholder":"Why did you unpin this ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog":"A new ticket got created by {0}!",
|
||||||
|
"closeLog":"This ticket has been closed by {0}!",
|
||||||
|
"closeDm":"Your ticket has been closed in our server!",
|
||||||
|
"deleteLog":"This ticket has been deleted by {0}!",
|
||||||
|
"deleteDm":"Your ticket has been deleted in our server!",
|
||||||
|
"reopenLog":"This ticket has been reopened by {0}!",
|
||||||
|
"reopenDm":"Your ticket has been reopened in our server!",
|
||||||
|
"claimLog":"This ticket has been claimed by {0}!",
|
||||||
|
"claimDm":"Your ticket has been claimed in our server!",
|
||||||
|
"unclaimLog":"This ticket has been unclaimed by {0}!",
|
||||||
|
"unclaimDm":"Your ticket has been unclaimed in our server!",
|
||||||
|
"pinLog":"This ticket has been pinned by {0}!",
|
||||||
|
"pinDm":"Your ticket has been pinned in our server!",
|
||||||
|
"unpinLog":"This ticket has been unpinned by {0}!",
|
||||||
|
"unpinDm":"Your ticket has been unpinned in our server!",
|
||||||
|
"renameLog":"This ticket has been renamed to {0} by {1}!",
|
||||||
|
"renameDm":"Your ticket has been renamed to {0} in our server!",
|
||||||
|
"moveLog":"This ticket has been moved to {0} by {1}!",
|
||||||
|
"moveDm":"Your ticket has been moved to {0} in our server!",
|
||||||
|
"addLog":"{0} has been added to this ticket by {1}!",
|
||||||
|
"addDm":"{0} has been added to your ticket in our server!",
|
||||||
|
"removeLog":"{0} has been removed from this ticket by {1}!",
|
||||||
|
"removeDm":"{0} has been removed from your ticket in our server!",
|
||||||
|
|
||||||
|
"blacklistAddLog":"{0} was blacklisted by {1}!",
|
||||||
|
"blacklistRemoveLog":"{0} was removed from the blacklist by {1}!",
|
||||||
|
"blacklistAddDm":"You have been blacklisted in our server!\nFrom now on, you are unable to create a ticket!",
|
||||||
|
"blacklistRemoveDm":"You have been removed from the blacklist in our server!\nNow you can create tickets again!",
|
||||||
|
"clearLog":"{0} tickets have been deleted by {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit":"Visit Transcript",
|
||||||
|
"ready":"Transcript Created",
|
||||||
|
"textFileDescription":"This is the text transcript of a deleted ticket!",
|
||||||
|
"htmlProgress":"Please wait while this html transcript is getting processed...",
|
||||||
|
|
||||||
|
"createdChannel":"A new {0} transcript has been created in the server!",
|
||||||
|
"createdCreator":"A new {0} transcript has been created for one of your tickets!",
|
||||||
|
"createdParticipant":"A new {0} transcript has been created in one of the tickets you participated in!",
|
||||||
|
"createdActiveAdmin":"A new {0} transcript has been created in one of the tickets you participated as admin!",
|
||||||
|
"createdEveryAdmin":"A new {0} transcript has been created in one of the tickets you were admin in!",
|
||||||
|
"createdOther":"A new {0} transcript has been created!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry":"Retry",
|
||||||
|
"continue":"Delete Without Transcript",
|
||||||
|
"backup":"Create Backup Transcript",
|
||||||
|
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError":"Internal Error",
|
||||||
|
"optionMissing":"Command Option Missing",
|
||||||
|
"optionInvalid":"Command Option Invalid",
|
||||||
|
"unknownCommand":"Unknown Command",
|
||||||
|
"noPermissions":"No Permissions",
|
||||||
|
"unknownTicket":"Unknown Ticket",
|
||||||
|
"deprecatedTicket":"Deprecated Ticket",
|
||||||
|
"unknownOption":"Unknown Option",
|
||||||
|
"unknownPanel":"Unknown Panel",
|
||||||
|
"notInGuild":"Not In Server",
|
||||||
|
"channelRename":"Unable To Rename Channel",
|
||||||
|
"busy":"Ticket Is Busy"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo":"Contact the owner of this bot for more info!",
|
||||||
|
"askForInfoResolve":"Contact the bot owner of this bot if this issue doesn't resolve after a few tries.",
|
||||||
|
"internalError":"Failed to respond to this {0} due to an internal error!",
|
||||||
|
"optionMissing":"A required parameter is missing in this command!",
|
||||||
|
"optionInvalid":"A parameter in this command is invalid!",
|
||||||
|
"optionInvalidChoose":"Choose between",
|
||||||
|
"unknownCommand":"Try visiting the help menu for more info!",
|
||||||
|
"noPermissions":"You are not allowed to use this {0}!",
|
||||||
|
"noPermissionsList":"Required Permissions: (one of them)",
|
||||||
|
"noPermissionsCooldown":"You are not allowed to use this {0} because you have a cooldown!",
|
||||||
|
"noPermissionsBlacklist":"You are not allowed to use this {0} because you have been blacklisted!",
|
||||||
|
"noPermissionsLimitGlobal":"You are not allowed to create a ticket because the server reached the max tickets limit!",
|
||||||
|
"noPermissionsLimitGlobalUser":"You are not allowed to create a ticket because you reached the max tickets limit!",
|
||||||
|
"noPermissionsLimitOption":"You are not allowed to create a ticket because the server reached the max tickets limit for this option!",
|
||||||
|
"noPermissionsLimitOptionUser":"You are not allowed to create a ticket because you reached the max tickets limit for this option!",
|
||||||
|
"unknownTicket":"Try this command again in a valid ticket!",
|
||||||
|
"deprecatedTicket":"The current channel is not a valid ticket! It might have been a ticket from an old Open Ticket version!",
|
||||||
|
"notInGuild":"This {0} doesn't work in DM! Please try it again in a server!",
|
||||||
|
"channelRename":"Due to discord ratelimits, it's currently impossible for the bot to rename the channel. The channel will automatically be renamed over 10 minutes if the bot isn't rebooted.",
|
||||||
|
"channelRenameSource":"The source of this error is: {0}",
|
||||||
|
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex":"Value doesn't match pattern!",
|
||||||
|
"stringMinLength":"Value needs to be at least {0} characters!",
|
||||||
|
"stringMaxLength":"Value needs to be at most {0} characters!",
|
||||||
|
"numberInvalid":"Invalid number!",
|
||||||
|
"numberMin":"Number needs to be at least {0}!",
|
||||||
|
"numberMax":"Number needs to be at most {0}!",
|
||||||
|
"numberDecimal":"Number is not allowed to be a decimal!",
|
||||||
|
"numberNegative":"Number is not allowed to be negative!",
|
||||||
|
"numberPositive":"Number is not allowed to be positive!",
|
||||||
|
"numberZero":"Number is not allowed to be zero!",
|
||||||
|
"channelNotFound":"Unable to find channel!",
|
||||||
|
"userNotFound":"Unable to find user!",
|
||||||
|
"roleNotFound":"Unable to find role!",
|
||||||
|
"memberNotFound":"Unable to find user!",
|
||||||
|
"mentionableNotFound":"Unable to find user or role!",
|
||||||
|
"channelType":"Invalid channel type!",
|
||||||
|
"notInGuild":"This option requires you to be in a server!"
|
||||||
|
},
|
||||||
|
"permissions":{
|
||||||
|
"developer":"You need to be the developer of the bot.",
|
||||||
|
"owner":"You need to be the server owner.",
|
||||||
|
"admin":"You need to be a server admin.",
|
||||||
|
"moderator":"You need to be a moderator.",
|
||||||
|
"support":"You need to be in the support team.",
|
||||||
|
"member":"You need to be a member.",
|
||||||
|
"discord-administrator":"You need to have the `ADMINISTRATOR` permission."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close":"Ticket is already closed!",
|
||||||
|
"reopen":"Ticket is not closed yet!",
|
||||||
|
"claim":"Ticket is already claimed!",
|
||||||
|
"unclaim":"Ticket is not claimed yet!",
|
||||||
|
"pin":"Ticket is already pinned!",
|
||||||
|
"unpin":"Ticket is not pinned yet!",
|
||||||
|
"add":"This user is already able to access the ticket!",
|
||||||
|
"remove":"Unable to remove this user from the ticket!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickets",
|
||||||
|
"reason":"Reason",
|
||||||
|
"creator":"Creator",
|
||||||
|
"remaining":"Time Remaining",
|
||||||
|
"added":"Added",
|
||||||
|
"removed":"Removed",
|
||||||
|
"filter":"Filter",
|
||||||
|
"claimedBy":"Claimed By {0}",
|
||||||
|
"method":"Method",
|
||||||
|
"type":"Type",
|
||||||
|
"blacklisted":"Blacklisted",
|
||||||
|
"panel":"Panel",
|
||||||
|
"command":"Command",
|
||||||
|
"system":"System",
|
||||||
|
"true":"True",
|
||||||
|
"false":"False",
|
||||||
|
"syntax":"Syntax",
|
||||||
|
"originalName":"Original Name",
|
||||||
|
"newName":"New Name",
|
||||||
|
"until":"Until",
|
||||||
|
"validOptions":"Valid Options",
|
||||||
|
"validPanels":"Valid Panels",
|
||||||
|
"autoclose":"Autoclose",
|
||||||
|
"autodelete":"Autodelete",
|
||||||
|
"startupDate":"Startup Date",
|
||||||
|
"version":"Version",
|
||||||
|
"name":"Name",
|
||||||
|
"role":"Role",
|
||||||
|
"status":"Status",
|
||||||
|
"claimed":"Claimed",
|
||||||
|
"pinned":"Pinned",
|
||||||
|
"creationDate":"Creation Date"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"text",
|
||||||
|
"html":"html",
|
||||||
|
"command":"command",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"button",
|
||||||
|
"dropdown":"dropdown",
|
||||||
|
"method":"method"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason":"Specify an optional reason that will be visible in logs.",
|
||||||
|
"help":"Get a list of all the available commands.",
|
||||||
|
"panel":"Spawn a message with a dropdown or buttons (for ticket creation).",
|
||||||
|
"panelId":"The identifier of the panel that you want to spawn.",
|
||||||
|
"panelAutoUpdate":"Do you want this panel to automatically update when edited?",
|
||||||
|
"ticket":"Instantly create a ticket.",
|
||||||
|
"ticketId":"The identifier of the ticket that you want to create.",
|
||||||
|
"close":"Close a ticket.",
|
||||||
|
"delete":"Delete a ticket.",
|
||||||
|
"deleteNoTranscript":"Delete this ticket without creating a transcript.",
|
||||||
|
"reopen":"Reopen a ticket.",
|
||||||
|
"claim":"Claim a ticket.",
|
||||||
|
"claimUser":"Claim this ticket to someone else instead of yourself.",
|
||||||
|
"unclaim":"Unclaim a ticket.",
|
||||||
|
"pin":"Pin a ticket.",
|
||||||
|
"unpin":"Unpin a ticket.",
|
||||||
|
"move":"Move a ticket.",
|
||||||
|
"moveId":"The identifier of the option that you want to move to.",
|
||||||
|
"rename":"Rename a ticket.",
|
||||||
|
"renameName":"The new name for this ticket.",
|
||||||
|
"add":"Add a user to a ticket.",
|
||||||
|
"addUser":"The user to add.",
|
||||||
|
"remove":"Remove a user from a ticket.",
|
||||||
|
"removeUser":"The user to remove.",
|
||||||
|
"blacklist":"Manage the ticket blacklist.",
|
||||||
|
"blacklistView":"View a list of the current blacklist.",
|
||||||
|
"blacklistAdd":"Add a user to the blacklist.",
|
||||||
|
"blacklistRemove":"Remove a user from the blacklist.",
|
||||||
|
"blacklistGet":"Get the details from a blacklisted user.",
|
||||||
|
"blacklistGetUser":"The user to get details from.",
|
||||||
|
"stats":"View statistics from the bot, a member or a ticket.",
|
||||||
|
"statsReset":"Reset all the stats of the bot (and start counting from zero).",
|
||||||
|
"statsGlobal":"View the global stats.",
|
||||||
|
"statsUser":"View the stats from a user in the server.",
|
||||||
|
"statsUserUser":"The user to view.",
|
||||||
|
"statsTicket":"View the stats of a ticket in the server.",
|
||||||
|
"statsTicketTicket":"The ticket to view.",
|
||||||
|
"clear":"Delete multiple tickets at the same time.",
|
||||||
|
"clearFilter":"The filter for clearing tickets.",
|
||||||
|
"clearFilters":{
|
||||||
|
"all":"All",
|
||||||
|
"open":"Open",
|
||||||
|
"close":"Closed",
|
||||||
|
"claim":"Claimed",
|
||||||
|
"unclaim":"Unclaimed",
|
||||||
|
"pin":"Pinned",
|
||||||
|
"unpin":"Unpinned",
|
||||||
|
"autoclose":"Autoclosed"
|
||||||
|
},
|
||||||
|
"autoclose":"Manage autoclose in a ticket.",
|
||||||
|
"autocloseDisable":"Disable autoclose in this ticket.",
|
||||||
|
"autocloseEnable":"Enable autoclose in this ticket.",
|
||||||
|
"autocloseEnableTime":"The amount of hours this ticket needs to be inactive to close it.",
|
||||||
|
"autodelete":"Manage autodelete in a ticket.",
|
||||||
|
"autodeleteDisable":"Disable autodelete in this ticket.",
|
||||||
|
"autodeleteEnable":"Enable autodelete in this ticket.",
|
||||||
|
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it."
|
||||||
|
},
|
||||||
|
"helpMenu":{
|
||||||
|
"help":"Get a list of all the available commands.",
|
||||||
|
"ticket":"Instantly create a ticket.",
|
||||||
|
"close":"Close a ticket, this disables writing in this channel.",
|
||||||
|
"delete":"Delete a ticket, this creates a transcript when enabled.",
|
||||||
|
"reopen":"Reopen a ticket, this enables writing in this channel again.",
|
||||||
|
"pin":"Pin a ticket. This will move the ticket to the top and will add a '📌' emoij to the name.",
|
||||||
|
"unpin":"Unpin a ticket. The ticket will stay on it's position but will lose the '📌' emoij.",
|
||||||
|
"move":"Move a ticket. This will change the type of this ticket.",
|
||||||
|
"rename":"Rename a ticket. This will change the channel name of this ticket.",
|
||||||
|
"claim":"Claim a ticket. With this, you can let your team know you are handling this ticket.",
|
||||||
|
"unclaim":"Unclaim a ticket. With this, you can let your team know that this ticket is free again.",
|
||||||
|
"add":"Add a user to a ticket. This will allow the user to read & write in this ticket.",
|
||||||
|
"remove":"Remove a user from a ticket. This will remove the ability to read & write for a user in this ticket.",
|
||||||
|
"panel":"Spawn a message with a dropdown or buttons (for ticket creation).",
|
||||||
|
"blacklistView":"View a list of the current blacklist.",
|
||||||
|
"blacklistAdd":"Add a user to the blacklist.",
|
||||||
|
"blacklistRemove":"Remove a user from the blacklist.",
|
||||||
|
"blacklistGet":"Get the details from a blacklisted user.",
|
||||||
|
"statsGlobal":"View the global stats.",
|
||||||
|
"statsTicket":"View the stats of a ticket in the server.",
|
||||||
|
"statsUser":"View the stats from a user in the server.",
|
||||||
|
"statsReset":"Reset all the stats of the bot (and start counting from zero).",
|
||||||
|
"autocloseDisable":"Disable autoclose in this ticket.",
|
||||||
|
"autocloseEnable":"Enable autoclose in this ticket.",
|
||||||
|
"autodeleteDisable":"Disable autodelete in this ticket.",
|
||||||
|
"autodeleteEnable":"Enable autodelete in this ticket."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes":{
|
||||||
|
"global":"Global Stats",
|
||||||
|
"system":"System Stats",
|
||||||
|
"user":"User Stats",
|
||||||
|
"ticket":"Ticket Stats",
|
||||||
|
"participants":"Participants"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Tickets Created",
|
||||||
|
"ticketsClosed":"Tickets Closed",
|
||||||
|
"ticketsDeleted":"Tickets Deleted",
|
||||||
|
"ticketsReopened":"Tickets Reopened",
|
||||||
|
"ticketsAutoclosed":"Tickets Autoclosed",
|
||||||
|
"ticketsClaimed":"Tickets Claimed",
|
||||||
|
"ticketsPinned":"Tickets Pinned",
|
||||||
|
"ticketsMoved":"Tickets Moved",
|
||||||
|
"usersBlacklisted":"Users Blacklisted",
|
||||||
|
"transcriptsCreated":"Transcripts Created"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,477 @@
|
|||||||
|
{
|
||||||
|
"_TRANSLATION":{
|
||||||
|
"otversion":"v4.0.0",
|
||||||
|
"translator":"quiradon",
|
||||||
|
"lastedited":"20/08/2024",
|
||||||
|
"language":"Portuguese"
|
||||||
|
},
|
||||||
|
"checker":{
|
||||||
|
"system":{
|
||||||
|
"typeError": "[ERRO]",
|
||||||
|
"headerOpenTicket": "ABRIR TICKET",
|
||||||
|
"typeWarning": "[AVISO]",
|
||||||
|
"typeInfo": "[INFORMAÇÃO]",
|
||||||
|
"headerConfigChecker": "Verificador de Configuração",
|
||||||
|
"headerDescription": "verifique erros nos seus arquivos de configuração!",
|
||||||
|
"footerError": "o bot não iniciará até que todos os {0} sejam corrigidos!",
|
||||||
|
"footerWarning": "é recomendado corrigir todos os {0} antes de iniciar!",
|
||||||
|
"footerSupport": "SUPORTE: {0} - DOCS: {1}",
|
||||||
|
"compactInformation": "use {0} para mais informações!",
|
||||||
|
"dataPath": "caminho",
|
||||||
|
"dataDocs": "documentos",
|
||||||
|
"dataMessages": "mensagem"
|
||||||
|
},
|
||||||
|
"messages":{
|
||||||
|
"stringTooShort": "Esta string não pode ter menos de {0} caracteres!",
|
||||||
|
"stringTooLong": "Esta string não pode ter mais de {0} caracteres!",
|
||||||
|
"stringLengthInvalid": "Esta string precisa ter {0} caracteres!",
|
||||||
|
"stringStartsWith": "Esta string precisa começar com {0}!",
|
||||||
|
"stringEndsWith": "Esta string precisa terminar com {0}!",
|
||||||
|
"stringContains": "Esta string precisa conter {0}!",
|
||||||
|
"stringChoices": "Esta string só pode ser um dos seguintes valores: {0}!",
|
||||||
|
"stringRegex": "Esta string é inválida!",
|
||||||
|
|
||||||
|
"numberTooShort": "Este número não pode ter menos de {0} caracteres!",
|
||||||
|
"numberTooLong": "Este número não pode ter mais de {0} caracteres!",
|
||||||
|
"numberLengthInvalid": "Este número precisa ter {0} caracteres!",
|
||||||
|
"numberTooSmall": "Este número precisa ser pelo menos {0}!",
|
||||||
|
"numberTooLarge": "Este número precisa ser no máximo {0}!",
|
||||||
|
"numberNotEqual": "Este número precisa ser {0}!",
|
||||||
|
"numberStep": "Este número precisa ser um múltiplo de {0}!",
|
||||||
|
"numberStepOffset": "Este número precisa ser um múltiplo de {0} começando com {1}!",
|
||||||
|
"numberStartsWith": "Este número precisa começar com {0}!",
|
||||||
|
"numberEndsWith": "Este número precisa terminar com {0}!",
|
||||||
|
"numberContains": "Este número precisa conter {0}!",
|
||||||
|
"numberChoices": "Este número só pode ser um dos seguintes valores: {0}!",
|
||||||
|
"numberFloat": "Este número não pode ser decimal!",
|
||||||
|
"numberNegative": "Este número não pode ser negativo!",
|
||||||
|
"numberPositive": "Este número não pode ser positivo!",
|
||||||
|
"numberZero": "Este número não pode ser zero!",
|
||||||
|
|
||||||
|
"booleanTrue": "Este booleano não pode ser verdadeiro!",
|
||||||
|
"booleanFalse": "Este booleano não pode ser falso!",
|
||||||
|
|
||||||
|
"arrayEmptyDisabled": "Este array não pode estar vazio!",
|
||||||
|
"arrayEmptyRequired": "Este array deve estar vazio!",
|
||||||
|
"arrayTooShort": "Este array precisa ter um comprimento de pelo menos {0}!",
|
||||||
|
"arrayTooLong": "Este array precisa ter um comprimento de no máximo {0}!",
|
||||||
|
"arrayLengthInvalid": "Este array precisa ter um comprimento de {0}!",
|
||||||
|
"arrayInvalidTypes": "Este array só pode conter os seguintes tipos: {0}!",
|
||||||
|
"arrayDouble": "Este array não permite o mesmo valor duas vezes!",
|
||||||
|
|
||||||
|
"discordInvalidId": "Este é um ID do Discord inválido {0}!",
|
||||||
|
"discordInvalidIdOptions": "Este é um ID do Discord inválido {0}! Você também pode usar um destes: {1}!",
|
||||||
|
"discordInvalidToken": "Este é um token do Discord inválido (sintaticamente)!",
|
||||||
|
"colorInvalid": "Esta é uma cor hexadecimal inválida!",
|
||||||
|
"emojiTooShort": "Esta string precisa ter pelo menos {0} emojis!",
|
||||||
|
"emojiTooLong": "Esta string precisa ter no máximo {0} emojis!",
|
||||||
|
"emojiCustom": "Este emoji não pode ser um emoji personalizado do Discord!",
|
||||||
|
"emojiInvalid": "Este é um emoji inválido!",
|
||||||
|
"urlInvalid": "Esta URL é inválida!",
|
||||||
|
"urlInvalidHttp": "Esta URL só pode usar o protocolo https://!",
|
||||||
|
"urlInvalidProtocol": "Esta URL só pode usar os protocolos http:// e https://!",
|
||||||
|
"urlInvalidHostname": "Esta URL tem um hostname não permitido!",
|
||||||
|
"urlInvalidExtension": "Esta URL tem uma extensão inválida! Escolha entre: {0}!",
|
||||||
|
"urlInvalidPath": "Esta URL tem um caminho inválido!",
|
||||||
|
"idNotUnique": "Este ID não é único, use outro ID!",
|
||||||
|
"idNonExistent": "O ID {0} não existe!",
|
||||||
|
|
||||||
|
"invalidType": "Esta propriedade precisa ser do tipo: {0}!",
|
||||||
|
"propertyMissing": "A propriedade {0} está faltando neste objeto!",
|
||||||
|
"propertyOptional": "A propriedade {0} é opcional neste objeto!",
|
||||||
|
"objectDisabled": "Este objeto está desabilitado, habilite-o usando {0}!",
|
||||||
|
"nullInvalid": "Esta propriedade não pode ser nula!",
|
||||||
|
"switchInvalidType": "Isso precisa ser um dos seguintes tipos: {0}!",
|
||||||
|
"objectSwitchInvalid": "Este objeto precisa ser um dos seguintes tipos: {0}!",
|
||||||
|
|
||||||
|
"invalidLanguage": "Este é um idioma inválido!",
|
||||||
|
"invalidButton": "Este botão precisa ter pelo menos um {0} ou {1}!",
|
||||||
|
"unusedOption": "A opção {0} não é usada em nenhum lugar!",
|
||||||
|
"unusedQuestion": "A pergunta {0} não é usada em nenhum lugar!",
|
||||||
|
"dropdownOption": "Um painel com dropdown habilitado só pode conter opções do tipo 'ticket'!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"actions":{
|
||||||
|
"buttons":{
|
||||||
|
"create": "Visitar Ticket",
|
||||||
|
"close": "Fechar Ticket",
|
||||||
|
"delete": "Excluir Ticket",
|
||||||
|
"reopen": "Reabrir Ticket",
|
||||||
|
"claim": "Reivindicar Ticket",
|
||||||
|
"unclaim": "Desreivindicar Ticket",
|
||||||
|
"pin": "Fixar Ticket",
|
||||||
|
"unpin": "Desfixar Ticket",
|
||||||
|
"clear": "Excluir Tickets",
|
||||||
|
"helpSwitchSlash": "Ver Comandos Slash",
|
||||||
|
"helpSwitchText": "Ver Comandos de Texto",
|
||||||
|
"helpPage": "Página {0}",
|
||||||
|
"withReason": "Com Motivo",
|
||||||
|
"withoutTranscript": "Sem Transcrição"
|
||||||
|
},
|
||||||
|
"titles":{
|
||||||
|
"created":"Ticket Criado",
|
||||||
|
"close":"Ticket Fechado",
|
||||||
|
"delete":"Ticket Deletado",
|
||||||
|
"reopen":"Ticket Re-abeto",
|
||||||
|
"claim":"Ticket Resgatado",
|
||||||
|
"unclaim":"Ticket Não Resgatado",
|
||||||
|
"pin":"Ticket Fixado",
|
||||||
|
"unpin":"Ticket Desfixado",
|
||||||
|
"rename":"Ticket Renomeado",
|
||||||
|
"move":"Ticket Movido",
|
||||||
|
"add":"Ticket Usuário Adicionado",
|
||||||
|
"remove":"Ticket Usuário Removido",
|
||||||
|
|
||||||
|
"help":"Comandos disponíveis",
|
||||||
|
"statsReset":"Redefinir Status",
|
||||||
|
"blacklistAdd":"User Blacklisted",
|
||||||
|
"blacklistRemove":"User Released",
|
||||||
|
"blacklistGet":"Usuário na Blacklisted",
|
||||||
|
"blacklistView":"Atualmente na Blacklist",
|
||||||
|
"blacklistAddDm":"Adicionado a Blacklist",
|
||||||
|
"blacklistRemoveDm":"Removido da Blacklist",
|
||||||
|
"clear":"Tickets Limpos",
|
||||||
|
"roles":"Cargos Atualizados",
|
||||||
|
|
||||||
|
"autoclose": "Ticket Fechado Automaticamente",
|
||||||
|
"autocloseEnabled": "Fechamento Automático Habilitado",
|
||||||
|
"autocloseDisabled": "Fechamento Automático Desabilitado",
|
||||||
|
"autodelete": "Ticket Excluído Automaticamente",
|
||||||
|
"autodeleteEnabled": "Exclusão Automática Habilitada",
|
||||||
|
"autodeleteDisabled": "Exclusão Automática Desabilitada"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"create": "Seu ticket foi criado. Clique no botão abaixo para acessá-lo!",
|
||||||
|
"close": "O ticket foi fechado com sucesso!",
|
||||||
|
"delete": "O ticket foi excluído com sucesso!",
|
||||||
|
"reopen": "O ticket foi reaberto com sucesso!",
|
||||||
|
"claim": "O ticket foi reivindicado com sucesso!",
|
||||||
|
"unclaim": "O ticket foi desreivindicado com sucesso!",
|
||||||
|
"pin": "O ticket foi fixado com sucesso!",
|
||||||
|
"unpin": "O ticket foi desfixado com sucesso!",
|
||||||
|
"rename": "O ticket foi renomeado para {0} com sucesso!",
|
||||||
|
"move": "O ticket foi movido para {0} com sucesso!",
|
||||||
|
"add": "{0} foi adicionado ao ticket com sucesso!",
|
||||||
|
"remove": "{0} foi removido do ticket com sucesso!",
|
||||||
|
|
||||||
|
"helpExplanation":"`<nome>` => parâmetro obrigatório\n`[nome]` => parâmetro opcional",
|
||||||
|
"statsReset":"As estatísticas do bot foram redefinidas com sucesso!",
|
||||||
|
"statsError":"Não foi possível visualizar as estatísticas do ticket!\n{0} não é um ticket!",
|
||||||
|
"blacklistAdd":"{0} foi adicionado à lista negra com sucesso!",
|
||||||
|
"blacklistRemove":"{0} foi removido da lista negra com sucesso!",
|
||||||
|
"blacklistGetSuccess":"{0} está atualmente na lista negra!",
|
||||||
|
"blacklistGetEmpty":"{0} não está atualmente na lista negra!",
|
||||||
|
"blacklistViewEmpty":"Ninguém foi adicionado à lista negra ainda!",
|
||||||
|
"blacklistViewTip":"Use \"/blacklist add\" para adicionar um usuário à lista negra!",
|
||||||
|
"clearVerify":"Você tem certeza de que deseja excluir vários tickets?\nEsta ação não pode ser desfeita!",
|
||||||
|
"clearReady":"{0} tickets foram excluídos com sucesso!",
|
||||||
|
"rolesEmpty":"Nenhum cargo foi atualizado!",
|
||||||
|
|
||||||
|
"autocloseLeave": "Este ticket foi fechado automaticamente porque o criador saiu do servidor!",
|
||||||
|
"autocloseTimeout": "Este ticket foi fechado automaticamente porque ficou inativo por mais de `{0}h`!",
|
||||||
|
"autodeleteLeave": "Este ticket foi excluído automaticamente porque o criador saiu do servidor!",
|
||||||
|
"autodeleteTimeout": "Este ticket foi excluído automaticamente porque ficou inativo por mais de `{0} dias`!",
|
||||||
|
"autocloseEnabled": "O fechamento automático foi habilitado neste ticket!\nEle será fechado quando ficar inativo por mais de `{0}h`!",
|
||||||
|
"autocloseDisabled": "O fechamento automático foi desabilitado neste ticket!\nEle não será mais fechado automaticamente!",
|
||||||
|
"autodeleteEnabled": "A exclusão automática foi habilitada neste ticket!\nEle será excluído quando ficar inativo por mais de `{0} dias`!",
|
||||||
|
"autodeleteDisabled": "A exclusão automática foi desabilitada neste ticket!\nEle não será mais excluído automaticamente!",
|
||||||
|
|
||||||
|
"ticketMessageLimit": "Você só pode criar {0} ticket(s) ao mesmo tempo!",
|
||||||
|
"ticketMessageAutoclose": "Este ticket será fechado automaticamente quando inativo por {0}h!",
|
||||||
|
"ticketMessageAutodelete": "Este ticket será excluído automaticamente quando inativo por {0} dias!",
|
||||||
|
"panelReady": "Você pode encontrar o painel abaixo!\nEsta mensagem agora pode ser excluída!"
|
||||||
|
},
|
||||||
|
"modal":{
|
||||||
|
"closePlaceholder": "Por que você fechou este ticket?",
|
||||||
|
"deletePlaceholder": "Por que você excluiu este ticket?",
|
||||||
|
"reopenPlaceholder": "Por que você reabriu este ticket?",
|
||||||
|
"claimPlaceholder": "Por que você reivindicou este ticket?",
|
||||||
|
"unclaimPlaceholder": "Por que você desreivindicou este ticket?",
|
||||||
|
"pinPlaceholder": "Por que você fixou este ticket?",
|
||||||
|
"unpinPlaceholder": "Por que você desfixou este ticket?"
|
||||||
|
},
|
||||||
|
"logs":{
|
||||||
|
"createLog": "Um novo ticket foi criado por {0}!",
|
||||||
|
"closeLog": "Este ticket foi fechado por {0}!",
|
||||||
|
"closeDm": "Seu ticket foi fechado em nosso servidor!",
|
||||||
|
"deleteLog": "Este ticket foi excluído por {0}!",
|
||||||
|
"deleteDm": "Seu ticket foi excluído em nosso servidor!",
|
||||||
|
"reopenLog": "Este ticket foi reaberto por {0}!",
|
||||||
|
"reopenDm": "Seu ticket foi reaberto em nosso servidor!",
|
||||||
|
"claimLog": "Este ticket foi reivindicado por {0}!",
|
||||||
|
"claimDm": "Seu ticket foi reivindicado em nosso servidor!",
|
||||||
|
"unclaimLog": "Este ticket foi desreivindicado por {0}!",
|
||||||
|
"unclaimDm": "Seu ticket foi desreivindicado em nosso servidor!",
|
||||||
|
"pinLog": "Este ticket foi fixado por {0}!",
|
||||||
|
"pinDm": "Seu ticket foi fixado em nosso servidor!",
|
||||||
|
"unpinLog": "Este ticket foi desfixado por {0}!",
|
||||||
|
"unpinDm": "Seu ticket foi desfixado em nosso servidor!",
|
||||||
|
"renameLog": "Este ticket foi renomeado para {0} por {1}!",
|
||||||
|
"renameDm": "Seu ticket foi renomeado para {0} em nosso servidor!",
|
||||||
|
"moveLog": "Este ticket foi movido para {0} por {1}!",
|
||||||
|
"moveDm": "Seu ticket foi movido para {0} em nosso servidor!",
|
||||||
|
"addLog": "{0} foi adicionado a este ticket por {1}!",
|
||||||
|
"addDm": "{0} foi adicionado ao seu ticket em nosso servidor!",
|
||||||
|
"removeLog": "{0} foi removido deste ticket por {1}!",
|
||||||
|
"removeDm": "{0} foi removido do seu ticket em nosso servidor!",
|
||||||
|
|
||||||
|
"blacklistAddLog": "{0} foi adicionado à lista negra por {1}!",
|
||||||
|
"blacklistRemoveLog": "{0} foi removido da lista negra por {1}!",
|
||||||
|
"blacklistAddDm": "Você foi adicionado à lista negra em nosso servidor!\nA partir de agora, você não pode criar um ticket!",
|
||||||
|
"blacklistRemoveDm": "Você foi removido da lista negra em nosso servidor!\nAgora você pode criar tickets novamente!",
|
||||||
|
"clearLog": "{0} tickets foram excluídos por {1}!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"transcripts":{
|
||||||
|
"success":{
|
||||||
|
"visit": "Visitar Transcrição",
|
||||||
|
"ready": "Transcrição Criada",
|
||||||
|
"textFileDescription": "Esta é a transcrição em texto de um ticket excluído!",
|
||||||
|
"htmlProgress": "Por favor, aguarde enquanto esta transcrição em HTML está sendo processada...",
|
||||||
|
|
||||||
|
"createdChannel": "Uma nova transcrição de {0} foi criada no servidor!",
|
||||||
|
"createdCreator": "Uma nova transcrição de {0} foi criada para um dos seus tickets!",
|
||||||
|
"createdParticipant": "Uma nova transcrição de {0} foi criada em um dos tickets em que você participou!",
|
||||||
|
"createdActiveAdmin": "Uma nova transcrição de {0} foi criada em um dos tickets em que você participou como administrador!",
|
||||||
|
"createdEveryAdmin": "Uma nova transcrição de {0} foi criada em um dos tickets em que você era administrador!",
|
||||||
|
"createdOther": "Uma nova transcrição de {0} foi criada!"
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"retry": "Tentar Novamente",
|
||||||
|
"continue": "Excluir Sem Transcrição",
|
||||||
|
"backup": "Criar Transcrição de Backup",
|
||||||
|
"error": "Algo deu errado ao tentar criar a transcrição.\nO que você gostaria de fazer?\n\nEste ticket não será excluído até que você clique em um desses botões."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"errors":{
|
||||||
|
"titles":{
|
||||||
|
"internalError": "Erro Interno",
|
||||||
|
"optionMissing": "Opção de Comando Ausente",
|
||||||
|
"optionInvalid": "Opção de Comando Inválida",
|
||||||
|
"unknownCommand": "Comando Desconhecido",
|
||||||
|
"noPermissions": "Sem Permissões",
|
||||||
|
"unknownTicket": "Ticket Desconhecido",
|
||||||
|
"deprecatedTicket": "Ticket Obsoleto",
|
||||||
|
"unknownOption": "Opção Desconhecida",
|
||||||
|
"unknownPanel": "Painel Desconhecido",
|
||||||
|
"notInGuild": "Não Está no Servidor",
|
||||||
|
"channelRename": "Incapaz de Renomear Canal",
|
||||||
|
"busy": "Ticket Está Ocupado"
|
||||||
|
},
|
||||||
|
"descriptions":{
|
||||||
|
"askForInfo": "Entre em contato com o proprietário deste bot para mais informações!",
|
||||||
|
"askForInfoResolve": "Entre em contato com o proprietário deste bot se este problema não for resolvido após algumas tentativas.",
|
||||||
|
"internalError": "Falha ao responder a este {0} devido a um erro interno!",
|
||||||
|
"optionMissing": "Um parâmetro obrigatório está faltando neste comando!",
|
||||||
|
"optionInvalid": "Um parâmetro neste comando é inválido!",
|
||||||
|
"optionInvalidChoose": "Escolha entre",
|
||||||
|
"unknownCommand": "Tente visitar o menu de ajuda para mais informações!",
|
||||||
|
"noPermissions": "Você não tem permissão para usar este {0}!",
|
||||||
|
"noPermissionsList": "Permissões Necessárias: (uma delas)",
|
||||||
|
"noPermissionsCooldown": "Você não tem permissão para usar este {0} porque você está em período de cooldown!",
|
||||||
|
"noPermissionsBlacklist": "Você não tem permissão para usar este {0} porque você foi colocado na lista negra!",
|
||||||
|
"noPermissionsLimitGlobal": "Você não tem permissão para criar um ticket porque o servidor atingiu o limite máximo de tickets!",
|
||||||
|
"noPermissionsLimitGlobalUser": "Você não tem permissão para criar um ticket porque você atingiu o limite máximo de tickets!",
|
||||||
|
"noPermissionsLimitOption": "Você não tem permissão para criar um ticket porque o servidor atingiu o limite máximo de tickets para esta opção!",
|
||||||
|
"noPermissionsLimitOptionUser": "Você não tem permissão para criar um ticket porque você atingiu o limite máximo de tickets para esta opção!",
|
||||||
|
"unknownTicket": "Tente este comando novamente em um ticket válido!",
|
||||||
|
"deprecatedTicket": "O canal atual não é um ticket válido! Pode ter sido um ticket de uma versão antiga do Open Ticket!",
|
||||||
|
"notInGuild": "Este {0} não funciona em DM! Por favor, tente novamente em um servidor!",
|
||||||
|
"channelRename": "Devido aos limites de taxa do Discord, atualmente é impossível para o bot renomear o canal. O canal será renomeado automaticamente em 10 minutos se o bot não for reiniciado.",
|
||||||
|
"channelRenameSource": "A fonte deste erro é: {0}",
|
||||||
|
"busy": "Não é possível usar este {0}!\nO ticket está sendo processado pelo bot no momento.\n\nPor favor, tente novamente em alguns segundos!"
|
||||||
|
},
|
||||||
|
"optionInvalidReasons":{
|
||||||
|
"stringRegex": "O valor não corresponde ao padrão!",
|
||||||
|
"stringMinLength": "O valor precisa ter pelo menos {0} caracteres!",
|
||||||
|
"stringMaxLength": "O valor precisa ter no máximo {0} caracteres!",
|
||||||
|
"numberInvalid": "Número inválido!",
|
||||||
|
"numberMin": "O número precisa ser pelo menos {0}!",
|
||||||
|
"numberMax": "O número precisa ser no máximo {0}!",
|
||||||
|
"numberDecimal": "Não é permitido que o número seja decimal!",
|
||||||
|
"numberNegative": "Não é permitido que o número seja negativo!",
|
||||||
|
"numberPositive": "Não é permitido que o número seja positivo!",
|
||||||
|
"numberZero": "Não é permitido que o número seja zero!",
|
||||||
|
"channelNotFound": "Não foi possível encontrar o canal!",
|
||||||
|
"userNotFound": "Não foi possível encontrar o usuário!",
|
||||||
|
"roleNotFound": "Não foi possível encontrar o cargo!",
|
||||||
|
"memberNotFound": "Não foi possível encontrar o usuário!",
|
||||||
|
"mentionableNotFound": "Não foi possível encontrar o usuário ou cargo!",
|
||||||
|
"channelType": "Tipo de canal inválido!",
|
||||||
|
"notInGuild": "Esta opção requer que você esteja em um servidor!"
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"developer": "Você precisa ser o desenvolvedor do bot.",
|
||||||
|
"owner": "Você precisa ser o dono do servidor.",
|
||||||
|
"admin": "Você precisa ser um administrador do servidor.",
|
||||||
|
"moderator": "Você precisa ser um moderador.",
|
||||||
|
"support": "Você precisa estar na equipe de suporte.",
|
||||||
|
"member": "Você precisa ser um membro.",
|
||||||
|
"discord-administrator": "Você precisa ter a permissão `ADMINISTRATOR`."
|
||||||
|
},
|
||||||
|
"actionInvalid":{
|
||||||
|
"close": "O ticket já está fechado!",
|
||||||
|
"reopen": "O ticket ainda não está fechado!",
|
||||||
|
"claim": "O ticket já está reivindicado!",
|
||||||
|
"unclaim": "O ticket ainda não está reivindicado!",
|
||||||
|
"pin": "O ticket já está fixado!",
|
||||||
|
"unpin": "O ticket ainda não está fixado!",
|
||||||
|
"add": "Este usuário já pode acessar o ticket!",
|
||||||
|
"remove": "Não foi possível remover este usuário do ticket!"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"params":{
|
||||||
|
"uppercase":{
|
||||||
|
"ticket":"Ticket",
|
||||||
|
"tickets":"Tickets",
|
||||||
|
"reason":"Motivo",
|
||||||
|
"creator":"Criador",
|
||||||
|
"remaining":"Tempo Restante",
|
||||||
|
"added":"Adicionado",
|
||||||
|
"removed":"Removido",
|
||||||
|
"filter":"Filtro",
|
||||||
|
"claimedBy":"Reivindicado por {0}",
|
||||||
|
"method":"Método",
|
||||||
|
"type":"Tipo",
|
||||||
|
"blacklisted":"Na Lista Negra",
|
||||||
|
"panel":"Painel",
|
||||||
|
"command":"Comando",
|
||||||
|
"system":"Sistema",
|
||||||
|
"true":"Verdadeiro",
|
||||||
|
"false":"Falso",
|
||||||
|
"syntax":"Sintaxe",
|
||||||
|
"originalName":"Nome Original",
|
||||||
|
"newName":"Novo Nome",
|
||||||
|
"until":"Até",
|
||||||
|
"validOptions":"Opções Válidas",
|
||||||
|
"validPanels":"Painéis Válidos",
|
||||||
|
"autoclose":"Auto-fechar",
|
||||||
|
"autodelete":"Auto-deletar",
|
||||||
|
"startupDate":"Data de Início",
|
||||||
|
"version":"Versão",
|
||||||
|
"name":"Nome",
|
||||||
|
"role":"Cargo",
|
||||||
|
"status":"Status",
|
||||||
|
"claimed":"Reivindicado",
|
||||||
|
"pinned":"Fixado",
|
||||||
|
"creationDate":"Data de Criação"
|
||||||
|
},
|
||||||
|
"lowercase":{
|
||||||
|
"text":"texto",
|
||||||
|
"html":"html",
|
||||||
|
"command":"comando",
|
||||||
|
"modal":"modal",
|
||||||
|
"button":"botão",
|
||||||
|
"dropdown":"dropdown",
|
||||||
|
"method":"método"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commands":{
|
||||||
|
"reason": "Especifique um motivo opcional que será visível nos logs.",
|
||||||
|
"help": "Obtenha uma lista de todos os comandos disponíveis.",
|
||||||
|
"panel": "Gerar uma mensagem com um dropdown ou botões (para criação de tickets).",
|
||||||
|
"panelId": "O identificador do painel que você deseja gerar.",
|
||||||
|
"panelAutoUpdate": "Você quer que este painel atualize automaticamente quando editado?",
|
||||||
|
"ticket": "Crie um ticket instantaneamente.",
|
||||||
|
"ticketId": "O identificador do ticket que você deseja criar.",
|
||||||
|
"close": "Feche um ticket.",
|
||||||
|
"delete": "Exclua um ticket.",
|
||||||
|
"deleteNoTranscript": "Exclua este ticket sem criar uma transcrição.",
|
||||||
|
"reopen": "Reabra um ticket.",
|
||||||
|
"claim": "Assuma um ticket.",
|
||||||
|
"claimUser": "Assuma este ticket para outra pessoa em vez de você mesmo.",
|
||||||
|
"unclaim": "Desassuma um ticket.",
|
||||||
|
"pin": "Fixe um ticket.",
|
||||||
|
"unpin": "Desfixe um ticket.",
|
||||||
|
"move": "Mova um ticket.",
|
||||||
|
"moveId": "O identificador do opção para o qual você deseja mover.",
|
||||||
|
"rename": "Renomeie um ticket.",
|
||||||
|
"renameName": "O novo nome para este ticket.",
|
||||||
|
"add": "Adicione um usuário a um ticket.",
|
||||||
|
"addUser": "O usuário a ser adicionado.",
|
||||||
|
"remove": "Remover um usuário de um ticket.",
|
||||||
|
"removeUser": "O usuário a ser removido.",
|
||||||
|
"blacklist": "Gerenciar a lista negra de tickets.",
|
||||||
|
"blacklistView": "Ver uma lista da blacklist atual.",
|
||||||
|
"blacklistAdd": "Adicionar um usuário à blacklist.",
|
||||||
|
"blacklistRemove": "Remover um usuário da blacklist.",
|
||||||
|
"blacklistGet": "Obter os detalhes de um usuário na blacklist.",
|
||||||
|
"blacklistGetUser": "O usuário para obter detalhes.",
|
||||||
|
"stats": "Ver estatísticas do bot, de um membro ou de um ticket.",
|
||||||
|
"statsReset": "Redefinir todas as estatísticas do bot (e começar a contar do zero).",
|
||||||
|
"statsGlobal": "Ver as estatísticas globais.",
|
||||||
|
"statsUser": "Ver as estatísticas de um usuário no servidor.",
|
||||||
|
"statsUserUser": "O usuário para visualizar.",
|
||||||
|
"statsTicket": "Ver as estatísticas de um ticket no servidor.",
|
||||||
|
"statsTicketTicket": "O ticket para visualizar.",
|
||||||
|
"clear": "Excluir vários tickets ao mesmo tempo. Um filtro opcional pode ser especificado.",
|
||||||
|
"clearFilter": "O filtro para limpar tickets.",
|
||||||
|
"clearFilters": {
|
||||||
|
"all": "Todos",
|
||||||
|
"open": "Aberto",
|
||||||
|
"close": "Fechado",
|
||||||
|
"claim": "Reivindicado",
|
||||||
|
"unclaim": "Não Reivindicado",
|
||||||
|
"pin": "Fixado",
|
||||||
|
"unpin": "Desfixado",
|
||||||
|
"autoclose": "Fechado Automaticamente"
|
||||||
|
},
|
||||||
|
"autoclose": "Gerenciar fechamento automático em um ticket.",
|
||||||
|
"autocloseDisable": "Desabilitar fechamento automático neste ticket.",
|
||||||
|
"autocloseEnable": "Habilitar fechamento automático neste ticket.",
|
||||||
|
"autocloseEnableTime": "A quantidade de horas que este ticket precisa estar inativo para ser fechado.",
|
||||||
|
"autodelete": "Gerenciar exclusão automática em um ticket.",
|
||||||
|
"autodeleteDisable": "Desabilitar exclusão automática neste ticket.",
|
||||||
|
"autodeleteEnable": "Habilitar exclusão automática neste ticket.",
|
||||||
|
"autodeleteEnableTime": "A quantidade de dias que este ticket precisa estar inativo para ser excluído."
|
||||||
|
},
|
||||||
|
"helpMenu": {
|
||||||
|
"help": "Obtenha uma lista de todos os comandos disponíveis.",
|
||||||
|
"ticket": "Crie um ticket instantaneamente.",
|
||||||
|
"close": "Feche um ticket, isso desabilita a escrita neste canal.",
|
||||||
|
"delete": "Exclua um ticket, isso cria uma transcrição quando habilitado.",
|
||||||
|
"reopen": "Reabra um ticket, isso habilita a escrita neste canal novamente.",
|
||||||
|
"pin": "Fixe um ticket. Isso moverá o ticket para o topo e adicionará um emoji '📌' ao nome.",
|
||||||
|
"unpin": "Desfixe um ticket. O ticket permanecerá na sua posição, mas perderá o emoji '📌'.",
|
||||||
|
"move": "Mova um ticket. Isso mudará o tipo deste ticket.",
|
||||||
|
"rename": "Renomeie um ticket. Isso mudará o nome do canal deste ticket.",
|
||||||
|
"claim": "Assuma um ticket. Com isso, você pode informar à sua equipe que está lidando com este ticket.",
|
||||||
|
"unclaim": "Desassuma um ticket. Com isso, você pode informar à sua equipe que este ticket está livre novamente.",
|
||||||
|
"add": "Adicione um usuário a um ticket. Isso permitirá que o usuário leia e escreva neste ticket.",
|
||||||
|
"remove": "Remova um usuário de um ticket. Isso removerá a capacidade de ler e escrever para um usuário neste ticket.",
|
||||||
|
"panel": "Gere uma mensagem com um dropdown ou botões (para criação de tickets).",
|
||||||
|
"blacklistView": "Veja uma lista da blacklist atual.",
|
||||||
|
"blacklistAdd": "Adicione um usuário à blacklist.",
|
||||||
|
"blacklistRemove": "Remova um usuário da blacklist.",
|
||||||
|
"blacklistGet": "Obtenha os detalhes de um usuário na blacklist.",
|
||||||
|
"statsGlobal": "Veja as estatísticas globais.",
|
||||||
|
"statsTicket": "Veja as estatísticas de um ticket no servidor.",
|
||||||
|
"statsUser": "Veja as estatísticas de um usuário no servidor.",
|
||||||
|
"statsReset": "Redefina todas as estatísticas do bot (e comece a contar do zero).",
|
||||||
|
"autocloseDisable": "Desabilite o fechamento automático neste ticket.",
|
||||||
|
"autocloseEnable": "Habilite o fechamento automático neste ticket.",
|
||||||
|
"autodeleteDisable": "Desabilite a exclusão automática neste ticket.",
|
||||||
|
"autodeleteEnable": "Habilite a exclusão automática neste ticket."
|
||||||
|
},
|
||||||
|
"stats":{
|
||||||
|
"scopes": {
|
||||||
|
"global": "Status Global",
|
||||||
|
"system": "Status do Sistema",
|
||||||
|
"user": "Status do Usuário",
|
||||||
|
"ticket": "Status do Ticket",
|
||||||
|
"participants": "Participantes"
|
||||||
|
},
|
||||||
|
"properties":{
|
||||||
|
"ticketsCreated":"Tickets Criados",
|
||||||
|
"ticketsClosed":"Tickets Fechados",
|
||||||
|
"ticketsDeleted":"Tickets Deletados",
|
||||||
|
"ticketsReopened":"Tickets Re-Abertos",
|
||||||
|
"ticketsAutoclosed":"Tickets Auto Fechados",
|
||||||
|
"ticketsClaimed":"Tickets Claimados",
|
||||||
|
"ticketsPinned":"Tickets Fixados",
|
||||||
|
"ticketsMoved":"Tickets Movidos",
|
||||||
|
"usersBlacklisted":"Usuários na Blacklist",
|
||||||
|
"transcriptsCreated":"Transcrição Criada"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+31
-25
@@ -1,27 +1,33 @@
|
|||||||
{
|
{
|
||||||
"name": "safemt-tickets",
|
"name": "open-ticket",
|
||||||
"version": "1.0.0",
|
"author": "DJdj Development",
|
||||||
"description": "This is an open-source discord ticket bot, you can configure it and it comes with cool features like a transcript.",
|
"version": "4.0.0",
|
||||||
"main": "index.js",
|
"description": "The most advanced open-source discord ticket bot with HTML transcripts, plugins, questions, claiming, pinning & more! Using discord.js v14 & JSON database! ",
|
||||||
"scripts": {
|
"keywords": ["ticket-bot","discord","open-ticket","plugins","discord-ticket-bot"],
|
||||||
"start": "node index.js",
|
"main": "./src/index.ts",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"scripts": {
|
||||||
},
|
"verify": "tsc -p ./tsconfig.json",
|
||||||
"author": "",
|
"start": "npx tsx ./src/index.ts",
|
||||||
"license": "ISC",
|
"test": "npm run verify && npx tsx ./src/index.ts --dev-config --dev-database"
|
||||||
"dependencies": {
|
},
|
||||||
"canvas": "^2.8.0",
|
"type": "commonjs",
|
||||||
"discord.js": "^13.2.0",
|
"license": "GPL-3.0-only",
|
||||||
"express": "^4.17.1",
|
"dependencies": {
|
||||||
"node": "^16.10.0",
|
"ansis": "^2.3.0",
|
||||||
"node-localstorage": "^2.2.1"
|
"discord.js": "^14.15.3",
|
||||||
},
|
"formatted-json-stringify": "^1.1.0",
|
||||||
"repository": {
|
"tsx": "^4.17.0"
|
||||||
"type": "git",
|
},
|
||||||
"url": "git+https://github.com/DJj123dj/open-ticket.git"
|
"devDependencies": {
|
||||||
},
|
"typescript": "^5.3.3"
|
||||||
"bugs": {
|
},
|
||||||
"url": "https://github.com/DJj123dj/open-ticket/issues"
|
"repository": {
|
||||||
},
|
"type": "git",
|
||||||
"homepage": "https://github.com/DJj123dj/open-ticket#readme"
|
"url": "git+https://github.com/DJj123dj/open-ticket.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/DJj123dj/open-ticket/issues",
|
||||||
|
"email": "support@dj-dj.be"
|
||||||
|
},
|
||||||
|
"homepage": "https://openticket.dj-dj.be"
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"testVariable1":true,
|
||||||
|
"testVariable2":123,
|
||||||
|
"testVariable3":"abc"
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import {api, openticket, utilities} from "../../src/index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
//// This plugin is not enabled yet! ////
|
||||||
|
//// Enable it in the plugin.json file! ////
|
||||||
|
/////////////////////////////////////////////
|
||||||
|
|
||||||
|
if (utilities.project != "openticket") throw new api.ODPluginError("This plugin only works in Open Ticket!")
|
||||||
|
if (!utilities.isBeta) throw new api.ODPluginError("This plugin is made for the beta version of Open Ticket!")
|
||||||
|
|
||||||
|
//Add Typescript autocomplete support for plugin data. (!!!OPTIONAL!!!)
|
||||||
|
declare module "../../src/core/api/api.ts" {
|
||||||
|
export interface ODConfigManagerIds_Default {
|
||||||
|
"example-plugin:config":api.ODJsonConfig
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Let's register the example config. This way it's available for all plugins & systems.
|
||||||
|
openticket.events.get("onConfigLoad").listen((configManager) => {
|
||||||
|
configManager.add(new api.ODJsonConfig("example-plugin:config","config.json","./plugins/example-plugin/"))
|
||||||
|
/*===== What did we do? =====
|
||||||
|
- "example-plugin:config" Is the ID of this config. You can use this id troughout the bot to access this config file. Even in other plugins.
|
||||||
|
- "config.json" Is the FILE of this config. It is just the filename.
|
||||||
|
- "./plugins/example-plugin/" Is the DIRECTORY of this config. By default it's "./config/", but we want to change it to point at the plugin directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Let's also log it to the console to let us know it worked!
|
||||||
|
const ourConfig = configManager.get("example-plugin:config")
|
||||||
|
openticket.log("The example config loaded succesfully!","plugin",[
|
||||||
|
{key:"var-1",value:ourConfig.data.testVariable1},
|
||||||
|
{key:"var-2",value:ourConfig.data.testVariable2.toString()},
|
||||||
|
{key:"var-3",value:ourConfig.data.testVariable3.toString()}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
|
||||||
|
openticket.events.get("onTicketCreate").listen((creator) => {
|
||||||
|
//This is logged before the ticket is created (after the button is pressed)
|
||||||
|
openticket.log("Ticket is getting created...","plugin")
|
||||||
|
})
|
||||||
|
openticket.events.get("afterTicketCreated").listen((ticket,creator,channel) => {
|
||||||
|
//This is logged after the ticket is created
|
||||||
|
openticket.log("Ticket ready!","plugin")
|
||||||
|
})
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name":"Example Plugin",
|
||||||
|
"id":"example-plugin",
|
||||||
|
"version":"1.0.0",
|
||||||
|
"startFile":"index.ts",
|
||||||
|
|
||||||
|
"enabled":false,
|
||||||
|
"priority":0,
|
||||||
|
"events":[],
|
||||||
|
|
||||||
|
"npmDependencies":["discord.js"],
|
||||||
|
"requiredPlugins":[],
|
||||||
|
"incompatiblePlugins":[],
|
||||||
|
|
||||||
|
"details":{
|
||||||
|
"author":"DJj123dj",
|
||||||
|
"shortDescription":"A simple template for an Open Ticket v4 plugin!",
|
||||||
|
"longDescription":"A simple example of an Open Ticket v4 plugin!",
|
||||||
|
"imageUrl":"",
|
||||||
|
"projectUrl":"",
|
||||||
|
"tags":["template","example","default"]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET ADD USER SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:add-ticket-user"))
|
||||||
|
openticket.actions.get("openticket:add-ticket-user").workers.add([
|
||||||
|
new api.ODWorker("openticket:add-ticket-user",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to add user to ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketUserAdd").emit([ticket,user,data,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:participants").value.push({type:"user",id:data.id})
|
||||||
|
ticket.get("openticket:participants").refreshDatabase()
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update channel permissions
|
||||||
|
try{
|
||||||
|
await channel.permissionOverwrites.create(data,{
|
||||||
|
ViewChannel:true,
|
||||||
|
SendMessages:true,
|
||||||
|
AddReactions:true,
|
||||||
|
AttachFiles:true,
|
||||||
|
SendPolls:true,
|
||||||
|
ReadMessageHistory:true
|
||||||
|
})
|
||||||
|
}catch{
|
||||||
|
openticket.log("Failed to add channel permission overwrites on add-ticket-user","error")
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket user adding!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value,hidden:true}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:add-message").build(source,{guild,channel,user,ticket,reason,data})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketUserAdded").emit([ticket,user,data,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.adding.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"add",reason,additionalData:data}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.adding.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"add",reason,additionalData:data}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,data} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" added "+data.displayName+" to a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:add-ticket-user").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,276 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET CLAIMING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:claim-ticket"))
|
||||||
|
openticket.actions.get("openticket:claim-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:claim-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to claim ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketClaim").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:claimed").value = true
|
||||||
|
ticket.get("openticket:claimed-by").value = user.id
|
||||||
|
ticket.get("openticket:claimed-on").value = new Date().getTime()
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-claimed",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-claimed",user.id,1,"increase")
|
||||||
|
|
||||||
|
//update category
|
||||||
|
const rawClaimCategory = ticket.option.get("openticket:channel-categories-claimed").value.find((c) => c.user == user.id)
|
||||||
|
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
|
||||||
|
if (claimCategory){
|
||||||
|
try {
|
||||||
|
channel.setParent(claimCategory,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = "claimed"
|
||||||
|
ticket.get("openticket:category").value = claimCategory
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to move ticket to 'claimed category'!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"categoryid",value:claimCategory}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket claiming!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:claim-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketClaimed").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.claiming.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"claim",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.claiming.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"claim",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" claimed a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:claim-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//CLAIM TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:claim-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:claim-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.claim
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already claimed
|
||||||
|
if (ticket.get("openticket:claimed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start claiming ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//claim with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:claim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//claim without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:claim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:claim-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//CLAIM TICKET UNCLAIM MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:claim-ticket-unclaim-message",openticket.builders.messages.getSafe("openticket:verifybar-unclaim-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:claim-ticket-unclaim-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.claim
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already claimed
|
||||||
|
if (ticket.get("openticket:claimed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start claiming ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//claim with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:claim-ticket-reason").build("unclaim-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//claim without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:claim-ticket").run("unclaim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:claim-message").build("unclaim-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:claim-ticket-unclaim-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-unclaim-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//CLEAR TICKETS SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:clear-tickets"))
|
||||||
|
openticket.actions.get("openticket:clear-tickets").workers.add([
|
||||||
|
new api.ODWorker("openticket:clear-tickets",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,filter,list} = params
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketsClear").emit([list,user,channel,filter])
|
||||||
|
const nameList: string[] = []
|
||||||
|
for (const ticket of list){
|
||||||
|
const ticketChannel = await openticket.tickets.getTicketChannel(ticket)
|
||||||
|
if (!ticketChannel) return
|
||||||
|
nameList.push("#"+ticketChannel.name)
|
||||||
|
await openticket.actions.get("openticket:delete-ticket").run("clear",{guild,channel:ticketChannel,user,ticket,reason:"Cleared Ticket",sendMessage:true,withoutTranscript:false})
|
||||||
|
}
|
||||||
|
instance.list = nameList
|
||||||
|
await openticket.events.get("afterTicketsCleared").emit([list,user,channel,filter])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,filter,list} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.deleting.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:clear-logs").build(source,{guild,channel,user,filter,list:instance.list ?? []}))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,user,filter,list} = params
|
||||||
|
openticket.log(user.displayName+" cleared "+list.length+" tickets!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"filter",value:filter}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,328 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET CLOSING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:close-ticket"))
|
||||||
|
openticket.actions.get("openticket:close-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:close-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to close ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketClose").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:closed").value = true
|
||||||
|
if (source == "autoclose") ticket.get("openticket:autoclosed").value = true
|
||||||
|
ticket.get("openticket:open").value = false
|
||||||
|
ticket.get("openticket:closed-by").value = user.id
|
||||||
|
ticket.get("openticket:closed-on").value = new Date().getTime()
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-closed",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-closed",user.id,1,"increase")
|
||||||
|
|
||||||
|
//update category
|
||||||
|
const closeCategory = ticket.option.get("openticket:channel-category-closed").value
|
||||||
|
if (closeCategory !== ""){
|
||||||
|
try {
|
||||||
|
channel.setParent(closeCategory,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = "closed"
|
||||||
|
ticket.get("openticket:category").value = closeCategory
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to move ticket to 'closed category'!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"categoryid",value:closeCategory}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update permissions (non-staff => readonly)
|
||||||
|
const permissions: discord.OverwriteResolvable[] = [{
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:guild.roles.everyone.id,
|
||||||
|
allow:[],
|
||||||
|
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
|
||||||
|
}]
|
||||||
|
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
|
||||||
|
const optionAdmins = ticket.option.get("openticket:admins").value
|
||||||
|
const readonlyAdmins = ticket.option.get("openticket:admins-readonly").value
|
||||||
|
|
||||||
|
globalAdmins.forEach((admin) => {
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
optionAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
readonlyAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
if (optionAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","ReadMessageHistory"],
|
||||||
|
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
ticket.get("openticket:participants").value.forEach((participant) => {
|
||||||
|
//all participants that aren't roles/admins => readonly
|
||||||
|
if (participant.type == "user"){
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Member,
|
||||||
|
id:user.id,
|
||||||
|
allow:["ViewChannel","ReadMessageHistory"],
|
||||||
|
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
channel.permissionOverwrites.set(permissions)
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket closing!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:close-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketClosed").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.closing.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"close",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.closing.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"close",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" closed a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:close-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//CLOSE TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:close-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:close-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.close
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already closed
|
||||||
|
if (ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start closing ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//close with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:close-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//close without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:close-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:close-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//CLOSE TICKET REOPEN MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:close-ticket-reopen-message",openticket.builders.messages.getSafe("openticket:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:close-ticket-reopen-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.close
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already closed
|
||||||
|
if (ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start closing ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//close with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:close-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//close without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:close-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:close-ticket-reopen-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-reopen-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,229 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET CREATION SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:create-ticket"))
|
||||||
|
openticket.actions.get("openticket:create-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:create-ticket",3,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,user,answers,option} = params
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketCreate").emit([user])
|
||||||
|
await openticket.events.get("onTicketChannelCreation").emit([option,user])
|
||||||
|
|
||||||
|
//get channel properties
|
||||||
|
const channelPrefix = option.get("openticket:channel-prefix").value
|
||||||
|
const channelCategory = option.get("openticket:channel-category").value
|
||||||
|
const channelBackupCategory = option.get("openticket:channel-category-backup").value
|
||||||
|
const channelDescription = option.get("openticket:channel-description").value
|
||||||
|
const channelSuffix = openticket.options.suffix.getSuffixFromOption(option,user)
|
||||||
|
const channelName = channelPrefix+channelSuffix
|
||||||
|
|
||||||
|
//handle category
|
||||||
|
let category: string|null = null
|
||||||
|
let categoryMode: "backup"|"normal"|null = null
|
||||||
|
if (channelCategory != ""){
|
||||||
|
//category enabled
|
||||||
|
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
|
||||||
|
if (!normalCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Creation Error: Unable to find category! #1","error",[
|
||||||
|
{key:"categoryid",value:channelCategory},
|
||||||
|
{key:"backup",value:"false"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
//default category was found
|
||||||
|
if (normalCategory.children.cache.size >= 50 && channelBackupCategory != ""){
|
||||||
|
//use backup category
|
||||||
|
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
|
||||||
|
if (!backupCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Creation Error: Unable to find category! #2","error",[
|
||||||
|
{key:"categoryid",value:channelBackupCategory},
|
||||||
|
{key:"backup",value:"true"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
category = backupCategory.id
|
||||||
|
categoryMode = "backup"
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//use default category
|
||||||
|
category = normalCategory.id
|
||||||
|
categoryMode = "normal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//handle permissions
|
||||||
|
const permissions: discord.OverwriteResolvable[] = [{
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:guild.roles.everyone.id,
|
||||||
|
allow:[],
|
||||||
|
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
|
||||||
|
}]
|
||||||
|
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
|
||||||
|
const optionAdmins = option.get("openticket:admins").value
|
||||||
|
const readonlyAdmins = option.get("openticket:admins-readonly").value
|
||||||
|
|
||||||
|
globalAdmins.forEach((admin) => {
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
optionAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
readonlyAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
if (optionAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","ReadMessageHistory"],
|
||||||
|
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Member,
|
||||||
|
id:user.id,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
|
||||||
|
//create channel
|
||||||
|
const channel = await guild.channels.create({
|
||||||
|
type:discord.ChannelType.GuildText,
|
||||||
|
name:channelName,
|
||||||
|
nsfw:false,
|
||||||
|
topic:channelDescription,
|
||||||
|
parent:category,
|
||||||
|
reason:"Ticket Created By "+user.displayName,
|
||||||
|
permissionOverwrites:permissions
|
||||||
|
})
|
||||||
|
|
||||||
|
await openticket.events.get("afterTicketChannelCreated").emit([option,channel,user])
|
||||||
|
|
||||||
|
//create participants
|
||||||
|
const participants: {type:"role"|"user",id:string}[] = []
|
||||||
|
permissions.forEach((permission,index) => {
|
||||||
|
if (index == 0) return //don't include @everyone
|
||||||
|
const type = (permission.type == discord.OverwriteType.Role) ? "role" : "user"
|
||||||
|
const id = permission.id as string
|
||||||
|
participants.push({type,id})
|
||||||
|
})
|
||||||
|
|
||||||
|
//create ticket
|
||||||
|
const ticket = new api.ODTicket(channel.id,option,[
|
||||||
|
new api.ODTicketData("openticket:busy",false),
|
||||||
|
new api.ODTicketData("openticket:ticket-message",null),
|
||||||
|
new api.ODTicketData("openticket:participants",participants),
|
||||||
|
new api.ODTicketData("openticket:channel-suffix",channelSuffix),
|
||||||
|
|
||||||
|
new api.ODTicketData("openticket:open",true),
|
||||||
|
new api.ODTicketData("openticket:opened-by",user.id),
|
||||||
|
new api.ODTicketData("openticket:opened-on",new Date().getTime()),
|
||||||
|
new api.ODTicketData("openticket:closed",false),
|
||||||
|
new api.ODTicketData("openticket:closed-by",null),
|
||||||
|
new api.ODTicketData("openticket:closed-on",null),
|
||||||
|
new api.ODTicketData("openticket:claimed",false),
|
||||||
|
new api.ODTicketData("openticket:claimed-by",null),
|
||||||
|
new api.ODTicketData("openticket:claimed-on",null),
|
||||||
|
new api.ODTicketData("openticket:pinned",false),
|
||||||
|
new api.ODTicketData("openticket:pinned-by",null),
|
||||||
|
new api.ODTicketData("openticket:pinned-on",null),
|
||||||
|
new api.ODTicketData("openticket:for-deletion",false),
|
||||||
|
|
||||||
|
new api.ODTicketData("openticket:category",category),
|
||||||
|
new api.ODTicketData("openticket:category-mode",categoryMode),
|
||||||
|
|
||||||
|
new api.ODTicketData("openticket:autoclose-enabled",option.get("openticket:autoclose-enable-hours").value),
|
||||||
|
new api.ODTicketData("openticket:autoclose-hours",(option.get("openticket:autoclose-enable-hours").value ? option.get("openticket:autoclose-hours").value : 0)),
|
||||||
|
new api.ODTicketData("openticket:autoclosed",false),
|
||||||
|
new api.ODTicketData("openticket:autodelete-enabled",option.get("openticket:autodelete-enable-days").value),
|
||||||
|
new api.ODTicketData("openticket:autodelete-days",(option.get("openticket:autodelete-enable-days").value ? option.get("openticket:autodelete-days").value : 0)),
|
||||||
|
|
||||||
|
new api.ODTicketData("openticket:answers",answers)
|
||||||
|
])
|
||||||
|
|
||||||
|
//manage stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-created",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-created",user.id,1,"increase")
|
||||||
|
|
||||||
|
//manage bot permissions
|
||||||
|
await openticket.events.get("onTicketPermissionsCreated").emit([option,openticket.permissions,channel,user])
|
||||||
|
await (await import("../data/framework/permissionLoader.ts")).addTicketPermissions(ticket)
|
||||||
|
await openticket.events.get("afterTicketPermissionsCreated").emit([option,openticket.permissions,channel,user])
|
||||||
|
|
||||||
|
//export channel & ticket
|
||||||
|
instance.channel = channel
|
||||||
|
instance.ticket = ticket
|
||||||
|
openticket.tickets.add(ticket)
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:send-ticket-message",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,user,answers,option} = params
|
||||||
|
const {ticket,channel} = instance
|
||||||
|
|
||||||
|
if (!ticket || !channel) return openticket.log("Ticket Creation Error: Unable to send ticket message. Previous worker failed!","error")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketMainMessageCreated").emit([ticket,channel,user])
|
||||||
|
//check if ticket message is enabled
|
||||||
|
if (!option.get("openticket:ticket-message-enabled").value) return
|
||||||
|
try {
|
||||||
|
const msg = await channel.send((await openticket.builders.messages.getSafe("openticket:ticket-message").build(source,{guild,channel,user,ticket})).message)
|
||||||
|
|
||||||
|
ticket.get("openticket:ticket-message").value = msg.id
|
||||||
|
|
||||||
|
//manage stats
|
||||||
|
openticket.stats.get("openticket:ticket").setStat("openticket:messages-sent",ticket.id.value,1,"increase")
|
||||||
|
|
||||||
|
await openticket.events.get("afterTicketMainMessageCreated").emit([ticket,msg,channel,user])
|
||||||
|
}catch(err){
|
||||||
|
process.emit("uncaughtException",err)
|
||||||
|
//something went wrong while sending the ticket message
|
||||||
|
channel.send((await openticket.builders.messages.getSafe("openticket:error").build("other",{guild,channel,user,error:"Ticket Message: Creation Error!\n=> Ticket Is Still Created Succesfully",layout:"advanced"})).message)
|
||||||
|
}
|
||||||
|
await openticket.events.get("afterTicketCreated").emit([ticket,user,channel])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,user,answers,option} = params
|
||||||
|
const {ticket,channel} = instance
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.creation.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-created-logs").build(source,{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.creation.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-created-dm").build(source,{guild,channel,user,ticket}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,user,answers,option} = params
|
||||||
|
const {ticket,channel} = instance
|
||||||
|
|
||||||
|
if (!ticket || !channel) return openticket.log("Ticket Creation Error: Unable to create logs. Previous worker failed!","error")
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" created a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"option",value:option.id.value}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET CREATION SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:create-ticket-permissions"))
|
||||||
|
openticket.actions.get("openticket:create-ticket-permissions").workers.add([
|
||||||
|
new api.ODWorker("openticket:check-blacklist",4,(instance,params,source,cancel) => {
|
||||||
|
if (!params.option.get("openticket:allow-blacklisted-users").value && openticket.blacklist.exists(params.user.id)){
|
||||||
|
instance.valid = false
|
||||||
|
instance.reason = "blacklist"
|
||||||
|
openticket.log(params.user.displayName+" tried to create a ticket but is blacklisted!","info",[
|
||||||
|
{key:"user",value:params.user.username},
|
||||||
|
{key:"userid",value:params.user.id,hidden:true},
|
||||||
|
{key:"option",value:params.option.id.value}
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:check-cooldown",3,(instance,params,source,cancel) => {
|
||||||
|
const cooldown = openticket.cooldowns.get("openticket:option-cooldown_"+params.option.id.value)
|
||||||
|
if (cooldown && cooldown instanceof api.ODTimeoutCooldown && cooldown.use(params.user.id)){
|
||||||
|
instance.valid = false
|
||||||
|
instance.reason = "cooldown"
|
||||||
|
const remaining = cooldown.remaining(params.user.id) ?? 0
|
||||||
|
instance.cooldownUntil = new Date(new Date().getTime() + remaining)
|
||||||
|
|
||||||
|
openticket.log(params.user.displayName+" tried to create a ticket but is on cooldown!","info",[
|
||||||
|
{key:"user",value:params.user.username},
|
||||||
|
{key:"userid",value:params.user.id,hidden:true},
|
||||||
|
{key:"option",value:params.option.id.value},
|
||||||
|
{key:"remaining",value:(remaining/1000).toString()+"sec"}
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:check-global-limits",2,(instance,params,source,cancel) => {
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
if (!generalConfig.data.system.limits.enabled) return
|
||||||
|
|
||||||
|
const allTickets = openticket.tickets.getAll()
|
||||||
|
const globalTicketCount = allTickets.length
|
||||||
|
const userTickets = openticket.tickets.getFiltered((ticket) => ticket.exists("openticket:opened-by") && (ticket.get("openticket:opened-by").value == params.user.id))
|
||||||
|
const userTicketCount = userTickets.length
|
||||||
|
|
||||||
|
if (globalTicketCount >= generalConfig.data.system.limits.globalMaximum){
|
||||||
|
instance.valid = false
|
||||||
|
instance.reason = "global-limit"
|
||||||
|
openticket.log(params.user.displayName+" tried to create a ticket but reached the limit!","info",[
|
||||||
|
{key:"user",value:params.user.username},
|
||||||
|
{key:"userid",value:params.user.id,hidden:true},
|
||||||
|
{key:"option",value:params.option.id.value},
|
||||||
|
{key:"limit",value:"global"}
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}else if (userTicketCount >= generalConfig.data.system.limits.userMaximum){
|
||||||
|
instance.valid = false
|
||||||
|
instance.reason = "global-user-limit"
|
||||||
|
openticket.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
|
||||||
|
{key:"user",value:params.user.username},
|
||||||
|
{key:"userid",value:params.user.id,hidden:true},
|
||||||
|
{key:"option",value:params.option.id.value},
|
||||||
|
{key:"limit",value:"global-user"}
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:check-option-limits",1,(instance,params,source,cancel) => {
|
||||||
|
if (!params.option.exists("openticket:limits-enabled") || !params.option.get("openticket:limits-enabled").value) return
|
||||||
|
|
||||||
|
const allTickets = openticket.tickets.getFiltered((ticket) => ticket.option.id.value == params.option.id.value)
|
||||||
|
const globalTicketCount = allTickets.length
|
||||||
|
const userTickets = openticket.tickets.getFiltered((ticket) => ticket.option.id.value == params.option.id.value && ticket.exists("openticket:opened-by") && (ticket.get("openticket:opened-by").value == params.user.id))
|
||||||
|
const userTicketCount = userTickets.length
|
||||||
|
|
||||||
|
if (globalTicketCount >= params.option.get("openticket:limits-maximum-global").value){
|
||||||
|
instance.valid = false
|
||||||
|
instance.reason = "option-limit"
|
||||||
|
openticket.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
|
||||||
|
{key:"user",value:params.user.username},
|
||||||
|
{key:"userid",value:params.user.id,hidden:true},
|
||||||
|
{key:"option",value:params.option.id.value},
|
||||||
|
{key:"limit",value:"option"}
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}else if (userTicketCount >= params.option.get("openticket:limits-maximum-user").value){
|
||||||
|
instance.valid = false
|
||||||
|
instance.reason = "option-user-limit"
|
||||||
|
openticket.log(params.user.displayName+" tried to create a ticket, but reached the limit!","info",[
|
||||||
|
{key:"user",value:params.user.username},
|
||||||
|
{key:"userid",value:params.user.id,hidden:true},
|
||||||
|
{key:"option",value:params.option.id.value},
|
||||||
|
{key:"limit",value:"option-user"}
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:valid",0,(instance,params,source,cancel) => {
|
||||||
|
instance.valid = true
|
||||||
|
instance.reason = null
|
||||||
|
cancel()
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TRANSCRIPT CREATION SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const transcriptConfig = openticket.configs.get("openticket:transcripts")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:create-transcript"))
|
||||||
|
openticket.actions.get("openticket:create-transcript").workers.add([
|
||||||
|
new api.ODWorker("openticket:select-compiler",4,async (instance,params,source,cancel) => {
|
||||||
|
const {channel,user,ticket} = params
|
||||||
|
if (channel.type != discord.ChannelType.GuildText) return cancel()
|
||||||
|
if (!transcriptConfig.data.general.enabled) return cancel()
|
||||||
|
|
||||||
|
await openticket.events.get("onTranscriptCreate").emit([openticket.transcripts,ticket,channel,user])
|
||||||
|
|
||||||
|
instance.errorReason = null
|
||||||
|
const participants = await openticket.tickets.getAllTicketParticipants(params.ticket)
|
||||||
|
if (!participants){
|
||||||
|
instance.pendingMessage = null
|
||||||
|
instance.errorReason = "Unable to fetch ticket channel participants!"
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Unable to fetch ticket channel participants!")
|
||||||
|
}
|
||||||
|
instance.participants = participants
|
||||||
|
|
||||||
|
//select transcript compiler
|
||||||
|
if (transcriptConfig.data.general.mode == "text") instance.compiler = openticket.transcripts.get("openticket:text-compiler")
|
||||||
|
else if (transcriptConfig.data.general.mode == "html") instance.compiler = openticket.transcripts.get("openticket:html-compiler")
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:init-transcript",3,async (instance,params,source,cancel) => {
|
||||||
|
const {channel,user,ticket} = params
|
||||||
|
if (channel.type != discord.ChannelType.GuildText) return cancel()
|
||||||
|
if (!transcriptConfig.data.general.enabled) return cancel()
|
||||||
|
|
||||||
|
//run transcript compiler init()
|
||||||
|
await openticket.events.get("onTranscriptInit").emit([openticket.transcripts,ticket,channel,user])
|
||||||
|
if (instance.compiler.init){
|
||||||
|
try{
|
||||||
|
const result = await instance.compiler.init(ticket,channel,user)
|
||||||
|
if (result.success && result.pendingMessage && transcriptConfig.data.general.enableChannel){
|
||||||
|
//send init message to channel
|
||||||
|
const post = openticket.posts.get("openticket:transcripts")
|
||||||
|
if (post){
|
||||||
|
instance.pendingMessage = await post.send(result.pendingMessage)
|
||||||
|
}
|
||||||
|
}else if (!result.success){
|
||||||
|
instance.pendingMessage = null
|
||||||
|
instance.errorReason = result.errorReason
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Init Error => "+result.errorReason)
|
||||||
|
}else instance.pendingMessage = null
|
||||||
|
}catch(err){
|
||||||
|
instance.success = false
|
||||||
|
cancel()
|
||||||
|
process.emit("uncaughtException",err)
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler init()! (see error above)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await openticket.events.get("afterTranscriptInitiated").emit([openticket.transcripts,ticket,channel,user])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:compile-transcript",2,async (instance,params,source,cancel) => {
|
||||||
|
const {channel,user,ticket} = params
|
||||||
|
if (channel.type != discord.ChannelType.GuildText) return cancel()
|
||||||
|
if (!instance.compiler){
|
||||||
|
instance.success = false
|
||||||
|
cancel()
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:compile-transcript) => Instance is missing transcript compiler!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//run transcript compiler compile()
|
||||||
|
await openticket.events.get("onTranscriptCompile").emit([openticket.transcripts,ticket,channel,user])
|
||||||
|
if (instance.compiler.compile){
|
||||||
|
try{
|
||||||
|
const result = await instance.compiler.compile(ticket,channel,user)
|
||||||
|
if (!result.success){
|
||||||
|
instance.errorReason = result.errorReason
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Known Compiler Error => "+result.errorReason)
|
||||||
|
}else{
|
||||||
|
instance.result = result
|
||||||
|
instance.success = true
|
||||||
|
}
|
||||||
|
}catch(err){
|
||||||
|
instance.success = false
|
||||||
|
cancel()
|
||||||
|
process.emit("uncaughtException",err)
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler compile()! (see error above)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await openticket.events.get("afterTranscriptCompiled").emit([openticket.transcripts,ticket,channel,user])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:ready-transcript",1,async (instance,params,source,cancel) => {
|
||||||
|
if (!instance.result){
|
||||||
|
instance.success = false
|
||||||
|
cancel()
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript):ODWorker(ot:ready-transcript) => Instance is missing transcript result!")
|
||||||
|
}
|
||||||
|
|
||||||
|
//run transcript compiler ready()
|
||||||
|
utilities.runAsync(async () => {
|
||||||
|
await openticket.events.get("onTranscriptReady").emit([openticket.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
|
||||||
|
if (instance.compiler.ready){
|
||||||
|
try{
|
||||||
|
const {channelMessage,creatorDmMessage,participantDmMessage,activeAdminDmMessage,everyAdminDmMessage} = await instance.compiler.ready(instance.result)
|
||||||
|
|
||||||
|
//send channel message
|
||||||
|
if (transcriptConfig.data.general.enableChannel && channelMessage){
|
||||||
|
if (instance.pendingMessage && instance.pendingMessage.message && instance.pendingMessage.success){
|
||||||
|
//edit "pending" message to be the "ready" message
|
||||||
|
instance.pendingMessage.message.edit(channelMessage.message)
|
||||||
|
}else{
|
||||||
|
//send ready message to channel
|
||||||
|
const post = openticket.posts.get("openticket:transcripts")
|
||||||
|
if (post) await post.send(channelMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//send dm mesages
|
||||||
|
if (instance.participants){
|
||||||
|
for (const p of instance.participants){
|
||||||
|
if (p.role == "creator" && transcriptConfig.data.general.enableCreatorDM && creatorDmMessage){
|
||||||
|
//send creator dm message
|
||||||
|
await openticket.client.sendUserDm(p.user,creatorDmMessage)
|
||||||
|
}else if (p.role == "participant" && transcriptConfig.data.general.enableParticipantDM && participantDmMessage){
|
||||||
|
//send participant dm message
|
||||||
|
await openticket.client.sendUserDm(p.user,participantDmMessage)
|
||||||
|
}else if (p.role == "admin" && transcriptConfig.data.general.enableActiveAdminDM && instance.result.success && instance.result.messages && instance.result.messages.some((msg) => msg.author.id == p.user.id) && activeAdminDmMessage){
|
||||||
|
//send active admin dm message
|
||||||
|
await openticket.client.sendUserDm(p.user,activeAdminDmMessage)
|
||||||
|
}else if (p.role == "admin" && transcriptConfig.data.general.enableEveryAdminDM && everyAdminDmMessage){
|
||||||
|
//send every admin dm message
|
||||||
|
await openticket.client.sendUserDm(p.user,everyAdminDmMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch(err){
|
||||||
|
instance.success = false
|
||||||
|
cancel()
|
||||||
|
process.emit("uncaughtException",err)
|
||||||
|
throw new api.ODSystemError("ODAction(ot:create-transcript) => Failed transcript compiler ready()! (see error above)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await openticket.events.get("afterTranscriptReady").emit([openticket.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
|
||||||
|
})
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:transcripts-created",1,"increase")
|
||||||
|
await openticket.events.get("afterTranscriptCreated").emit([openticket.transcripts,instance.result.ticket,instance.result.channel,instance.result.user])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {user,channel,ticket} = params
|
||||||
|
openticket.log(user.displayName+" created a transcript!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"option",value:ticket.option.id.value},
|
||||||
|
{key:"method",value:source,hidden:true},
|
||||||
|
{key:"compiler",value:instance.compiler.id.value},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,463 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET DELETION SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:delete-ticket"))
|
||||||
|
openticket.actions.get("openticket:delete-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:delete-ticket",3,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to delete ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketDelete").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket deletion!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:delete-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
|
||||||
|
//create transcript
|
||||||
|
if (!params.withoutTranscript){
|
||||||
|
const transcriptRes = await openticket.actions.get("openticket:create-transcript").run(source,{guild,channel,user,ticket})
|
||||||
|
if (typeof transcriptRes.success == "boolean" && !transcriptRes.success && transcriptRes.compiler){
|
||||||
|
const {compiler} = transcriptRes
|
||||||
|
await channel.send((await openticket.builders.messages.getSafe("openticket:transcript-error").build(source,{guild,channel,user,ticket,compiler,reason:transcriptRes.errorReason ?? null})).message)
|
||||||
|
|
||||||
|
//undo deletion
|
||||||
|
ticket.get("openticket:for-deletion").value = false
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
openticket.log("Canceled ticket deletion because of transcript system malfunction!","warning",[
|
||||||
|
{key:"compiler",value:compiler.id.value},
|
||||||
|
{key:"reason",value:transcriptRes.errorReason ?? "/"},
|
||||||
|
])
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-deleted",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-deleted",user.id,1,"increase")
|
||||||
|
|
||||||
|
//delete ticket from manager
|
||||||
|
openticket.tickets.remove(ticket.id)
|
||||||
|
|
||||||
|
//delete permissions from manager
|
||||||
|
await (await import("../data/framework/permissionLoader.ts")).removeTicketPermissions(ticket)
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",2,async (instance,params,source,cancel) => {
|
||||||
|
//logs before channel deletion => channel might still be used in log embeds
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.deleting.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"delete",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.deleting.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"delete",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-channel",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
//delete channel & events
|
||||||
|
await openticket.events.get("onTicketChannelDeletion").emit([ticket,channel,user])
|
||||||
|
await channel.delete("Ticket Deleted")
|
||||||
|
await openticket.events.get("afterTicketChannelDeleted").emit([ticket,user])
|
||||||
|
|
||||||
|
//delete permissions from manager
|
||||||
|
await (await import("../data/framework/permissionLoader.ts")).removeTicketPermissions(ticket)
|
||||||
|
|
||||||
|
await openticket.events.get("afterTicketDeleted").emit([ticket,user,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" deleted a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"transcript",value:(!params.withoutTranscript).toString()},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:delete-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
params.ticket.get("openticket:for-deletion").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//DELETE TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start deleting ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//delete with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//delete without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true,withoutTranscript:(params.data == "no-transcript")})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//DELETE TICKET CLOSE MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-close-message",openticket.builders.messages.getSafe("openticket:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-close-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start deleting ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//delete with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("close-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//delete without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("close-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-close-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-close-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//DELETE TICKET REOPEN MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-reopen-message",openticket.builders.messages.getSafe("openticket:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-reopen-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start deleting ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//delete with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("reopen-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//delete without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run("reopen-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("reopen-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-reopen-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-reopen-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//DELETE TICKET AUTOCLOSE MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:delete-ticket-autoclose-message",openticket.builders.messages.getSafe("openticket:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-autoclose-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start deleting ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//delete with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:delete-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//delete without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false,withoutTranscript:(params.data == "no-transcript")})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:delete-ticket-autoclose-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-autoclose-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:autoclose-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TRANSCRIPT ERROR SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//TRANSCRIPT ERROR RETRY
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:transcript-error-retry",/^od:transcript-error-retry_([^_]+)/))
|
||||||
|
openticket.responders.buttons.get("openticket:transcript-error-retry").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "slash" && originalSource != "text" && originalSource != "ticket-message" && originalSource != "reopen-message" && originalSource != "close-message" && originalSource != "other") return
|
||||||
|
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start deleting ticket (without reason)
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason:"Transcript Error (Retried)",sendMessage:false,withoutTranscript:false})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason:"Transcript Error (Retried)"}))
|
||||||
|
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,async (instance,params,source,cancel) => {
|
||||||
|
const {user,channel} = instance
|
||||||
|
if (channel.isDMBased()) return
|
||||||
|
openticket.log(user.displayName+" retried deleting a ticket with transcript!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//TRANSCRIPT ERROR CONTINUE
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:transcript-error-continue",/^od:transcript-error-continue_([^_]+)/))
|
||||||
|
openticket.responders.buttons.get("openticket:transcript-error-continue").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "slash" && originalSource != "text" && originalSource != "ticket-message" && originalSource != "reopen-message" && originalSource != "close-message" && originalSource != "other") return
|
||||||
|
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start deleting ticket (without reason)
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason:"Transcript Error (Continued)",sendMessage:false,withoutTranscript:true})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason:"Transcript Error (Continued)"}))
|
||||||
|
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,async (instance,params,source,cancel) => {
|
||||||
|
const {user,channel} = instance
|
||||||
|
if (channel.isDMBased()) return
|
||||||
|
openticket.log(user.displayName+" continued deleting a ticket without transcript!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//VERIFYBAR SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//VERIFYBAR SUCCESS
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:verifybar-success",/^od:verifybar-success_([^_]+)/))
|
||||||
|
openticket.responders.buttons.get("openticket:verifybar-success").workers.add(
|
||||||
|
new api.ODWorker("openticket:handle-verifybar",0,async (instance,params,source,cancel) => {
|
||||||
|
const id = instance.interaction.customId.split("_")[1]
|
||||||
|
const customData = instance.interaction.customId.split("_")[2] as string|undefined
|
||||||
|
|
||||||
|
const verifybar = openticket.verifybars.get(id)
|
||||||
|
if (!verifybar) return
|
||||||
|
if (verifybar.success) await verifybar.success.executeWorkers(instance,"verifybar",{data:customData ?? null,verifybarMessage:instance.message})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//VERIFYBAR FAILURE
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:verifybar-failure",/^od:verifybar-failure_([^_]+)/))
|
||||||
|
openticket.responders.buttons.get("openticket:verifybar-failure").workers.add(
|
||||||
|
new api.ODWorker("openticket:handle-verifybar",0,async (instance,params,source,cancel) => {
|
||||||
|
const id = instance.interaction.customId.split("_")[1]
|
||||||
|
const customData = instance.interaction.customId.split("_")[2] as string|undefined
|
||||||
|
|
||||||
|
const verifybar = openticket.verifybars.get(id)
|
||||||
|
if (!verifybar) return
|
||||||
|
if (verifybar.failure) await verifybar.failure.executeWorkers(instance,"verifybar",{data:customData ?? null,verifybarMessage:instance.message})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,220 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET MOVING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:move-ticket"))
|
||||||
|
openticket.actions.get("openticket:move-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:move-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to move ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketMove").emit([ticket,user,channel,reason])
|
||||||
|
ticket.option = data
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-moved",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-moved",user.id,1,"increase")
|
||||||
|
|
||||||
|
//get new channel properties
|
||||||
|
const channelPrefix = ticket.option.get("openticket:channel-prefix").value
|
||||||
|
const channelSuffix = ticket.get("openticket:channel-suffix").value
|
||||||
|
const channelCategory = ticket.option.get("openticket:channel-category").value
|
||||||
|
const channelBackupCategory = ticket.option.get("openticket:channel-category-backup").value
|
||||||
|
const rawClaimCategory = ticket.option.get("openticket:channel-categories-claimed").value.find((c) => c.user == user.id)
|
||||||
|
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
|
||||||
|
const closeCategory = ticket.option.get("openticket:channel-category-closed").value
|
||||||
|
const channelDescription = ticket.option.get("openticket:channel-description").value
|
||||||
|
const channelName = channelPrefix+channelSuffix
|
||||||
|
|
||||||
|
//handle category
|
||||||
|
let category: string|null = null
|
||||||
|
let categoryMode: "backup"|"normal"|"closed"|"claimed"|null = null
|
||||||
|
if (claimCategory){
|
||||||
|
//use claim category
|
||||||
|
category = claimCategory
|
||||||
|
categoryMode = "claimed"
|
||||||
|
}else if (closeCategory != "" && ticket.get("openticket:closed").value){
|
||||||
|
//use close category
|
||||||
|
category = closeCategory
|
||||||
|
categoryMode = "closed"
|
||||||
|
}else if (channelCategory != ""){
|
||||||
|
//category enabled
|
||||||
|
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
|
||||||
|
if (!normalCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Move Error: Unable to find category! #1","error",[
|
||||||
|
{key:"categoryid",value:channelCategory},
|
||||||
|
{key:"backup",value:"false"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
//default category was found
|
||||||
|
if (normalCategory.children.cache.size >= 50 && channelBackupCategory != ""){
|
||||||
|
//use backup category
|
||||||
|
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
|
||||||
|
if (!backupCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Move Error: Unable to find category! #2","error",[
|
||||||
|
{key:"categoryid",value:channelBackupCategory},
|
||||||
|
{key:"backup",value:"true"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
category = backupCategory.id
|
||||||
|
categoryMode = "backup"
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//use default category
|
||||||
|
category = normalCategory.id
|
||||||
|
categoryMode = "normal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
//only move category when not the same.
|
||||||
|
if (channel.parentId != category) await utilities.timedAwait(channel.setParent(category,{lockPermissions:false}),2500,(err) => {
|
||||||
|
openticket.log("Failed to change channel category on ticket move","error")
|
||||||
|
})
|
||||||
|
ticket.get("openticket:category-mode").value = categoryMode
|
||||||
|
ticket.get("openticket:category").value = category
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to move ticket to 'moved category'!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"categoryid",value:category ?? "/"}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
|
||||||
|
//handle permissions
|
||||||
|
const permissions: discord.OverwriteResolvable[] = [{
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:guild.roles.everyone.id,
|
||||||
|
allow:[],
|
||||||
|
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
|
||||||
|
}]
|
||||||
|
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
|
||||||
|
const optionAdmins = ticket.option.get("openticket:admins").value
|
||||||
|
const readonlyAdmins = ticket.option.get("openticket:admins-readonly").value
|
||||||
|
|
||||||
|
globalAdmins.forEach((admin) => {
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
optionAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
readonlyAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
if (optionAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","ReadMessageHistory"],
|
||||||
|
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
//transfer all old user-participants over to the new ticket (creator & participants)
|
||||||
|
ticket.get("openticket:participants").value.forEach((p) => {
|
||||||
|
if (p.type == "user") permissions.push({
|
||||||
|
type:discord.OverwriteType.Member,
|
||||||
|
id:p.id,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
try{
|
||||||
|
await channel.permissionOverwrites.set(permissions)
|
||||||
|
}catch{
|
||||||
|
openticket.log("Failed to reset channel permissions on ticket move!","error")
|
||||||
|
}
|
||||||
|
|
||||||
|
//handle participants
|
||||||
|
const participants: {type:"role"|"user",id:string}[] = []
|
||||||
|
permissions.forEach((permission,index) => {
|
||||||
|
if (index == 0) return //don't include @everyone
|
||||||
|
const type = (permission.type == discord.OverwriteType.Role) ? "role" : "user"
|
||||||
|
const id = permission.id as string
|
||||||
|
participants.push({type,id})
|
||||||
|
})
|
||||||
|
ticket.get("openticket:participants").value = participants
|
||||||
|
ticket.get("openticket:participants").refreshDatabase()
|
||||||
|
|
||||||
|
//rename channel (and give error when crashed)
|
||||||
|
const originalName = channel.name
|
||||||
|
try{
|
||||||
|
await utilities.timedAwait(channel.setName(channelName),2500,(err) => {
|
||||||
|
openticket.log("Failed to rename channel on ticket move","error")
|
||||||
|
})
|
||||||
|
}catch(err){
|
||||||
|
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:channelName})).message)
|
||||||
|
}
|
||||||
|
try{
|
||||||
|
if (channel.type == discord.ChannelType.GuildText) channel.setTopic(channelDescription)
|
||||||
|
}catch{}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket renaming!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:move-message").build(source,{guild,channel,user,ticket,reason,data})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketMoved").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.moving.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"move",reason,additionalData:data}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.moving.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"move",reason,additionalData:data}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" moved a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:move-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,274 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET PINNING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:pin-ticket"))
|
||||||
|
openticket.actions.get("openticket:pin-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:pin-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to pin ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketPin").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:pinned").value = true
|
||||||
|
ticket.get("openticket:pinned-by").value = user.id
|
||||||
|
ticket.get("openticket:pinned-on").value = new Date().getTime()
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-pinned",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-pinned",user.id,1,"increase")
|
||||||
|
|
||||||
|
//move to top of category
|
||||||
|
if (channel.parent){
|
||||||
|
await channel.setPosition(0,{reason:"Ticket Pinned!"})
|
||||||
|
}
|
||||||
|
|
||||||
|
//rename channel (and give error when crashed)
|
||||||
|
const originalName = channel.name
|
||||||
|
const newName = "📌"+channel.name
|
||||||
|
try{
|
||||||
|
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
|
||||||
|
openticket.log("Failed to rename channel on ticket pin","error")
|
||||||
|
})
|
||||||
|
}catch(err){
|
||||||
|
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-pin",{guild,channel,user,originalName,newName})).message)
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket pinning!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"message",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:pin-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketPinned").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.pinning.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"pin",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.pinning.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"pin",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" pinned a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//PIN TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:pin-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:pin-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.pin
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already pinned
|
||||||
|
if (ticket.get("openticket:pinned").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start pinning ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//pin with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:pin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//pin without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:pin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:pin-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//PIN TICKET UNPIN MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:pin-ticket-unpin-message",openticket.builders.messages.getSafe("openticket:verifybar-unpin-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:pin-ticket-unpin-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.pin
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already pinned
|
||||||
|
if (ticket.get("openticket:pinned").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start pinning ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//pin with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:pin-ticket-reason").build("unpin-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//pin without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:pin-ticket").run("unpin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:pin-message").build("unpin-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:pin-ticket-unpin-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-unpin-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:unpin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:pin-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//REACTION ROLE SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:reaction-role"))
|
||||||
|
openticket.actions.get("openticket:reaction-role").workers.add([
|
||||||
|
new api.ODWorker("openticket:reaction-role",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,user,option,overwriteMode} = params
|
||||||
|
const role = openticket.roles.get(option.id)
|
||||||
|
if (!role) throw new api.ODSystemError("ODAction(ot:reaction-role) => Unknown reaction role (ODRole)")
|
||||||
|
instance.role = role
|
||||||
|
const mode = (overwriteMode) ? overwriteMode : role.get("openticket:mode").value
|
||||||
|
|
||||||
|
await openticket.events.get("onRoleUpdate").emit([user,role])
|
||||||
|
|
||||||
|
//get guild member
|
||||||
|
const member = await openticket.client.fetchGuildMember(guild,user.id)
|
||||||
|
if (!member) throw new api.ODSystemError("ODAction(ot:reaction-role) => User isn't a member of the server!")
|
||||||
|
|
||||||
|
//get all roles
|
||||||
|
const roleIds = role.get("openticket:roles").value
|
||||||
|
const roles: discord.Role[] = []
|
||||||
|
for (const id of roleIds){
|
||||||
|
const r = await openticket.client.fetchGuildRole(guild,id)
|
||||||
|
if (r) roles.push(r)
|
||||||
|
else openticket.log("Unable to find role in server!","warning",[
|
||||||
|
{key:"roleid",value:id}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
//update roles of user
|
||||||
|
const result: api.OTRoleUpdateResult[] = []
|
||||||
|
for (const r of roles){
|
||||||
|
try{
|
||||||
|
if (r.members.has(user.id) && (mode == "add&remove" || mode == "remove")){
|
||||||
|
//user has role (remove)
|
||||||
|
await member.roles.remove(r)
|
||||||
|
result.push({role:r,action:"removed"})
|
||||||
|
}else if (!r.members.has(user.id) && (mode == "add&remove" || mode == "add")){
|
||||||
|
//user doesn't have role (add)
|
||||||
|
await member.roles.add(r)
|
||||||
|
result.push({role:r,action:"added"})
|
||||||
|
}else{
|
||||||
|
//don't do anything
|
||||||
|
result.push({role:r,action:null})
|
||||||
|
}
|
||||||
|
}catch{
|
||||||
|
result.push({role:r,action:null})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//get roles to remove on add
|
||||||
|
if (result.find((r) => r.action == "added")){
|
||||||
|
//get all remove roles
|
||||||
|
const removeRoleIds = role.get("openticket:remove-roles-on-add").value
|
||||||
|
const removeRoles: discord.Role[] = []
|
||||||
|
for (const id of removeRoleIds){
|
||||||
|
const r = await openticket.client.fetchGuildRole(guild,id)
|
||||||
|
if (r) removeRoles.push(r)
|
||||||
|
else openticket.log("Unable to find role in server!","warning",[
|
||||||
|
{key:"roleid",value:id}
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
//remove roles from user
|
||||||
|
for (const r of removeRoles){
|
||||||
|
try{
|
||||||
|
if (r.members.has(user.id)){
|
||||||
|
//user has role (remove)
|
||||||
|
await member.roles.remove(r)
|
||||||
|
result.push({role:r,action:"removed"})
|
||||||
|
}
|
||||||
|
}catch{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update instance & finish event
|
||||||
|
instance.result = result
|
||||||
|
await openticket.events.get("afterRolesUpdated").emit([user,role])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,user,option} = params
|
||||||
|
openticket.log(user.displayName+" updated his roles!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"option",value:option.id.value}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET REMOVE USER SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:remove-ticket-user"))
|
||||||
|
openticket.actions.get("openticket:remove-ticket-user").workers.add([
|
||||||
|
new api.ODWorker("openticket:remove-ticket-user",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to remove user from ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketUserRemove").emit([ticket,user,data,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
const index = ticket.get("openticket:participants").value.findIndex((p) => p.type == "user" && p.id == data.id)
|
||||||
|
if (index < 0) return cancel()
|
||||||
|
ticket.get("openticket:participants").value.splice(index,1)
|
||||||
|
ticket.get("openticket:participants").refreshDatabase()
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update channel permissions
|
||||||
|
try{
|
||||||
|
await channel.permissionOverwrites.delete(data)
|
||||||
|
}catch{
|
||||||
|
openticket.log("Failed to remove channel permission overwrites on remove-ticket-user","error")
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket user removal!","error",[
|
||||||
|
{key:"channel",value:channel.id},
|
||||||
|
{key:"message",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:remove-message").build(source,{guild,channel,user,ticket,reason,data})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketUserRemoved").emit([ticket,user,data,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.removing.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"remove",reason,additionalData:data}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.removing.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"remove",reason,additionalData:data}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,data} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" removed "+data.displayName+" from a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:remove-ticket-user").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET RENAMING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:rename-ticket"))
|
||||||
|
openticket.actions.get("openticket:rename-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:rename-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to rename ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketRename").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//rename channel (and give error when crashed)
|
||||||
|
const originalName = channel.name
|
||||||
|
try{
|
||||||
|
await utilities.timedAwait(channel.setName(data),2500,(err) => {
|
||||||
|
openticket.log("Failed to rename channel on ticket rename","error")
|
||||||
|
})
|
||||||
|
}catch(err){
|
||||||
|
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-rename",{guild,channel,user,originalName,newName:data})).message)
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket renaming!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:rename-message").build(source,{guild,channel,user,ticket,reason,data})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketRenamed").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason,data} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.renaming.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"rename",reason,additionalData:data}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.renaming.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"rename",reason,additionalData:data}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" renamed a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:rename-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,448 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET REOPENING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:reopen-ticket"))
|
||||||
|
openticket.actions.get("openticket:reopen-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:reopen-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to reopen ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketReopen").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:closed").value = false
|
||||||
|
ticket.get("openticket:open").value = true
|
||||||
|
ticket.get("openticket:autoclosed").value = false
|
||||||
|
ticket.get("openticket:closed-by").value = null
|
||||||
|
ticket.get("openticket:closed-on").value = null
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:tickets-reopened",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:tickets-reopened",user.id,1,"increase")
|
||||||
|
|
||||||
|
//update category
|
||||||
|
const channelCategory = ticket.option.get("openticket:channel-category").value
|
||||||
|
const channelBackupCategory = ticket.option.get("openticket:channel-category-backup").value
|
||||||
|
if (channelCategory !== ""){
|
||||||
|
//category enabled
|
||||||
|
try {
|
||||||
|
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
|
||||||
|
if (!normalCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Reopening Error: Unable to find category! #1","error",[
|
||||||
|
{key:"categoryid",value:channelCategory},
|
||||||
|
{key:"backup",value:"false"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
//default category was found
|
||||||
|
if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
|
||||||
|
//use backup category
|
||||||
|
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
|
||||||
|
if (!backupCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Reopening Error: Unable to find category! #2","error",[
|
||||||
|
{key:"categoryid",value:channelBackupCategory},
|
||||||
|
{key:"backup",value:"true"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
//use backup category
|
||||||
|
channel.setParent(backupCategory,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = "backup"
|
||||||
|
ticket.get("openticket:category").value = backupCategory.id
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//use default category
|
||||||
|
channel.setParent(normalCategory,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = "normal"
|
||||||
|
ticket.get("openticket:category").value = normalCategory.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to move ticket to 'reopened category'!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
channel.setParent(null,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = null
|
||||||
|
ticket.get("openticket:category").value = null
|
||||||
|
}
|
||||||
|
|
||||||
|
//update permissions
|
||||||
|
const permissions: discord.OverwriteResolvable[] = [{
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:guild.roles.everyone.id,
|
||||||
|
allow:[],
|
||||||
|
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
|
||||||
|
}]
|
||||||
|
const globalAdmins = openticket.configs.get("openticket:general").data.globalAdmins
|
||||||
|
const optionAdmins = ticket.option.get("openticket:admins").value
|
||||||
|
const readonlyAdmins = ticket.option.get("openticket:admins-readonly").value
|
||||||
|
|
||||||
|
globalAdmins.forEach((admin) => {
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
optionAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
readonlyAdmins.forEach((admin) => {
|
||||||
|
if (globalAdmins.includes(admin)) return
|
||||||
|
if (optionAdmins.includes(admin)) return
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Role,
|
||||||
|
id:admin,
|
||||||
|
allow:["ViewChannel","ReadMessageHistory"],
|
||||||
|
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
|
||||||
|
})
|
||||||
|
})
|
||||||
|
ticket.get("openticket:participants").value.forEach((participant) => {
|
||||||
|
//all participants that aren't roles/admins
|
||||||
|
if (participant.type == "user"){
|
||||||
|
permissions.push({
|
||||||
|
type:discord.OverwriteType.Member,
|
||||||
|
id:user.id,
|
||||||
|
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory"],
|
||||||
|
deny:[]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
channel.permissionOverwrites.set(permissions)
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket reopening!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:reopen-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketReopened").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.reopening.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"reopen",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.reopening.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"reopen",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" reopened a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//REOPEN TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:reopen-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not closed
|
||||||
|
if (!ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start reopening ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//reopen with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:reopen-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//reopen without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:reopen-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//REOPEN TICKET CLOSE MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-close-message",openticket.builders.messages.getSafe("openticket:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:reopen-ticket-close-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not closed
|
||||||
|
if (!ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start reopening ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//reopen with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:reopen-ticket-reason").build("close-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//reopen without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run("close-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("close-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:reopen-ticket-close-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-close-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//REOPEN TICKET AUTOCLOSE MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:reopen-ticket-autoclose-message",openticket.builders.messages.getSafe("openticket:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:reopen-ticket-autoclose-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not closed
|
||||||
|
if (!ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start reopening ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//reopen with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:reopen-ticket-reason").build("autoclose-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//reopen without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run("autoclose-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("autoclose-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:reopen-ticket-autoclose-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-autoclose-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:autoclose-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:reopen-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,305 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET UNCLAIMING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:unclaim-ticket"))
|
||||||
|
openticket.actions.get("openticket:unclaim-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to unclaim ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketUnclaim").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:claimed").value = false
|
||||||
|
ticket.get("openticket:claimed-by").value = null
|
||||||
|
ticket.get("openticket:claimed-on").value = null
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//update category
|
||||||
|
const channelCategory = ticket.option.get("openticket:channel-category").value
|
||||||
|
const channelBackupCategory = ticket.option.get("openticket:channel-category-backup").value
|
||||||
|
if (channelCategory !== ""){
|
||||||
|
//category enabled
|
||||||
|
try {
|
||||||
|
const normalCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelCategory)
|
||||||
|
if (!normalCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Unclaiming Error: Unable to find category! #1","error",[
|
||||||
|
{key:"categoryid",value:channelCategory},
|
||||||
|
{key:"backup",value:"false"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
//default category was found
|
||||||
|
if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
|
||||||
|
//use backup category
|
||||||
|
const backupCategory = await openticket.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
|
||||||
|
if (!backupCategory){
|
||||||
|
//default category was not found
|
||||||
|
openticket.log("Ticket Unclaiming Error: Unable to find category! #2","error",[
|
||||||
|
{key:"categoryid",value:channelBackupCategory},
|
||||||
|
{key:"backup",value:"true"}
|
||||||
|
])
|
||||||
|
}else{
|
||||||
|
//use backup category
|
||||||
|
channel.setParent(backupCategory,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = "backup"
|
||||||
|
ticket.get("openticket:category").value = backupCategory.id
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//use default category
|
||||||
|
channel.setParent(normalCategory,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = "normal"
|
||||||
|
ticket.get("openticket:category").value = normalCategory.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to move ticket to 'unclaimed category'!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
channel.setParent(null,{lockPermissions:false})
|
||||||
|
ticket.get("openticket:category-mode").value = null
|
||||||
|
ticket.get("openticket:category").value = null
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket unclaiming!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:unclaim-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketUnclaimed").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.claiming.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"unclaim",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.claiming.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"unclaim",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" unclaimed a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//UNCLAIM TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:unclaim-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:unclaim-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.unclaim
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not claimed
|
||||||
|
if (!ticket.get("openticket:claimed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start unclaiming ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//unclaim with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:unclaim-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//unclaim without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unclaim-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:unclaim-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//UNCLAIM TICKET CLAIM MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:unclaim-ticket-claim-message",openticket.builders.messages.getSafe("openticket:verifybar-claim-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:unclaim-ticket-claim-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.unclaim
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not claimed
|
||||||
|
if (!ticket.get("openticket:claimed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start unclaiming ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//unclaim with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:unclaim-ticket-reason").build("claim-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//unclaim without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unclaim-ticket").run("claim-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:unclaim-message").build("claim-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:unclaim-ticket-claim-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-claim-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:claim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:unclaim-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,267 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET UNPINNING SYSTEM
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerActions = async () => {
|
||||||
|
openticket.actions.add(new api.ODAction("openticket:unpin-ticket"))
|
||||||
|
openticket.actions.get("openticket:unpin-ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:unpin-ticket",2,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
if (channel.isThread()) throw new api.ODSystemError("Unable to unpin ticket! Open Ticket doesn't support threads!")
|
||||||
|
|
||||||
|
await openticket.events.get("onTicketUnpin").emit([ticket,user,channel,reason])
|
||||||
|
|
||||||
|
//update ticket
|
||||||
|
ticket.get("openticket:pinned").value = false
|
||||||
|
ticket.get("openticket:pinned-by").value = null
|
||||||
|
ticket.get("openticket:pinned-on").value = null
|
||||||
|
ticket.get("openticket:busy").value = true
|
||||||
|
|
||||||
|
//rename channel (and give error when crashed)
|
||||||
|
const originalName = channel.name
|
||||||
|
if (originalName.startsWith("📌")){
|
||||||
|
const newName = originalName.replace("📌","");
|
||||||
|
try{
|
||||||
|
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
|
||||||
|
openticket.log("Failed to rename channel on ticket unpin","error")
|
||||||
|
})
|
||||||
|
}catch(err){
|
||||||
|
await channel.send((await openticket.builders.messages.getSafe("openticket:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//update ticket message
|
||||||
|
const ticketMessage = await openticket.tickets.getTicketMessage(ticket)
|
||||||
|
if (ticketMessage){
|
||||||
|
try{
|
||||||
|
ticketMessage.edit((await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket})).message)
|
||||||
|
}catch(e){
|
||||||
|
openticket.log("Unable to edit ticket message on ticket unpinning!","error",[
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"messageid",value:ticketMessage.id},
|
||||||
|
{key:"option",value:ticket.option.id.value}
|
||||||
|
])
|
||||||
|
openticket.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with new message
|
||||||
|
if (params.sendMessage) await channel.send((await openticket.builders.messages.getSafe("openticket:unpin-message").build(source,{guild,channel,user,ticket,reason})).message)
|
||||||
|
ticket.get("openticket:busy").value = false
|
||||||
|
await openticket.events.get("afterTicketUnpinned").emit([ticket,user,channel,reason])
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket,reason} = params
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.pinning.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:ticket-action-logs").build(source,{guild,channel,user,ticket,mode:"unpin",reason,additionalData:null}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.pinning.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:ticket-action-dm").build(source,{guild,channel,user,ticket,mode:"unpin",reason,additionalData:null}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",0,(instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user,ticket} = params
|
||||||
|
|
||||||
|
openticket.log(user.displayName+" unpinned a ticket!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channel",value:"#"+channel.name},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"reason",value:params.reason ?? "/"},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerVerifyBars = async () => {
|
||||||
|
//UNPIN TICKET TICKET MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:unpin-ticket-ticket-message",openticket.builders.messages.getSafe("openticket:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:unpin-ticket-ticket-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.unpin
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not pinned
|
||||||
|
if (!ticket.get("openticket:pinned").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start unpining ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//unpin with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:unpin-ticket-reason").build("ticket-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//unpin without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unpin-ticket").run("ticket-message",{guild,channel,user,ticket,reason:null,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:unpin-ticket-ticket-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-ticket-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
//UNPIN TICKET PIN MESSAGE
|
||||||
|
openticket.verifybars.add(new api.ODVerifyBar("openticket:unpin-ticket-pin-message",openticket.builders.messages.getSafe("openticket:verifybar-pin-message"),!generalConfig.data.system.disableVerifyBars))
|
||||||
|
openticket.verifybars.get("openticket:unpin-ticket-pin-message").success.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.unpin
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not pinned
|
||||||
|
if (!ticket.get("openticket:pinned").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start unpinning ticket
|
||||||
|
if (params.data == "reason"){
|
||||||
|
//unpin with reason
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:unpin-ticket-reason").build("pin-message",{guild,channel,user,ticket}))
|
||||||
|
}else{
|
||||||
|
//unpin without reason
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unpin-ticket").run("pin-message",{guild,channel,user,ticket,reason:null,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:unpin-message").build("pin-message",{guild,channel,user,ticket,reason:null}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.verifybars.get("openticket:unpin-ticket-pin-message").failure.add([
|
||||||
|
new api.ODWorker("openticket:back-to-pin-message",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
const {verifybarMessage} = params
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawReason = (verifybarMessage && verifybarMessage.embeds[0] && verifybarMessage.embeds[0].fields[0]) ? verifybarMessage.embeds[0].fields[0].value : null
|
||||||
|
const reason = (rawReason == null) ? null : rawReason.substring(3,rawReason.length-3)
|
||||||
|
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:pin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
openticket.actions.get("openticket:unpin-ticket").workers.backupWorker = new api.ODWorker("openticket:cancel-busy",0,(instance,params) => {
|
||||||
|
//set busy to false in case of crash or cancel
|
||||||
|
params.ticket.get("openticket:busy").value = false
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -0,0 +1,351 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//BUTTON BUILDERS
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const buttons = openticket.builders.buttons
|
||||||
|
const lang = openticket.languages
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerAllButtons = async () => {
|
||||||
|
verifybarButtons()
|
||||||
|
errorButtons()
|
||||||
|
helpMenuButtons()
|
||||||
|
panelButtons()
|
||||||
|
ticketButtons()
|
||||||
|
transcriptButtons()
|
||||||
|
clearButtons()
|
||||||
|
}
|
||||||
|
|
||||||
|
const verifybarButtons = () => {
|
||||||
|
//VERIFYBAR SUCCESS
|
||||||
|
buttons.add(new api.ODButton("openticket:verifybar-success"))
|
||||||
|
buttons.get("openticket:verifybar-success").workers.add(
|
||||||
|
new api.ODWorker("openticket:verifybar-success",0,async (instance,params) => {
|
||||||
|
const {verifybar,customData,customColor,customLabel,customEmoji} = params
|
||||||
|
|
||||||
|
if (customData && customData.length > 40) throw new api.ODSystemError("ODButton:openticket:verifybar-success => customData exceeds 40 characters limit!")
|
||||||
|
|
||||||
|
const newData = (customData) ? "_"+customData : ""
|
||||||
|
const newColor = customColor ?? "gray"
|
||||||
|
const newLabel = customLabel ?? ""
|
||||||
|
const newEmoji = customEmoji ?? "✅"
|
||||||
|
|
||||||
|
instance.setCustomId("od:verifybar-success_"+verifybar.id.value+newData)
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor(newColor)
|
||||||
|
if (newLabel) instance.setLabel(newLabel)
|
||||||
|
if (newEmoji) instance.setEmoji(newEmoji)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//VERIFYBAR FAILURE
|
||||||
|
buttons.add(new api.ODButton("openticket:verifybar-failure"))
|
||||||
|
buttons.get("openticket:verifybar-failure").workers.add(
|
||||||
|
new api.ODWorker("openticket:verifybar-failure",0,async (instance,params) => {
|
||||||
|
const {verifybar,customData,customColor,customLabel,customEmoji} = params
|
||||||
|
|
||||||
|
if (customData && customData.length > 40) throw new api.ODSystemError("ODButton:openticket:verifybar-success => customData exceeds 40 characters limit!")
|
||||||
|
|
||||||
|
const newData = (customData) ? "_"+customData : ""
|
||||||
|
const newColor = customColor ?? "gray"
|
||||||
|
const newLabel = customLabel ?? ""
|
||||||
|
const newEmoji = customEmoji ?? "❌"
|
||||||
|
|
||||||
|
instance.setCustomId("od:verifybar-failure_"+verifybar.id.value+newData)
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor(newColor)
|
||||||
|
if (newLabel) instance.setLabel(newLabel)
|
||||||
|
if (newEmoji) instance.setEmoji(newEmoji)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const errorButtons = () => {
|
||||||
|
//ERROR TICKET DEPRECATED TRANSCRIPT
|
||||||
|
buttons.add(new api.ODButton("openticket:error-ticket-deprecated-transcript"))
|
||||||
|
buttons.get("openticket:error-ticket-deprecated-transcript").workers.add(
|
||||||
|
new api.ODWorker("openticket:error-ticket-deprecated-transcript",0,async (instance,params) => {
|
||||||
|
|
||||||
|
instance.setCustomId("od:error-ticket-deprecated-transcript")
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setLabel(lang.getTranslation("transcripts.errors.backup"))
|
||||||
|
instance.setEmoji("📄")
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const helpMenuButtons = () => {
|
||||||
|
//HELP MENU PAGE
|
||||||
|
buttons.add(new api.ODButton("openticket:help-menu-page"))
|
||||||
|
buttons.get("openticket:help-menu-page").workers.add(
|
||||||
|
new api.ODWorker("openticket:help-menu-page",0,async (instance,params) => {
|
||||||
|
const {mode,page} = params
|
||||||
|
const totalPages = (await openticket.helpmenu.render(mode)).length
|
||||||
|
const pageText = (page+1).toString()+"/"+totalPages.toString()
|
||||||
|
|
||||||
|
instance.setCustomId("od:help-menu-page_"+page.toString())
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setLabel(lang.getTranslationWithParams("actions.buttons.helpPage",[pageText]))
|
||||||
|
instance.setDisabled(true)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//HELP MENU SWITCH
|
||||||
|
buttons.add(new api.ODButton("openticket:help-menu-switch"))
|
||||||
|
buttons.get("openticket:help-menu-switch").workers.add(
|
||||||
|
new api.ODWorker("openticket:help-menu-switch",0,async (instance,params) => {
|
||||||
|
const {mode} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:help-menu-switch_"+mode)
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor("gray")
|
||||||
|
if (mode == "slash") instance.setLabel(lang.getTranslation("actions.buttons.helpSwitchText"))
|
||||||
|
else instance.setLabel(lang.getTranslation("actions.buttons.helpSwitchSlash"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//HELP MENU PREVIOUS
|
||||||
|
buttons.add(new api.ODButton("openticket:help-menu-previous"))
|
||||||
|
buttons.get("openticket:help-menu-previous").workers.add(
|
||||||
|
new api.ODWorker("openticket:help-menu-previous",0,async (instance,params) => {
|
||||||
|
const {page} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:help-menu-previous")
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setEmoji("◀️")
|
||||||
|
if (page == 0) instance.setDisabled(true)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//HELP MENU NEXT
|
||||||
|
buttons.add(new api.ODButton("openticket:help-menu-next"))
|
||||||
|
buttons.get("openticket:help-menu-next").workers.add(
|
||||||
|
new api.ODWorker("openticket:help-menu-next",0,async (instance,params) => {
|
||||||
|
const {mode,page} = params
|
||||||
|
const totalPages = (await openticket.helpmenu.render(mode)).length
|
||||||
|
|
||||||
|
instance.setCustomId("od:help-menu-next")
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setEmoji("▶️")
|
||||||
|
if (page == totalPages-1) instance.setDisabled(true)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const panelButtons = () => {
|
||||||
|
//TICKET OPTION
|
||||||
|
buttons.add(new api.ODButton("openticket:ticket-option"))
|
||||||
|
buttons.get("openticket:ticket-option").workers.add(
|
||||||
|
new api.ODWorker("openticket:ticket-option",0,async (instance,params) => {
|
||||||
|
const {panel,option} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:ticket-option_"+panel.id.value+"_"+option.id.value)
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor(option.get("openticket:button-color").value)
|
||||||
|
if (option.get("openticket:button-emoji").value) instance.setEmoji(option.get("openticket:button-emoji").value)
|
||||||
|
if (option.get("openticket:button-label").value) instance.setLabel(option.get("openticket:button-label").value)
|
||||||
|
if (!option.get("openticket:button-emoji").value && !option.get("openticket:button-label").value) instance.setLabel("<"+option.id.value+">")
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//WEBSITE OPTION
|
||||||
|
buttons.add(new api.ODButton("openticket:website-option"))
|
||||||
|
buttons.get("openticket:website-option").workers.add(
|
||||||
|
new api.ODWorker("openticket:website-option",0,async (instance,params) => {
|
||||||
|
const {panel,option} = params
|
||||||
|
|
||||||
|
instance.setMode("url")
|
||||||
|
instance.setUrl(option.get("openticket:url").value)
|
||||||
|
if (option.get("openticket:button-emoji").value) instance.setEmoji(option.get("openticket:button-emoji").value)
|
||||||
|
if (option.get("openticket:button-label").value) instance.setLabel(option.get("openticket:button-label").value)
|
||||||
|
if (!option.get("openticket:button-emoji").value && !option.get("openticket:button-label").value) instance.setLabel("<"+option.id.value+">")
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//ROLE OPTION
|
||||||
|
buttons.add(new api.ODButton("openticket:role-option"))
|
||||||
|
buttons.get("openticket:role-option").workers.add(
|
||||||
|
new api.ODWorker("openticket:role-option",0,async (instance,params) => {
|
||||||
|
const {panel,option} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:role-option_"+panel.id.value+"_"+option.id.value)
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setColor(option.get("openticket:button-color").value)
|
||||||
|
if (option.get("openticket:button-emoji").value) instance.setEmoji(option.get("openticket:button-emoji").value)
|
||||||
|
if (option.get("openticket:button-label").value) instance.setLabel(option.get("openticket:button-label").value)
|
||||||
|
if (!option.get("openticket:button-emoji").value && !option.get("openticket:button-label").value) instance.setLabel("<"+option.id.value+">")
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const ticketButtons = () => {
|
||||||
|
//VISIT TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:visit-ticket"))
|
||||||
|
buttons.get("openticket:visit-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:visit-ticket",0,async (instance,params) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("url")
|
||||||
|
instance.setUrl(channel.url)
|
||||||
|
instance.setEmoji("🎫")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.create"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//CLOSE TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:close-ticket"))
|
||||||
|
buttons.get("openticket:close-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:close-ticket_"+source)
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setEmoji("🔒")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.close"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//DELETE TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:delete-ticket"))
|
||||||
|
buttons.get("openticket:delete-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:delete-ticket_"+source)
|
||||||
|
instance.setColor("red")
|
||||||
|
instance.setEmoji("✖")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.delete"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//REOPEN TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:reopen-ticket"))
|
||||||
|
buttons.get("openticket:reopen-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:reopen-ticket_"+source)
|
||||||
|
instance.setColor("green")
|
||||||
|
instance.setEmoji("🔓")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.reopen"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//CLAIM TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:claim-ticket"))
|
||||||
|
buttons.get("openticket:claim-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:claim-ticket_"+source)
|
||||||
|
instance.setColor("green")
|
||||||
|
instance.setEmoji("👋")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.claim"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//UNCLAIM TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:unclaim-ticket"))
|
||||||
|
buttons.get("openticket:unclaim-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:unclaim-ticket_"+source)
|
||||||
|
instance.setColor("green")
|
||||||
|
instance.setEmoji("↩️")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.unclaim"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//PIN TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:pin-ticket"))
|
||||||
|
buttons.get("openticket:pin-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:pin-ticket_"+source)
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setEmoji("📌")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.pin"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//UNPIN TICKET
|
||||||
|
buttons.add(new api.ODButton("openticket:unpin-ticket"))
|
||||||
|
buttons.get("openticket:unpin-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,ticket} = params
|
||||||
|
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:unpin-ticket_"+source)
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setEmoji("📌")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.unpin"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const transcriptButtons = () => {
|
||||||
|
//TRANSCRIPT HTML VISIT
|
||||||
|
buttons.add(new api.ODButton("openticket:transcript-html-visit"))
|
||||||
|
buttons.get("openticket:transcript-html-visit").workers.add(
|
||||||
|
new api.ODWorker("openticket:transcript-html-visit",0,async (instance,params,source) => {
|
||||||
|
const {result} = params
|
||||||
|
instance.setMode("url")
|
||||||
|
if (result.data) instance.setUrl(result.data.url)
|
||||||
|
else throw new api.ODSystemError("ODButton:openticket:transcript-html-visit => Missing Transcript Result Data!")
|
||||||
|
instance.setEmoji("📄")
|
||||||
|
instance.setLabel(lang.getTranslation("transcripts.success.visit"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//TRANSCRIPT ERROR RETRY
|
||||||
|
buttons.add(new api.ODButton("openticket:transcript-error-retry"))
|
||||||
|
buttons.get("openticket:transcript-error-retry").workers.add(
|
||||||
|
new api.ODWorker("openticket:transcript-error-retry",0,async (instance,params,source) => {
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:transcript-error-retry_"+source)
|
||||||
|
instance.setColor("gray")
|
||||||
|
instance.setEmoji("🔄")
|
||||||
|
instance.setLabel(lang.getTranslation("transcripts.errors.retry"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//TRANSCRIPT ERROR CONTINUE
|
||||||
|
buttons.add(new api.ODButton("openticket:transcript-error-continue"))
|
||||||
|
buttons.get("openticket:transcript-error-continue").workers.add(
|
||||||
|
new api.ODWorker("openticket:transcript-error-continue",0,async (instance,params,source) => {
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:transcript-error-continue_"+source)
|
||||||
|
instance.setColor("red")
|
||||||
|
instance.setEmoji("✖")
|
||||||
|
instance.setLabel(lang.getTranslation("transcripts.errors.continue"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const clearButtons = () => {
|
||||||
|
//CLEAR CONTINUE
|
||||||
|
buttons.add(new api.ODButton("openticket:clear-continue"))
|
||||||
|
buttons.get("openticket:clear-continue").workers.add(
|
||||||
|
new api.ODWorker("openticket:clear-continue",0,async (instance,params,source) => {
|
||||||
|
instance.setMode("button")
|
||||||
|
instance.setCustomId("od:clear-continue_"+source+"_"+params.filter)
|
||||||
|
instance.setColor("red")
|
||||||
|
instance.setEmoji("✖")
|
||||||
|
instance.setLabel(lang.getTranslation("actions.buttons.clear"))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DROPDOWN BUILDERS
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const dropdowns = openticket.builders.dropdowns
|
||||||
|
|
||||||
|
export const registerAllDropdowns = async () => {
|
||||||
|
panelDropdowns()
|
||||||
|
}
|
||||||
|
|
||||||
|
const panelDropdowns = () => {
|
||||||
|
//TICKET OPTION
|
||||||
|
dropdowns.add(new api.ODDropdown("openticket:panel-dropdown-tickets"))
|
||||||
|
dropdowns.get("openticket:panel-dropdown-tickets").workers.add(
|
||||||
|
new api.ODWorker("openticket:panel-dropdown-tickets",0,async (instance,params) => {
|
||||||
|
const {panel,options} = params
|
||||||
|
|
||||||
|
const parsedOptions = options.map((option) => {
|
||||||
|
return {
|
||||||
|
label:option.get("openticket:button-label").value.substring(0,100),
|
||||||
|
value:"od:ticket-option_"+panel.id.value+"_"+option.id.value,
|
||||||
|
emoji:option.get("openticket:button-emoji").value,
|
||||||
|
description:option.get("openticket:description").value.substring(0,100)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
instance.setCustomId("od:panel-dropdown_"+panel.id.value)
|
||||||
|
instance.setType("string")
|
||||||
|
instance.setMaxValues(1)
|
||||||
|
instance.setMinValues(0)
|
||||||
|
instance.setPlaceholder(panel.get("openticket:dropdown-placeholder").value)
|
||||||
|
instance.setOptions(parsedOptions)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,45 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//FILE BUILDERS
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const files = openticket.builders.files
|
||||||
|
const lang = openticket.languages
|
||||||
|
const transcriptConfig = openticket.configs.get("openticket:transcripts")
|
||||||
|
|
||||||
|
export const registerAllFiles = async () => {
|
||||||
|
transcriptFiles()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const transcriptFiles = () => {
|
||||||
|
//TEXT TRANSCRIPT
|
||||||
|
files.add(new api.ODFile("openticket:text-transcript"))
|
||||||
|
files.get("openticket:text-transcript").workers.add(
|
||||||
|
new api.ODWorker("openticket:text-transcript",0,async (instance,params,source) => {
|
||||||
|
const {guild,channel,user,ticket,compiler,result} = params
|
||||||
|
|
||||||
|
const fileMode = transcriptConfig.data.textTranscriptStyle.fileMode
|
||||||
|
const customName = transcriptConfig.data.textTranscriptStyle.customFileName
|
||||||
|
|
||||||
|
const creatorId = ticket.get("openticket:opened-by").value ?? "unknown-creator-id"
|
||||||
|
const creator = (await openticket.tickets.getTicketUser(ticket,"creator"))
|
||||||
|
|
||||||
|
if (fileMode == "custom") instance.setName(customName.split(".")[0]+".txt")
|
||||||
|
else if (fileMode == "user-id") instance.setName(creatorId+".txt")
|
||||||
|
else if (fileMode == "user-name") instance.setName((creator ? creator.username : "unknown-creator-name")+".txt")
|
||||||
|
else if (fileMode == "channel-id") instance.setName(channel.id+".txt")
|
||||||
|
else if (fileMode == "channel-name") instance.setName(channel.name+".txt")
|
||||||
|
else instance.setName("transcript.txt")
|
||||||
|
|
||||||
|
instance.setDescription(lang.getTranslation("transcripts.success.textFileDescription"))
|
||||||
|
|
||||||
|
if (compiler.id.value != "openticket:text-compiler" || !result.data || typeof result.data.contents != "string"){
|
||||||
|
instance.setContents("<invalid-transcript-compiler>")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
instance.setContents(result.data.contents)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,173 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//MODAL BUILDERS
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const modals = openticket.builders.modals
|
||||||
|
const lang = openticket.languages
|
||||||
|
|
||||||
|
export const registerAllModals = async () => {
|
||||||
|
ticketModals()
|
||||||
|
}
|
||||||
|
const ticketModals = () => {
|
||||||
|
//TICKET QUESTIONS
|
||||||
|
modals.add(new api.ODModal("openticket:ticket-questions"))
|
||||||
|
modals.get("openticket:ticket-questions").workers.add(
|
||||||
|
new api.ODWorker("openticket:ticket-questions",0,async (instance,params,source) => {
|
||||||
|
const {option} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:ticket-questions_"+option.id.value+"_"+source)
|
||||||
|
instance.setTitle(option.exists("openticket:name") ? option.get("openticket:name").value : option.id.value)
|
||||||
|
const questionIds = option.get("openticket:questions").value
|
||||||
|
questionIds.forEach((id) => {
|
||||||
|
const question = openticket.questions.get(id)
|
||||||
|
if (!question) return
|
||||||
|
if (question instanceof api.ODShortQuestion) instance.addQuestion({
|
||||||
|
customId:question.id.value,
|
||||||
|
label:question.get("openticket:name").value,
|
||||||
|
style:"short",
|
||||||
|
required:question.get("openticket:required").value,
|
||||||
|
placeholder:(question.get("openticket:placeholder").value) ? question.get("openticket:placeholder").value : undefined,
|
||||||
|
minLength:(question.get("openticket:length-enabled").value) ? question.get("openticket:length-min").value : undefined,
|
||||||
|
maxLength:(question.get("openticket:length-enabled").value) ? question.get("openticket:length-max").value : undefined
|
||||||
|
})
|
||||||
|
else if (question instanceof api.ODParagraphQuestion) instance.addQuestion({
|
||||||
|
customId:question.id.value,
|
||||||
|
label:question.get("openticket:name").value,
|
||||||
|
style:"paragraph",
|
||||||
|
required:question.get("openticket:required").value,
|
||||||
|
placeholder:(question.get("openticket:placeholder").value) ? question.get("openticket:placeholder").value : undefined,
|
||||||
|
minLength:(question.get("openticket:length-enabled").value) ? question.get("openticket:length-min").value : undefined,
|
||||||
|
maxLength:(question.get("openticket:length-enabled").value) ? question.get("openticket:length-max").value : undefined
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//CLOSE TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:close-ticket-reason"))
|
||||||
|
modals.get("openticket:close-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:close-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:close-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.close"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.closePlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//REOPEN TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:reopen-ticket-reason"))
|
||||||
|
modals.get("openticket:reopen-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:reopen-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:reopen-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.reopen"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.reopenPlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//DELETE TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:delete-ticket-reason"))
|
||||||
|
modals.get("openticket:delete-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:delete-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:delete-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.delete"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.deletePlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//CLAIM TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:claim-ticket-reason"))
|
||||||
|
modals.get("openticket:claim-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:claim-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:claim-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.claim"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.claimPlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//UNCLAIM TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:unclaim-ticket-reason"))
|
||||||
|
modals.get("openticket:unclaim-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:unclaim-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.unclaim"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.unclaimPlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//PIN TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:pin-ticket-reason"))
|
||||||
|
modals.get("openticket:pin-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:pin-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:pin-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.pin"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.pinPlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//UNPIN TICKET REASON
|
||||||
|
modals.add(new api.ODModal("openticket:unpin-ticket-reason"))
|
||||||
|
modals.get("openticket:unpin-ticket-reason").workers.add(
|
||||||
|
new api.ODWorker("openticket:unpin-ticket-reason",0,async (instance,params,source) => {
|
||||||
|
const {ticket} = params
|
||||||
|
|
||||||
|
instance.setCustomId("od:unpin-ticket-reason_"+ticket.id.value+"_"+source)
|
||||||
|
instance.setTitle(lang.getTranslation("actions.buttons.unpin"))
|
||||||
|
instance.addQuestion({
|
||||||
|
customId:"reason",
|
||||||
|
label:lang.getTranslation("params.uppercase.reason"),
|
||||||
|
style:"paragraph",
|
||||||
|
required:true,
|
||||||
|
placeholder:lang.getTranslation("actions.modal.unpinPlaceholder")
|
||||||
|
})
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//ADD COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//ADD COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:add",generalConfig.data.prefix,"add"))
|
||||||
|
openticket.responders.commands.get("openticket:add").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.add
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:add",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = instance.options.getUser("user",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//return when user already added to ticket
|
||||||
|
const participants = await openticket.tickets.getAllTicketParticipants(ticket)
|
||||||
|
if (!participants || participants.find((p) => p.user.id == data.id)){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"This user is already able to access the ticket!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start adding user to ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:add-ticket-user").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:add-message").build(source,{guild,channel,user,ticket,reason,data}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'add' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//AUTOCLOSE COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//AUTOCLOSE COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:autoclose",generalConfig.data.prefix,/^autoclose/))
|
||||||
|
openticket.responders.commands.get("openticket:autoclose").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.autoclose
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:autoclose",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//return when already closed
|
||||||
|
if (ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already closed!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
if (!scope || (scope != "disable" && scope != "enable")) return
|
||||||
|
|
||||||
|
if (scope == "disable"){
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
ticket.get("openticket:autoclose-enabled").value = false
|
||||||
|
ticket.get("openticket:autoclose-hours").value = 0
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:autoclose-disable").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
|
||||||
|
}else if (scope == "enable"){
|
||||||
|
const time = instance.options.getNumber("time",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
ticket.get("openticket:autoclose-enabled").value = true
|
||||||
|
ticket.get("openticket:autoclose-hours").value = time
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:autoclose-enable").build(source,{guild,channel,user,ticket,reason,time}))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
openticket.log(instance.user.displayName+" used the 'autoclose "+scope+"' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"reason",value:reason ?? "/"},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//AUTODELETE COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//AUTODELETE COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:autodelete",generalConfig.data.prefix,/^autodelete/))
|
||||||
|
openticket.responders.commands.get("openticket:autodelete").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.autodelete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:autodelete",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
if (!scope || (scope != "disable" && scope != "enable")) return
|
||||||
|
|
||||||
|
if (scope == "disable"){
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
ticket.get("openticket:autodelete-enabled").value = false
|
||||||
|
ticket.get("openticket:autodelete-days").value = 0
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:autodelete-disable").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
|
||||||
|
}else if (scope == "enable"){
|
||||||
|
const time = instance.options.getNumber("time",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
ticket.get("openticket:autodelete-enabled").value = true
|
||||||
|
ticket.get("openticket:autodelete-days").value = time
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:autodelete-enable").build(source,{guild,channel,user,ticket,reason,time}))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
openticket.log(instance.user.displayName+" used the 'autodelete "+scope+"' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"reason",value:reason ?? "/"},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//BLACKLIST COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//BLACKLIST COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:blacklist",generalConfig.data.prefix,/^blacklist/))
|
||||||
|
openticket.responders.commands.get("openticket:blacklist").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.blacklist
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:blacklist",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
if (!scope || (scope != "add" && scope != "get" && scope != "remove" && scope != "view")) return
|
||||||
|
|
||||||
|
if (scope == "view"){
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-view").build(source,{guild,channel,user}))
|
||||||
|
|
||||||
|
}else if (scope == "get"){
|
||||||
|
const data = instance.options.getUser("user",true)
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-get").build(source,{guild,channel,user,data}))
|
||||||
|
|
||||||
|
}else if (scope == "add"){
|
||||||
|
const data = instance.options.getUser("user",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
openticket.blacklist.add(new api.ODBlacklist(data.id,reason),true)
|
||||||
|
openticket.log(instance.user.displayName+" added "+data.displayName+" to blacklist!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"reason",value:reason ?? "/"}
|
||||||
|
])
|
||||||
|
|
||||||
|
//manage stats
|
||||||
|
openticket.stats.get("openticket:global").setStat("openticket:users-blacklisted",1,"increase")
|
||||||
|
openticket.stats.get("openticket:user").setStat("openticket:users-blacklisted",user.id,1,"increase")
|
||||||
|
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-add").build(source,{guild,channel,user,data,reason}))
|
||||||
|
|
||||||
|
}else if (scope == "remove"){
|
||||||
|
const data = instance.options.getUser("user",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
openticket.blacklist.remove(data.id)
|
||||||
|
openticket.log(instance.user.displayName+" removed "+data.displayName+" from blacklist!","info",[
|
||||||
|
{key:"user",value:user.username},
|
||||||
|
{key:"userid",value:user.id,hidden:true},
|
||||||
|
{key:"channelid",value:channel.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"reason",value:reason ?? "/"}
|
||||||
|
])
|
||||||
|
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:blacklist-remove").build(source,{guild,channel,user,data,reason}))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:discord-logs",1,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild) return
|
||||||
|
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
if (!scope || (scope != "add" && scope != "remove")) return
|
||||||
|
|
||||||
|
const data = instance.options.getUser("user",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//to logs
|
||||||
|
if (generalConfig.data.system.logs.enabled && generalConfig.data.system.messages.blacklisting.logs){
|
||||||
|
const logChannel = openticket.posts.get("openticket:logs")
|
||||||
|
if (logChannel) logChannel.send(await openticket.builders.messages.getSafe("openticket:blacklist-logs").build(source,{guild,channel,user,mode:scope,data,reason}))
|
||||||
|
}
|
||||||
|
|
||||||
|
//to dm
|
||||||
|
if (generalConfig.data.system.messages.blacklisting.dm) await openticket.client.sendUserDm(user,await openticket.builders.messages.getSafe("openticket:blacklist-dm").build(source,{guild,channel,user,mode:scope,data,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
openticket.log(instance.user.displayName+" used the 'blacklist "+scope+"' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//CLAIM COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//CLAIM COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:claim",generalConfig.data.prefix,"claim"))
|
||||||
|
openticket.responders.commands.get("openticket:claim").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.claim
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:claim",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already claimed
|
||||||
|
if (ticket.get("openticket:claimed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already claimed!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const claimUser = instance.options.getUser("user",false) ?? user
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start claiming ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:claim-ticket").run(source,{guild,channel,user:claimUser,ticket,reason,sendMessage:false})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:claim-message").build(source,{guild,channel,user:claimUser,ticket,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'claim' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//CLAIM TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:claim-ticket",/^od:claim-ticket/))
|
||||||
|
openticket.responders.buttons.get("openticket:claim-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:claim-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "unclaim-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:claim-ticket-ticket-message").activate(instance)
|
||||||
|
else await openticket.verifybars.get("openticket:claim-ticket-unclaim-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//CLAIM WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:claim-ticket-reason",/^od:claim-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:claim-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:claim-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"unclaim-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//claim with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "unclaim-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:claim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:claim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//CLEAR COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//CLEAR COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:clear",generalConfig.data.prefix,"clear"))
|
||||||
|
openticket.responders.commands.get("openticket:clear").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.clear
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
//only allow global admins (ticket admins aren't allowed to clear tickets)
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelUserScope:false,allowChannelRoleScope:false}))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:clear",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const tempFilter = instance.options.getString("filter",false)
|
||||||
|
const filter = (tempFilter) ? tempFilter.toLowerCase() as api.ODTicketClearFilter : "all"
|
||||||
|
const list: string[] = []
|
||||||
|
const ticketList = openticket.tickets.getAll().filter((ticket) => {
|
||||||
|
if (filter == "all") return true
|
||||||
|
else if (filter == "open" && ticket.get("openticket:open").value) return true
|
||||||
|
else if (filter == "closed" && ticket.get("openticket:closed").value) return true
|
||||||
|
else if (filter == "claimed" && ticket.get("openticket:claimed").value) return true
|
||||||
|
else if (filter == "pinned" && ticket.get("openticket:pinned").value) return true
|
||||||
|
else if (filter == "unclaimed" && !ticket.get("openticket:claimed").value) return true
|
||||||
|
else if (filter == "unpinned" && !ticket.get("openticket:pinned").value) return true
|
||||||
|
else if (filter == "autoclosed" && ticket.get("openticket:closed").value) return true
|
||||||
|
else return false
|
||||||
|
})
|
||||||
|
for (const ticket of ticketList){
|
||||||
|
const ticketChannel = await openticket.tickets.getTicketChannel(ticket)
|
||||||
|
if (ticketChannel) list.push("#"+ticketChannel.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
//reply with clear verify
|
||||||
|
await instance.defer(true)
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:clear-verify-message").build(source,{guild,channel,user,filter,list}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'clear' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//CLEAR CONTINUE BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:clear-continue",/^od:clear-continue_/))
|
||||||
|
openticket.responders.buttons.get("openticket:clear-continue").workers.add(
|
||||||
|
new api.ODWorker("openticket:clear-continue",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild || channel.isDMBased()) return
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "slash" && originalSource != "text" && originalSource != "other") return
|
||||||
|
const filter = instance.interaction.customId.split("_")[2] as api.ODTicketClearFilter
|
||||||
|
|
||||||
|
//start ticket clear
|
||||||
|
instance.defer("update",true)
|
||||||
|
const list: string[] = []
|
||||||
|
const ticketList = openticket.tickets.getAll().filter((ticket) => {
|
||||||
|
if (filter == "all") return true
|
||||||
|
else if (filter == "open" && ticket.get("openticket:open").value) return true
|
||||||
|
else if (filter == "closed" && ticket.get("openticket:closed").value) return true
|
||||||
|
else if (filter == "claimed" && ticket.get("openticket:claimed").value) return true
|
||||||
|
else if (filter == "pinned" && ticket.get("openticket:pinned").value) return true
|
||||||
|
else if (filter == "unclaimed" && !ticket.get("openticket:claimed").value) return true
|
||||||
|
else if (filter == "unpinned" && !ticket.get("openticket:pinned").value) return true
|
||||||
|
else if (filter == "autoclosed" && ticket.get("openticket:closed").value) return true
|
||||||
|
else return false
|
||||||
|
})
|
||||||
|
for (const ticket of ticketList){
|
||||||
|
const ticketChannel = await openticket.tickets.getTicketChannel(ticket)
|
||||||
|
if (ticketChannel) list.push("#"+ticketChannel.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
await openticket.actions.get("openticket:clear-tickets").run(originalSource,{guild,channel,user,filter,list:ticketList})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:clear-message").build(originalSource,{guild,channel,user,filter,list}))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//CLOSE COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//CLOSE COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:close",generalConfig.data.prefix,"close"))
|
||||||
|
openticket.responders.commands.get("openticket:close").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.close
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:close",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already closed
|
||||||
|
if (ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already closed!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start closing ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:close-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:close-message").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'close' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//CLOSE TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:close-ticket",/^od:close-ticket_/))
|
||||||
|
openticket.responders.buttons.get("openticket:close-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:close-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "reopen-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:close-ticket-ticket-message").activate(instance)
|
||||||
|
else await openticket.verifybars.get("openticket:close-ticket-reopen-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//CLOSE WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:close-ticket-reason",/^od:close-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:close-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:close-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"reopen-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//close with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "reopen-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:close-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:close-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DELETE COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//DELETE COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:delete",generalConfig.data.prefix,"delete"))
|
||||||
|
openticket.responders.commands.get("openticket:delete").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.delete
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:delete",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
const withoutTranscript = instance.options.getBoolean("notranscript",false) ?? false
|
||||||
|
|
||||||
|
//start deleting ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:delete-message").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
await openticket.actions.get("openticket:delete-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript})
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'delete' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//DELETE TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:delete-ticket",/^od:delete-ticket/))
|
||||||
|
openticket.responders.buttons.get("openticket:delete-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:delete-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "reopen-message" && originalSource != "close-message" && originalSource != "autoclose-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:delete-ticket-ticket-message").activate(instance)
|
||||||
|
else if (originalSource == "close-message") await openticket.verifybars.get("openticket:delete-ticket-close-message").activate(instance)
|
||||||
|
else if (originalSource == "reopen-message") await openticket.verifybars.get("openticket:delete-ticket-reopen-message").activate(instance)
|
||||||
|
else if (originalSource == "autoclose-message") await openticket.verifybars.get("openticket:delete-ticket-autoclose-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//REOPEN WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:delete-ticket-reason",/^od:delete-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:delete-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:delete-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//delete with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
|
||||||
|
//update ticket (for ticket message) => no-await doesn't wait for the action to set this variable
|
||||||
|
ticket.get("openticket:for-deletion").value = true
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "close-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "reopen-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "autoclose-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false,withoutTranscript:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:delete-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
//don't await DELETE action => else it will update the message after the channel has been deleted
|
||||||
|
openticket.actions.get("openticket:delete-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true,withoutTranscript:false})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//HELP COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//HELP COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:help",generalConfig.data.prefix,"help"))
|
||||||
|
openticket.responders.commands.get("openticket:help").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.help
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:help",0,async (instance,params,source,cancel) => {
|
||||||
|
const preferSlashOverText = generalConfig.data.system.preferSlashOverText
|
||||||
|
|
||||||
|
let mode: "slash"|"text"
|
||||||
|
if (generalConfig.data.slashCommands && generalConfig.data.textCommands){
|
||||||
|
mode = (preferSlashOverText) ? "slash" : "text"
|
||||||
|
|
||||||
|
}else if (!generalConfig.data.slashCommands) mode = "text"
|
||||||
|
else mode = "slash"
|
||||||
|
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:help-menu").build(source,{mode,page:0}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'help' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//HELP MENU SWITCH BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-switch",/^od:help-menu-switch_(slash|text)/))
|
||||||
|
openticket.responders.buttons.get("openticket:help-menu-switch").workers.add(
|
||||||
|
new api.ODWorker("openticket:update-help-menu",0,async (instance,params,source,cancel) => {
|
||||||
|
const mode = instance.interaction.customId.split("_")[1] as "slash"|"text"
|
||||||
|
const pageButton = instance.getMessageComponent("button",/^od:help-menu-page_([0-9]+)/)
|
||||||
|
const currentPage = (pageButton && pageButton.customId) ? Number(pageButton.customId.split("_")[1]) : 0
|
||||||
|
|
||||||
|
const newMode = (mode == "slash") ? "text" : "slash"
|
||||||
|
|
||||||
|
const msg = await openticket.builders.messages.getSafe("openticket:help-menu").build("button",{mode:newMode,page:currentPage})
|
||||||
|
await instance.update(msg)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//HELP MENU PREVIOUS BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-previous",/^od:help-menu-previous/))
|
||||||
|
openticket.responders.buttons.get("openticket:help-menu-previous").workers.add(
|
||||||
|
new api.ODWorker("openticket:update-help-menu",0,async (instance,params,source,cancel) => {
|
||||||
|
const switchButton = instance.getMessageComponent("button",/^od:help-menu-switch_(slash|text)/)
|
||||||
|
const pageButton = instance.getMessageComponent("button",/^od:help-menu-page_([0-9]+)/)
|
||||||
|
const currentPage = (pageButton && pageButton.customId) ? Number(pageButton.customId.split("_")[1]) : 0
|
||||||
|
const currentMode = (switchButton && switchButton.customId) ? switchButton.customId.split("_")[1] as "text"|"slash" : "slash"
|
||||||
|
|
||||||
|
const msg = await openticket.builders.messages.getSafe("openticket:help-menu").build("button",{mode:currentMode,page:currentPage-1})
|
||||||
|
await instance.update(msg)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
//HELP MENU NEXT BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:help-menu-next",/^od:help-menu-next/))
|
||||||
|
openticket.responders.buttons.get("openticket:help-menu-next").workers.add(
|
||||||
|
new api.ODWorker("openticket:update-help-menu",0,async (instance,params,source,cancel) => {
|
||||||
|
const switchButton = instance.getMessageComponent("button",/^od:help-menu-switch_(slash|text)/)
|
||||||
|
const pageButton = instance.getMessageComponent("button",/^od:help-menu-page_([0-9]+)/)
|
||||||
|
const currentPage = (pageButton && pageButton.customId) ? Number(pageButton.customId.split("_")[1]) : 0
|
||||||
|
const currentMode = (switchButton && switchButton.customId) ? switchButton.customId.split("_")[1] as "text"|"slash" : "slash"
|
||||||
|
|
||||||
|
const msg = await openticket.builders.messages.getSafe("openticket:help-menu").build("button",{mode:currentMode,page:currentPage+1})
|
||||||
|
await instance.update(msg)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//MOVE COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//MOVE COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:move",generalConfig.data.prefix,"move"))
|
||||||
|
openticket.responders.commands.get("openticket:move").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.move
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:move",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const id = instance.options.getString("id",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
const option = openticket.options.get(id)
|
||||||
|
//return if unknown option
|
||||||
|
if (!option || !(option instanceof api.ODTicketOption)){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Unknown Option",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return if option is the same
|
||||||
|
if (ticket.option.id.value == option.id.value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"This ticket is already the same as the chosen option!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start moving ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:move-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data:option})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:move-message").build(source,{guild,channel,user,ticket,reason,data:option}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'move' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//STATS COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//PANEL COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:panel",generalConfig.data.prefix,/^panel/))
|
||||||
|
openticket.responders.commands.get("openticket:panel").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.panel
|
||||||
|
|
||||||
|
//command is disabled
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:panel",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const id = instance.options.getString("id",true)
|
||||||
|
const panel = openticket.panels.get(id)
|
||||||
|
|
||||||
|
if (!panel){
|
||||||
|
//invalid panel
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-panel-unknown").build(source,{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:panel-ready").build(source,{guild,channel,user,panel}))
|
||||||
|
const panelMessage = await instance.channel.send((await openticket.builders.messages.getSafe("openticket:panel").build(source,{guild,channel,user,panel})).message)
|
||||||
|
|
||||||
|
//add panel to database on auto-update
|
||||||
|
if (instance.options.getBoolean("auto-update",false)){
|
||||||
|
const globalDatabase = openticket.databases.get("openticket:global")
|
||||||
|
globalDatabase.set("openticket:panel-update",panelMessage.channel.id+"_"+panelMessage.id,panel.id.value)
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'panel' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,137 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//PIN COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//PIN COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:pin",generalConfig.data.prefix,"pin"))
|
||||||
|
openticket.responders.commands.get("openticket:pin").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.pin
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:pin",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when already pinned
|
||||||
|
if (ticket.get("openticket:pinned").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already pinned!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start pinning ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:pin-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:pin-message").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'pin' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//PIN TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:pin-ticket",/^od:pin-ticket/))
|
||||||
|
openticket.responders.buttons.get("openticket:pin-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:pin-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "unpin-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:pin-ticket-ticket-message").activate(instance)
|
||||||
|
else await openticket.verifybars.get("openticket:pin-ticket-unpin-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//PIN WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:pin-ticket-reason",/^od:pin-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:pin-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:pin-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"unpin-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//pin with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "unpin-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:pin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:pin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//REMOVE COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//REMOVE COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:remove",generalConfig.data.prefix,"remove"))
|
||||||
|
openticket.responders.commands.get("openticket:remove").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.remove
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:remove",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = instance.options.getUser("user",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//return when user is not a participant of the ticket (admins & creator can't be removed)
|
||||||
|
const participants = await openticket.tickets.getAllTicketParticipants(ticket)
|
||||||
|
if (!participants || !participants.find((p) => p.user.id == data.id && p.role == "participant")){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Unable to remove this user from the ticket!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start removing user from ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:remove-ticket-user").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:remove-message").build(source,{guild,channel,user,ticket,reason,data}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'remove' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//RENAME COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//RENAME COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:rename",generalConfig.data.prefix,"rename"))
|
||||||
|
openticket.responders.commands.get("openticket:rename").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.rename
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:rename",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const name = instance.options.getString("name",true)
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start renaming ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:rename-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,data:name})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:rename-message").build(source,{guild,channel,user,ticket,reason,data:name}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'rename' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//REOPEN COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//REOPEN COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:reopen",generalConfig.data.prefix,"reopen"))
|
||||||
|
openticket.responders.commands.get("openticket:reopen").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.reopen
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:reopen",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not closed
|
||||||
|
if (!ticket.get("openticket:closed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is not closed yet!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start reopening ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:reopen-message").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'reopen' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//REOPEN TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:reopen-ticket",/^od:reopen-ticket/))
|
||||||
|
openticket.responders.buttons.get("openticket:reopen-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:reopen-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "close-message" && originalSource != "autoclose-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:reopen-ticket-ticket-message").activate(instance)
|
||||||
|
else if (originalSource == "close-message") await openticket.verifybars.get("openticket:reopen-ticket-close-message").activate(instance)
|
||||||
|
else await openticket.verifybars.get("openticket:reopen-ticket-autoclose-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//REOPEN WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:reopen-ticket-reason",/^od:reopen-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:reopen-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:reopen-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"close-message"|"autoclose-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//reopen with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "close-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "autoclose-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:reopen-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:reopen-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//ROLE BUTTON (not command)
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//ROLE OPTION BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:role-option",/^od:role-option_/))
|
||||||
|
openticket.responders.buttons.get("openticket:role-option").workers.add(
|
||||||
|
new api.ODWorker("openticket:role-option",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//get option
|
||||||
|
const optionId = instance.interaction.customId.split("_")[2]
|
||||||
|
const option = openticket.options.get(optionId)
|
||||||
|
if (!option || !(option instanceof api.ODRoleOption)){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//reaction role
|
||||||
|
await instance.defer("reply",true)
|
||||||
|
const res = await openticket.actions.get("openticket:reaction-role").run("panel-button",{guild,user,option,overwriteMode:null})
|
||||||
|
if (!res.result || !res.role){
|
||||||
|
//error
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive role update data from worker!",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (generalConfig.data.system.replyOnReactionRole) await instance.reply(await openticket.builders.messages.getSafe("openticket:reaction-role").build("panel-button",{guild,user,role:res.role,result:res.result}))
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//STATS COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//STATS COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:stats",generalConfig.data.prefix,/^stats/))
|
||||||
|
openticket.responders.commands.get("openticket:stats").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.stats
|
||||||
|
|
||||||
|
//command is disabled
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//reset subcommand is owner/developer only
|
||||||
|
if (instance.options.getSubCommand() == "reset"){
|
||||||
|
if (!openticket.permissions.hasPermissions("owner",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["owner","developer"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
|
||||||
|
//permissions for normal scopes
|
||||||
|
if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:stats",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
if (!scope || (scope != "global" && scope != "ticket" && scope != "user" && scope != "reset")) return
|
||||||
|
|
||||||
|
if (scope == "global"){
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-global").build(source,{guild,channel,user}))
|
||||||
|
|
||||||
|
}else if (scope == "ticket"){
|
||||||
|
const id = instance.options.getChannel("ticket",false)?.id ?? channel.id
|
||||||
|
const ticket = openticket.tickets.get(id)
|
||||||
|
|
||||||
|
if (ticket) await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-ticket").build(source,{guild,channel,user,scopeData:ticket}))
|
||||||
|
else await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-ticket-unknown").build(source,{guild,channel,user,id}))
|
||||||
|
|
||||||
|
}else if (scope == "user"){
|
||||||
|
const statsUser = instance.options.getUser("user",false) ?? user
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-user").build(source,{guild,channel,user,scopeData:statsUser}))
|
||||||
|
|
||||||
|
}else if (scope == "reset"){
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
openticket.stats.reset()
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:stats-reset").build(source,{guild,channel,user,reason}))
|
||||||
|
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
const scope = instance.options.getSubCommand()
|
||||||
|
let data: string
|
||||||
|
if (scope == "ticket"){
|
||||||
|
data = instance.options.getChannel("ticket",false)?.id ?? instance.channel.id
|
||||||
|
}else if (scope == "user"){
|
||||||
|
data = instance.options.getUser("user",false)?.id ?? instance.user.id
|
||||||
|
}else data = "/"
|
||||||
|
openticket.log(instance.user.displayName+" used the 'stats "+scope+"' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source},
|
||||||
|
{key:"data",value:data},
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,269 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//TICKET COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//TICKET COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:ticket",generalConfig.data.prefix,/^ticket/))
|
||||||
|
openticket.responders.commands.get("openticket:ticket").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.ticket
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//get option
|
||||||
|
const optionId = instance.options.getString("id",true)
|
||||||
|
const option = openticket.options.get(optionId)
|
||||||
|
if (!option || !(option instanceof api.ODTicketOption)){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//check ticket permissions
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket-permissions").run(source,{guild,user,option})
|
||||||
|
if (!res.valid){
|
||||||
|
//error
|
||||||
|
if (res.reason == "blacklist") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
else if (res.reason == "cooldown") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
|
||||||
|
else if (res.reason == "global-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
|
||||||
|
else if (res.reason == "global-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
|
||||||
|
else if (res.reason == "option-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
|
||||||
|
else if (res.reason == "option-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
|
||||||
|
else instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start ticket creation
|
||||||
|
if (option.exists("openticket:questions") && option.get("openticket:questions").value.length > 0){
|
||||||
|
//send modal
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:ticket-questions").build(source,{guild,channel,user,option}))
|
||||||
|
}else{
|
||||||
|
//create ticket
|
||||||
|
await instance.defer(true)
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket").run(source,{guild,user,answers:[],option})
|
||||||
|
if (!res.channel || !res.ticket){
|
||||||
|
//error
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build(source,{guild,channel:res.channel,user,ticket:res.ticket}))
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'ticket' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//TICKET OPTION BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:ticket-option",/^od:ticket-option_/))
|
||||||
|
openticket.responders.buttons.get("openticket:ticket-option").workers.add(
|
||||||
|
new api.ODWorker("openticket:ticket-option",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//get option
|
||||||
|
const optionId = instance.interaction.customId.split("_")[2]
|
||||||
|
const option = openticket.options.get(optionId)
|
||||||
|
if (!option || !(option instanceof api.ODTicketOption)){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//check ticket permissions
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket-permissions").run("panel-button",{guild,user,option})
|
||||||
|
if (!res.valid){
|
||||||
|
//error
|
||||||
|
if (res.reason == "blacklist") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
else if (res.reason == "cooldown") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
|
||||||
|
else if (res.reason == "global-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
|
||||||
|
else if (res.reason == "global-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
|
||||||
|
else if (res.reason == "option-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
|
||||||
|
else if (res.reason == "option-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
|
||||||
|
else instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start ticket creation
|
||||||
|
if (option.exists("openticket:questions") && option.get("openticket:questions").value.length > 0){
|
||||||
|
//send modal
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:ticket-questions").build("panel-button",{guild,channel,user,option}))
|
||||||
|
}else{
|
||||||
|
//create ticket
|
||||||
|
await instance.defer("reply",true)
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket").run("panel-button",{guild,user,answers:[],option})
|
||||||
|
if (!res.channel || !res.ticket){
|
||||||
|
//error
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build("panel-button",{guild,channel:res.channel,user,ticket:res.ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerDropdownResponders = async () => {
|
||||||
|
//PANEL DROPDOWN TICKETS DROPDOWN RESPONDER
|
||||||
|
openticket.responders.dropdowns.add(new api.ODDropdownResponder("openticket:panel-dropdown-tickets",/^od:panel-dropdown_/))
|
||||||
|
openticket.responders.dropdowns.get("openticket:panel-dropdown-tickets").workers.add(
|
||||||
|
new api.ODWorker("openticket:panel-dropdown-tickets",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//get option
|
||||||
|
const optionId = instance.values.getStringValues()[0].split("_")[2]
|
||||||
|
const option = openticket.options.get(optionId)
|
||||||
|
if (!option || !(option instanceof api.ODTicketOption)){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//check ticket permissions
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket-permissions").run("panel-dropdown",{guild,user,option})
|
||||||
|
if (!res.valid){
|
||||||
|
//error
|
||||||
|
if (res.reason == "blacklist") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
|
||||||
|
else if (res.reason == "cooldown") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
|
||||||
|
else if (res.reason == "global-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
|
||||||
|
else if (res.reason == "global-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
|
||||||
|
else if (res.reason == "option-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
|
||||||
|
else if (res.reason == "option-user-limit") instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
|
||||||
|
else instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//start ticket creation
|
||||||
|
if (option.exists("openticket:questions") && option.get("openticket:questions").value.length > 0){
|
||||||
|
//send modal
|
||||||
|
instance.modal(await openticket.builders.modals.getSafe("openticket:ticket-questions").build("panel-dropdown",{guild,channel,user,option}))
|
||||||
|
}else{
|
||||||
|
//create ticket
|
||||||
|
await instance.defer("reply",true)
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket").run("panel-dropdown",{guild,user,answers:[],option})
|
||||||
|
if (!res.channel || !res.ticket){
|
||||||
|
//error
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel:instance.channel,user,error:"Unable to receive ticket or channel from callback! #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build("panel-dropdown",{guild,channel:res.channel,user,ticket:res.ticket}))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//TICKET QUESTIONS RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:ticket-questions",/^od:ticket-questions_/))
|
||||||
|
openticket.responders.modals.get("openticket:ticket-questions").workers.add([
|
||||||
|
new api.ODWorker("openticket:ticket-questions",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) throw new api.ODSystemError("The 'Ticket Questions' modal Requires a channel for responding!")
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("panel-button"|"panel-dropdown"|"slash"|"text"|"other")
|
||||||
|
|
||||||
|
//get option
|
||||||
|
const optionId = instance.interaction.customId.split("_")[1]
|
||||||
|
const option = openticket.options.get(optionId)
|
||||||
|
if (!option || !(option instanceof api.ODTicketOption)){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-option-unknown").build(source,{guild:instance.guild,channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
//get answers
|
||||||
|
const answers: {id:string,name:string,type:"short"|"paragraph",value:string|null}[] = []
|
||||||
|
option.get("openticket:questions").value.forEach((id) => {
|
||||||
|
const question = openticket.questions.get(id)
|
||||||
|
if (!question) return
|
||||||
|
if (question instanceof api.ODShortQuestion){
|
||||||
|
answers.push({
|
||||||
|
id,
|
||||||
|
name:question.exists("openticket:name") ? question.get("openticket:name")?.value : id,
|
||||||
|
type:"short",
|
||||||
|
value:instance.values.getTextField(id,false)
|
||||||
|
})
|
||||||
|
}else if (question instanceof api.ODParagraphQuestion){
|
||||||
|
answers.push({
|
||||||
|
id,
|
||||||
|
name:question.exists("openticket:name") ? question.get("openticket:name")?.value : id,
|
||||||
|
type:"paragraph",
|
||||||
|
value:instance.values.getTextField(id,false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
//create ticket
|
||||||
|
await instance.defer("reply",true)
|
||||||
|
const res = await openticket.actions.get("openticket:create-ticket").run(originalSource,{guild,user,answers,option})
|
||||||
|
if (!res.channel || !res.ticket){
|
||||||
|
//error
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild,channel,user,error:"Unable to receive ticket or channel from callback! #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await openticket.builders.messages.getSafe("openticket:ticket-created").build(originalSource,{guild,channel:res.channel,user,ticket:res.ticket}))
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//UNCLAIM COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//UNCLAIM COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:unclaim",generalConfig.data.prefix,"unclaim"))
|
||||||
|
openticket.responders.commands.get("openticket:unclaim").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.unclaim
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:unclaim",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not claimed
|
||||||
|
if (!ticket.get("openticket:claimed").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is not claimed yet!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start unclaiming ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:unclaim-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:unclaim-message").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'unclaim' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//UNCLAIM TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:unclaim-ticket",/^od:unclaim-ticket/))
|
||||||
|
openticket.responders.buttons.get("openticket:unclaim-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "claim-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:unclaim-ticket-ticket-message").activate(instance)
|
||||||
|
else await openticket.verifybars.get("openticket:unclaim-ticket-claim-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//UNCLAIM WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:unclaim-ticket-reason",/^od:unclaim-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:unclaim-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:unclaim-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"claim-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//unclaim with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "claim-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:unclaim-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unclaim-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//UNPIN COMMAND
|
||||||
|
///////////////////////////////////////
|
||||||
|
import {openticket, api, utilities} from "../index"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
const generalConfig = openticket.configs.get("openticket:general")
|
||||||
|
|
||||||
|
export const registerCommandResponders = async () => {
|
||||||
|
//UNPIN COMMAND RESPONDER
|
||||||
|
openticket.responders.commands.add(new api.ODCommandResponder("openticket:unpin",generalConfig.data.prefix,"unpin"))
|
||||||
|
openticket.responders.commands.get("openticket:unpin").workers.add([
|
||||||
|
new api.ODWorker("openticket:permissions",1,async (instance,params,source,cancel) => {
|
||||||
|
const permissionMode = generalConfig.data.system.permissions.unpin
|
||||||
|
|
||||||
|
if (permissionMode == "none"){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else if (permissionMode == "everyone") return
|
||||||
|
else if (permissionMode == "admin"){
|
||||||
|
if (!openticket.permissions.hasPermissions("support",await openticket.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}else{
|
||||||
|
if (!instance.guild || !instance.member){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const role = await openticket.client.fetchGuildRole(instance.guild,permissionMode)
|
||||||
|
if (!role){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
if (!role.members.has(instance.member.id)){
|
||||||
|
//no permissions
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
|
||||||
|
return cancel()
|
||||||
|
}else return
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:unpin",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!guild){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build("button",{channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(channel.id)
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when not pinned yet
|
||||||
|
if (!ticket.get("openticket:pinned").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is not pinned yet!",layout:"simple"}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
//return when busy
|
||||||
|
if (ticket.get("openticket:busy").value){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-busy").build("button",{guild,channel,user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
const reason = instance.options.getString("reason",false)
|
||||||
|
|
||||||
|
//start unpinning ticket
|
||||||
|
await instance.defer(false)
|
||||||
|
await openticket.actions.get("openticket:unpin-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.reply(await openticket.builders.messages.getSafe("openticket:unpin-message").build(source,{guild,channel,user,ticket,reason}))
|
||||||
|
}),
|
||||||
|
new api.ODWorker("openticket:logs",-1,(instance,params,source,cancel) => {
|
||||||
|
openticket.log(instance.user.displayName+" used the 'unpin' command!","info",[
|
||||||
|
{key:"user",value:instance.user.username},
|
||||||
|
{key:"userid",value:instance.user.id,hidden:true},
|
||||||
|
{key:"channelid",value:instance.channel.id,hidden:true},
|
||||||
|
{key:"method",value:source}
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerButtonResponders = async () => {
|
||||||
|
//UNPIN TICKET BUTTON RESPONDER
|
||||||
|
openticket.responders.buttons.add(new api.ODButtonResponder("openticket:unpin-ticket",/^od:unpin-ticket/))
|
||||||
|
openticket.responders.buttons.get("openticket:unpin-ticket").workers.add(
|
||||||
|
new api.ODWorker("openticket:unpin-ticket",0,async (instance,params,source,cancel) => {
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[1]
|
||||||
|
if (originalSource != "ticket-message" && originalSource != "pin-message") return
|
||||||
|
|
||||||
|
if (originalSource == "ticket-message") await openticket.verifybars.get("openticket:unpin-ticket-ticket-message").activate(instance)
|
||||||
|
else await openticket.verifybars.get("openticket:unpin-ticket-pin-message").activate(instance)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const registerModalResponders = async () => {
|
||||||
|
//UNPIN WITH REASON MODAL RESPONDER
|
||||||
|
openticket.responders.modals.add(new api.ODModalResponder("openticket:unpin-ticket-reason",/^od:unpin-ticket-reason_/))
|
||||||
|
openticket.responders.modals.get("openticket:unpin-ticket-reason").workers.add([
|
||||||
|
new api.ODWorker("openticket:unpin-ticket-reason",0,async (instance,params,source,cancel) => {
|
||||||
|
const {guild,channel,user} = instance
|
||||||
|
if (!channel) return
|
||||||
|
if (!guild){
|
||||||
|
//error
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-not-in-guild").build(source,{channel,user:instance.user}))
|
||||||
|
return cancel()
|
||||||
|
}
|
||||||
|
const ticket = openticket.tickets.get(instance.interaction.customId.split("_")[1])
|
||||||
|
if (!ticket || channel.isDMBased()){
|
||||||
|
instance.reply(await openticket.builders.messages.getSafe("openticket:error-ticket-unknown").build("button",{guild,channel,user}))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const originalSource = instance.interaction.customId.split("_")[2] as ("ticket-message"|"pin-message"|"other")
|
||||||
|
const reason = instance.values.getTextField("reason",true)
|
||||||
|
|
||||||
|
//unpin with reason
|
||||||
|
if (originalSource == "ticket-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:ticket-message").build("other",{guild,channel,user,ticket}))
|
||||||
|
}else if (originalSource == "pin-message"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:false})
|
||||||
|
await instance.update(await openticket.builders.messages.getSafe("openticket:unpin-message").build("other",{guild,channel,user,ticket,reason}))
|
||||||
|
}else if (originalSource == "other"){
|
||||||
|
await instance.defer("update",false)
|
||||||
|
await openticket.actions.get("openticket:unpin-ticket").run(originalSource,{guild,channel,user,ticket,reason,sendMessage:true})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
//MAIN MODULE
|
||||||
|
export * from "./main"
|
||||||
|
|
||||||
|
//BASE MODULES
|
||||||
|
export * from "./modules/base"
|
||||||
|
export * from "./modules/event"
|
||||||
|
export * from "./modules/config"
|
||||||
|
export * from "./modules/database"
|
||||||
|
export * from "./modules/language"
|
||||||
|
export * from "./modules/flag"
|
||||||
|
export * from "./modules/console"
|
||||||
|
export * from "./modules/defaults"
|
||||||
|
export * from "./modules/plugin"
|
||||||
|
export * from "./modules/checker"
|
||||||
|
export * from "./modules/client"
|
||||||
|
export * from "./modules/worker"
|
||||||
|
export * from "./modules/builder"
|
||||||
|
export * from "./modules/responder"
|
||||||
|
export * from "./modules/action"
|
||||||
|
export * from "./modules/permission"
|
||||||
|
export * from "./modules/helpmenu"
|
||||||
|
export * from "./modules/session"
|
||||||
|
export * from "./modules/stat"
|
||||||
|
export * from "./modules/code"
|
||||||
|
export * from "./modules/cooldown"
|
||||||
|
export * from "./modules/post"
|
||||||
|
export * from "./modules/verifybar"
|
||||||
|
export * from "./modules/startscreen"
|
||||||
|
|
||||||
|
//OPENTICKET DEFAULT MODULES
|
||||||
|
export * from "./defaults/base"
|
||||||
|
export * from "./defaults/event"
|
||||||
|
export * from "./defaults/config"
|
||||||
|
export * from "./defaults/database"
|
||||||
|
export * from "./defaults/checker"
|
||||||
|
export * from "./defaults/client"
|
||||||
|
export * from "./defaults/language"
|
||||||
|
export * from "./defaults/builder"
|
||||||
|
export * from "./defaults/responder"
|
||||||
|
export * from "./defaults/action"
|
||||||
|
export * from "./defaults/flag"
|
||||||
|
export * from "./defaults/permission"
|
||||||
|
export * from "./defaults/helpmenu"
|
||||||
|
export * from "./defaults/session"
|
||||||
|
export * from "./defaults/stat"
|
||||||
|
export * from "./defaults/worker"
|
||||||
|
export * from "./defaults/code"
|
||||||
|
export * from "./defaults/cooldown"
|
||||||
|
export * from "./defaults/post"
|
||||||
|
export * from "./defaults/startscreen"
|
||||||
|
export * from "./defaults/console"
|
||||||
|
|
||||||
|
//OPENTICKET MODULES
|
||||||
|
export * from "./openticket/question"
|
||||||
|
export * from "./openticket/option"
|
||||||
|
export * from "./openticket/panel"
|
||||||
|
export * from "./openticket/ticket"
|
||||||
|
export * from "./openticket/blacklist"
|
||||||
|
export * from "./openticket/transcript"
|
||||||
|
export * from "./openticket/role"
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT ACTION MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODAction, ODActionManager } from "../modules/action"
|
||||||
|
import { ODWorkerManager_Default } from "./worker"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
import { ODRoleOption, ODTicketOption } from "../openticket/option"
|
||||||
|
import { ODTicket, ODTicketClearFilter } from "../openticket/ticket"
|
||||||
|
import { ODTranscriptCompiler, ODTranscriptCompilerCompileResult } from "../openticket/transcript"
|
||||||
|
import { ODMessageBuildSentResult } from "../modules/builder"
|
||||||
|
import { ODRole, OTRoleUpdateMode, OTRoleUpdateResult } from "../openticket/role"
|
||||||
|
|
||||||
|
/**## ODActionManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODActionManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODActionManagerIds_Default {
|
||||||
|
"openticket:create-ticket-permissions":{
|
||||||
|
source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,user:discord.User,option:ODTicketOption},
|
||||||
|
result:{valid:boolean,reason:"blacklist"|"cooldown"|"global-limit"|"global-user-limit"|"option-limit"|"option-user-limit"|null,cooldownUntil?:Date},
|
||||||
|
workers:"openticket:check-blacklist"|"openticket:check-cooldown"|"openticket:check-global-limits"|"openticket:check-option-limits"|"openticket:valid"
|
||||||
|
},
|
||||||
|
"openticket:create-transcript":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},
|
||||||
|
result:{compiler:ODTranscriptCompiler<any>, success:boolean, result:ODTranscriptCompilerCompileResult<any>, errorReason:string|null, pendingMessage:ODMessageBuildSentResult<true>|null, participants:{user:discord.User,role:"creator"|"participant"|"admin"}[]},
|
||||||
|
workers:"openticket:select-compiler"|"openticket:init-transcript"|"openticket:compile-transcript"|"openticket:ready-transcript"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:create-ticket":{
|
||||||
|
source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,user:discord.User,option:ODTicketOption,answers:{id:string,name:string,type:"short"|"paragraph",value:string|null}[]},
|
||||||
|
result:{channel:discord.GuildTextBasedChannel,ticket:ODTicket},
|
||||||
|
workers:"openticket:create-ticket"|"openticket:send-ticket-message"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:close-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:close-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:delete-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,withoutTranscript:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:delete-ticket"|"openticket:discord-logs"|"openticket:delete-channel"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:reopen-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:reopen-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:claim-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"unclaim-message"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:claim-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:unclaim-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"claim-message"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:unclaim-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:pin-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"unpin-message"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:pin-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:unpin-ticket":{
|
||||||
|
source:"slash"|"text"|"ticket-message"|"pin-message"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:unpin-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:rename-ticket":{
|
||||||
|
source:"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,data:string},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:rename-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:move-ticket":{
|
||||||
|
source:"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,data:ODTicketOption},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:move-ticket"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:add-ticket-user":{
|
||||||
|
source:"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,data:discord.User},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:add-ticket-user"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:remove-ticket-user":{
|
||||||
|
source:"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,data:discord.User},
|
||||||
|
result:{},
|
||||||
|
workers:"openticket:remove-ticket-user"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:reaction-role":{
|
||||||
|
source:"panel-button"|"other",
|
||||||
|
params:{guild:discord.Guild,user:discord.User,option:ODRoleOption,overwriteMode:OTRoleUpdateMode|null},
|
||||||
|
result:{result:OTRoleUpdateResult[],role:ODRole},
|
||||||
|
workers:"openticket:reaction-role"|"openticket:logs"
|
||||||
|
},
|
||||||
|
"openticket:clear-tickets":{
|
||||||
|
source:"slash"|"text"|"other",
|
||||||
|
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:ODTicket[]},
|
||||||
|
result:{list:string[]},
|
||||||
|
workers:"openticket:clear-tickets"|"openticket:discord-logs"|"openticket:logs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODActionManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODActionManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.actions`!
|
||||||
|
*/
|
||||||
|
export class ODActionManager_Default extends ODActionManager {
|
||||||
|
get<ActionId extends keyof ODActionManagerIds_Default>(id:ActionId): ODAction_Default<ODActionManagerIds_Default[ActionId]["source"],ODActionManagerIds_Default[ActionId]["params"],ODActionManagerIds_Default[ActionId]["result"],ODActionManagerIds_Default[ActionId]["workers"]>
|
||||||
|
get(id:ODValidId): ODAction<string,any,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODAction<string,any,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<ActionId extends keyof ODActionManagerIds_Default>(id:ActionId): ODAction_Default<ODActionManagerIds_Default[ActionId]["source"],ODActionManagerIds_Default[ActionId]["params"],ODActionManagerIds_Default[ActionId]["result"],ODActionManagerIds_Default[ActionId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODAction<string,any,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODAction<string,any,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODActionManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODAction_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODAction class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODAction`'s!
|
||||||
|
*/
|
||||||
|
export class ODAction_Default<Source extends string, Params extends object, Result extends object, WorkerIds extends string> extends ODAction<Source,Params,Result> {
|
||||||
|
declare workers: ODWorkerManager_Default<Result,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//BASE MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODVersion, ODVersionManager, ODValidId } from "../modules/base"
|
||||||
|
|
||||||
|
/**## ODVersionManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODVersionManager` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODVersionManagerIds_Default {
|
||||||
|
"openticket:version":ODVersion,
|
||||||
|
"openticket:last-version":ODVersion,
|
||||||
|
"openticket:api":ODVersion,
|
||||||
|
"openticket:transcripts":ODVersion,
|
||||||
|
"openticket:livestatus":ODVersion
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFlagManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFlagManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.flags`!
|
||||||
|
*/
|
||||||
|
export class ODVersionManager_Default extends ODVersionManager {
|
||||||
|
get<VersionId extends keyof ODVersionManagerIds_Default>(id:VersionId): ODVersionManagerIds_Default[VersionId]
|
||||||
|
get(id:ODValidId): ODVersion|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODVersion|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<VersionId extends keyof ODVersionManagerIds_Default>(id:VersionId): ODVersionManagerIds_Default[VersionId]
|
||||||
|
remove(id:ODValidId): ODVersion|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODVersion|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODVersionManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,532 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT BUILDER MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidButtonColor, ODValidId } from "../modules/base"
|
||||||
|
import { ODBuilderManager, ODButton, ODButtonInstance, ODButtonManager, ODDropdown, ODDropdownInstance, ODDropdownManager, ODEmbed, ODEmbedInstance, ODEmbedManager, ODFile, ODFileInstance, ODFileManager, ODMessage, ODMessageInstance, ODMessageManager, ODModal, ODModalInstance, ODModalManager } from "../modules/builder"
|
||||||
|
import { ODWorkerManager_Default } from "./worker"
|
||||||
|
import { ODTicket, ODTicketClearFilter } from "../openticket/ticket"
|
||||||
|
import { ODPermissionEmbedType } from "../defaults/permission"
|
||||||
|
import { ODTextCommandErrorInvalidOption, ODTextCommandErrorMissingOption, ODTextCommandErrorUnknownCommand } from "../modules/client"
|
||||||
|
import { ODPanel } from "../openticket/panel"
|
||||||
|
import { ODRoleOption, ODTicketOption, ODWebsiteOption } from "../openticket/option"
|
||||||
|
import { ODVerifyBar } from "../modules/verifybar"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
import { ODTranscriptCompiler, ODTranscriptCompilerCompileResult } from "../openticket/transcript"
|
||||||
|
import { ODRole, OTRoleUpdateResult } from "../openticket/role"
|
||||||
|
|
||||||
|
/**## ODBuilderManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODBuilderManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders`!
|
||||||
|
*/
|
||||||
|
export class ODBuilderManager_Default extends ODBuilderManager {
|
||||||
|
declare buttons: ODButtonManager_Default
|
||||||
|
declare dropdowns: ODDropdownManager_Default
|
||||||
|
declare files: ODFileManager_Default
|
||||||
|
declare embeds: ODEmbedManager_Default
|
||||||
|
declare messages: ODMessageManager_Default
|
||||||
|
declare modals: ODModalManager_Default
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODButtonManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODButtonManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODButtonManagerIds_Default {
|
||||||
|
"openticket:verifybar-success":{source:"verifybar"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,customData?:string,customColor?:ODValidButtonColor,customLabel?:string,customEmoji?:string},workers:"openticket:verifybar-success"},
|
||||||
|
"openticket:verifybar-failure":{source:"verifybar"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,customData?:string,customColor?:ODValidButtonColor,customLabel?:string,customEmoji?:string},workers:"openticket:verifybar-failure"},
|
||||||
|
|
||||||
|
"openticket:error-ticket-deprecated-transcript":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{},workers:"openticket:error-ticket-deprecated-transcript"},
|
||||||
|
|
||||||
|
"openticket:help-menu-previous":{source:"text"|"slash"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"openticket:help-menu-previous"},
|
||||||
|
"openticket:help-menu-next":{source:"text"|"slash"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"openticket:help-menu-next"},
|
||||||
|
"openticket:help-menu-page":{source:"text"|"slash"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"openticket:help-menu-page"}
|
||||||
|
"openticket:help-menu-switch":{source:"text"|"slash"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"openticket:help-menu-switch"},
|
||||||
|
|
||||||
|
"openticket:ticket-option":{source:"slash"|"text"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel,option:ODTicketOption},workers:"openticket:ticket-option"},
|
||||||
|
"openticket:website-option":{source:"slash"|"text"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel,option:ODWebsiteOption},workers:"openticket:website-option"},
|
||||||
|
"openticket:role-option":{source:"slash"|"text"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel,option:ODRoleOption},workers:"openticket:role-option"}
|
||||||
|
|
||||||
|
"openticket:visit-ticket":{source:"ticket-created"|"dm"|"logs"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:visit-ticket"},
|
||||||
|
|
||||||
|
"openticket:close-ticket":{source:"ticket-message"|"reopen-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:close-ticket"},
|
||||||
|
"openticket:delete-ticket":{source:"ticket-message"|"close-message"|"autoclose-message"|"reopen-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:delete-ticket"},
|
||||||
|
"openticket:reopen-ticket":{source:"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:reopen-ticket"},
|
||||||
|
"openticket:claim-ticket":{source:"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:claim-ticket"},
|
||||||
|
"openticket:unclaim-ticket":{source:"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:unclaim-ticket"},
|
||||||
|
"openticket:pin-ticket":{source:"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:pin-ticket"},
|
||||||
|
"openticket:unpin-ticket":{source:"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:unpin-ticket"},
|
||||||
|
|
||||||
|
"openticket:transcript-html-visit":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,result:ODTranscriptCompilerCompileResult<{url:string}>},workers:"openticket:transcript-html-visit"},
|
||||||
|
"openticket:transcript-error-retry":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"openticket:transcript-error-retry"},
|
||||||
|
"openticket:transcript-error-continue":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"openticket:transcript-error-continue"},
|
||||||
|
|
||||||
|
"openticket:clear-continue":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-continue"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODButtonManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODButtonManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders.buttons`!
|
||||||
|
*/
|
||||||
|
export class ODButtonManager_Default extends ODButtonManager {
|
||||||
|
get<ButtonId extends keyof ODButtonManagerIds_Default>(id:ButtonId): ODButton_Default<ODButtonManagerIds_Default[ButtonId]["source"],ODButtonManagerIds_Default[ButtonId]["params"],ODButtonManagerIds_Default[ButtonId]["workers"]>
|
||||||
|
get(id:ODValidId): ODButton<string,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODButton<string,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<ButtonId extends keyof ODButtonManagerIds_Default>(id:ButtonId): ODButton_Default<ODButtonManagerIds_Default[ButtonId]["source"],ODButtonManagerIds_Default[ButtonId]["params"],ODButtonManagerIds_Default[ButtonId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODButton<string,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODButton<string,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODButtonManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getSafe<ButtonId extends keyof ODButtonManagerIds_Default>(id:ButtonId): ODButton_Default<ODButtonManagerIds_Default[ButtonId]["source"],ODButtonManagerIds_Default[ButtonId]["params"],ODButtonManagerIds_Default[ButtonId]["workers"]>
|
||||||
|
getSafe(id:ODValidId): ODButton<string,any>
|
||||||
|
|
||||||
|
getSafe(id:ODValidId): ODButton<string,any> {
|
||||||
|
return super.getSafe(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODButton_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODButton class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODButton`'s!
|
||||||
|
*/
|
||||||
|
export class ODButton_Default<Source extends string, Params, WorkerIds extends string> extends ODButton<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODButtonInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDropdownManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODDropdownManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODDropdownManagerIds_Default {
|
||||||
|
"openticket:panel-dropdown-tickets":{source:"slash"|"text"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel,options:ODTicketOption[]},workers:"openticket:panel-dropdown-tickets"}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDropdownManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODDropdownManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders.dropdowns`!
|
||||||
|
*/
|
||||||
|
export class ODDropdownManager_Default extends ODDropdownManager {
|
||||||
|
get<DropdownId extends keyof ODDropdownManagerIds_Default>(id:DropdownId): ODDropdown_Default<ODDropdownManagerIds_Default[DropdownId]["source"],ODDropdownManagerIds_Default[DropdownId]["params"],ODDropdownManagerIds_Default[DropdownId]["workers"]>
|
||||||
|
get(id:ODValidId): ODDropdown<string,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODDropdown<string,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<DropdownId extends keyof ODDropdownManagerIds_Default>(id:DropdownId): ODDropdown_Default<ODDropdownManagerIds_Default[DropdownId]["source"],ODDropdownManagerIds_Default[DropdownId]["params"],ODDropdownManagerIds_Default[DropdownId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODDropdown<string,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODDropdown<string,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODDropdownManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getSafe<DropdownId extends keyof ODDropdownManagerIds_Default>(id:DropdownId): ODDropdown_Default<ODDropdownManagerIds_Default[DropdownId]["source"],ODDropdownManagerIds_Default[DropdownId]["params"],ODDropdownManagerIds_Default[DropdownId]["workers"]>
|
||||||
|
getSafe(id:ODValidId): ODDropdown<string,any>
|
||||||
|
|
||||||
|
getSafe(id:ODValidId): ODDropdown<string,any> {
|
||||||
|
return super.getSafe(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDropdown_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODDropdown class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODDropdown`'s!
|
||||||
|
*/
|
||||||
|
export class ODDropdown_Default<Source extends string, Params, WorkerIds extends string> extends ODDropdown<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODDropdownInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFileManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODFileManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODFileManagerIds_Default {
|
||||||
|
"openticket:text-transcript":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,result:ODTranscriptCompilerCompileResult<any>},workers:"openticket:text-transcript"}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFileManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFileManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders.files`!
|
||||||
|
*/
|
||||||
|
export class ODFileManager_Default extends ODFileManager {
|
||||||
|
get<FileId extends keyof ODFileManagerIds_Default>(id:FileId): ODFile_Default<ODFileManagerIds_Default[FileId]["source"],ODFileManagerIds_Default[FileId]["params"],ODFileManagerIds_Default[FileId]["workers"]>
|
||||||
|
get(id:ODValidId): ODFile<string,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODFile<string,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<FileId extends keyof ODFileManagerIds_Default>(id:FileId): ODFile_Default<ODFileManagerIds_Default[FileId]["source"],ODFileManagerIds_Default[FileId]["params"],ODFileManagerIds_Default[FileId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODFile<string,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODFile<string,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODFileManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getSafe<FileId extends keyof ODFileManagerIds_Default>(id:FileId): ODFile_Default<ODFileManagerIds_Default[FileId]["source"],ODFileManagerIds_Default[FileId]["params"],ODFileManagerIds_Default[FileId]["workers"]>
|
||||||
|
getSafe(id:ODValidId): ODFile<string,any>
|
||||||
|
|
||||||
|
getSafe(id:ODValidId): ODFile<string,any> {
|
||||||
|
return super.getSafe(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFile_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFile class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODFile`'s!
|
||||||
|
*/
|
||||||
|
export class ODFile_Default<Source extends string, Params, WorkerIds extends string> extends ODFile<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODFileInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODEmbedManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODEmbedManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODEmbedManagerIds_Default {
|
||||||
|
"openticket:error":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:string,layout:"simple"|"advanced"},workers:"openticket:error"},
|
||||||
|
"openticket:error-option-missing":{source:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:ODTextCommandErrorMissingOption},workers:"openticket:error-option-missing"},
|
||||||
|
"openticket:error-option-invalid":{source:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:ODTextCommandErrorInvalidOption},workers:"openticket:error-option-invalid"},
|
||||||
|
"openticket:error-unknown-command":{source:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:ODTextCommandErrorUnknownCommand},workers:"openticket:error-unknown-command"},
|
||||||
|
"openticket:error-no-permissions":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,permissions:ODPermissionEmbedType[]},workers:"openticket:error-no-permissions"},
|
||||||
|
"openticket:error-no-permissions-cooldown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,until?:Date},workers:"openticket:error-no-permissions-cooldown"},
|
||||||
|
"openticket:error-no-permissions-blacklisted":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-no-permissions-blacklisted"},
|
||||||
|
"openticket:error-no-permissions-limits":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,limit:"global"|"global-user"|"option"|"option-user"},workers:"openticket:error-no-permissions-limits"},
|
||||||
|
"openticket:error-responder-timeout":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-responder-timeout"},
|
||||||
|
"openticket:error-ticket-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-ticket-unknown"},
|
||||||
|
"openticket:error-ticket-deprecated":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-ticket-deprecated"},
|
||||||
|
"openticket:error-option-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-option-unknown"},
|
||||||
|
"openticket:error-panel-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-panel-unknown"},
|
||||||
|
"openticket:error-not-in-guild":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-not-in-guild"},
|
||||||
|
"openticket:error-channel-rename":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"openticket:error-channel-rename"},
|
||||||
|
"openticket:error-ticket-busy":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-ticket-busy"},
|
||||||
|
|
||||||
|
"openticket:help-menu":{source:"text"|"slash"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"openticket:help-menu"},
|
||||||
|
|
||||||
|
"openticket:stats-global":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:stats-global"},
|
||||||
|
"openticket:stats-ticket":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,scopeData:ODTicket},workers:"openticket:stats-ticket"},
|
||||||
|
"openticket:stats-user":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,scopeData:discord.User},workers:"openticket:stats-user"|"openticket:easter-egg"},
|
||||||
|
"openticket:stats-reset":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,reason:string|null},workers:"openticket:stats-reset"},
|
||||||
|
"openticket:stats-ticket-unknown":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,id:string},workers:"openticket:stats-ticket-unknown"},
|
||||||
|
|
||||||
|
"openticket:panel":{source:"slash"|"text"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel},workers:"openticket:panel"},
|
||||||
|
"openticket:ticket-created":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-created"},
|
||||||
|
"openticket:ticket-created-dm":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-created-dm"},
|
||||||
|
"openticket:ticket-created-logs":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-created-logs"},
|
||||||
|
"openticket:ticket-message":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-message"},
|
||||||
|
"openticket:close-message":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:close-message"},
|
||||||
|
"openticket:reopen-message":{source:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:reopen-message"},
|
||||||
|
"openticket:delete-message":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:delete-message"},
|
||||||
|
"openticket:claim-message":{source:"slash"|"text"|"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:claim-message"},
|
||||||
|
"openticket:unclaim-message":{source:"slash"|"text"|"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:unclaim-message"},
|
||||||
|
"openticket:pin-message":{source:"slash"|"text"|"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:pin-message"},
|
||||||
|
"openticket:unpin-message":{source:"slash"|"text"|"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:unpin-message"},
|
||||||
|
"openticket:rename-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:string},workers:"openticket:rename-message"},
|
||||||
|
"openticket:move-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:ODTicketOption},workers:"openticket:move-message"},
|
||||||
|
"openticket:add-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:discord.User},workers:"openticket:add-message"},
|
||||||
|
"openticket:remove-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:discord.User},workers:"openticket:remove-message"},
|
||||||
|
"openticket:ticket-action-dm":{source:"slash"|"text"|"ticket-message"|"close-message"|"reopen-message"|"delete-message"|"claim-message"|"unclaim-message"|"pin-message"|"unpin-message"|"autoclose-message"|"autoclose"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"close"|"reopen"|"delete"|"claim"|"unclaim"|"pin"|"unpin"|"rename"|"move"|"add"|"remove",ticket:ODTicket,reason:string|null,additionalData:null|string|discord.User|ODTicketOption},workers:"openticket:ticket-action-dm"},
|
||||||
|
"openticket:ticket-action-logs":{source:"slash"|"text"|"ticket-message"|"close-message"|"reopen-message"|"delete-message"|"claim-message"|"unclaim-message"|"pin-message"|"unpin-message"|"autoclose-message"|"autoclose"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"close"|"reopen"|"delete"|"claim"|"unclaim"|"pin"|"unpin"|"rename"|"move"|"add"|"remove",ticket:ODTicket,reason:string|null,additionalData:null|string|discord.User|ODTicketOption},workers:"openticket:ticket-action-logs"},
|
||||||
|
|
||||||
|
"openticket:blacklist-view":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:blacklist-view"},
|
||||||
|
"openticket:blacklist-get":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,data:discord.User},workers:"openticket:blacklist-get"},
|
||||||
|
"openticket:blacklist-add":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,data:discord.User,reason:string|null},workers:"openticket:blacklist-add"},
|
||||||
|
"openticket:blacklist-remove":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,data:discord.User,reason:string|null},workers:"openticket:blacklist-remove"}
|
||||||
|
"openticket:blacklist-dm":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"openticket:blacklist-dm"},
|
||||||
|
"openticket:blacklist-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"openticket:blacklist-logs"},
|
||||||
|
|
||||||
|
"openticket:transcript-text-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{contents:string}>,result:ODTranscriptCompilerCompileResult<{contents:string}>},workers:"openticket:transcript-text-ready"},
|
||||||
|
"openticket:transcript-html-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,result:ODTranscriptCompilerCompileResult<{url:string}>},workers:"openticket:transcript-html-ready"},
|
||||||
|
"openticket:transcript-html-progress":{source:"channel"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,remaining:number},workers:"openticket:transcript-html-progress"},
|
||||||
|
"openticket:transcript-error":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"openticket:transcript-error"},
|
||||||
|
|
||||||
|
"openticket:reaction-role":{source:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:OTRoleUpdateResult[]},workers:"openticket:reaction-role"},
|
||||||
|
"openticket:clear-verify-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-verify-message"},
|
||||||
|
"openticket:clear-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-message"},
|
||||||
|
"openticket:clear-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-logs"},
|
||||||
|
|
||||||
|
"openticket:autoclose-message":{source:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:autoclose-message"},
|
||||||
|
"openticket:autodelete-message":{source:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:autodelete-message"},
|
||||||
|
"openticket:autoclose-enable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"openticket:autoclose-enable"},
|
||||||
|
"openticket:autodelete-enable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"openticket:autodelete-enable"},
|
||||||
|
"openticket:autoclose-disable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:autoclose-disable"},
|
||||||
|
"openticket:autodelete-disable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:autodelete-disable"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODEmbedManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODEmbedManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders.embeds`!
|
||||||
|
*/
|
||||||
|
export class ODEmbedManager_Default extends ODEmbedManager {
|
||||||
|
get<EmbedId extends keyof ODEmbedManagerIds_Default>(id:EmbedId): ODEmbed_Default<ODEmbedManagerIds_Default[EmbedId]["source"],ODEmbedManagerIds_Default[EmbedId]["params"],ODEmbedManagerIds_Default[EmbedId]["workers"]>
|
||||||
|
get(id:ODValidId): ODEmbed<string,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODEmbed<string,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<EmbedId extends keyof ODEmbedManagerIds_Default>(id:EmbedId): ODEmbed_Default<ODEmbedManagerIds_Default[EmbedId]["source"],ODEmbedManagerIds_Default[EmbedId]["params"],ODEmbedManagerIds_Default[EmbedId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODEmbed<string,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODEmbed<string,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODEmbedManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getSafe<EmbedId extends keyof ODEmbedManagerIds_Default>(id:EmbedId): ODEmbed_Default<ODEmbedManagerIds_Default[EmbedId]["source"],ODEmbedManagerIds_Default[EmbedId]["params"],ODEmbedManagerIds_Default[EmbedId]["workers"]>
|
||||||
|
getSafe(id:ODValidId): ODEmbed<string,any>
|
||||||
|
|
||||||
|
getSafe(id:ODValidId): ODEmbed<string,any> {
|
||||||
|
return super.getSafe(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODEmbed_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODEmbed class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODEmbed`'s!
|
||||||
|
*/
|
||||||
|
export class ODEmbed_Default<Source extends string, Params, WorkerIds extends string> extends ODEmbed<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODEmbedInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODMessageManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODMessageManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODMessageManagerIds_Default {
|
||||||
|
"openticket:verifybar-ticket-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-ticket-message"},
|
||||||
|
"openticket:verifybar-close-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-close-message"},
|
||||||
|
"openticket:verifybar-reopen-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-reopen-message"},
|
||||||
|
"openticket:verifybar-claim-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-claim-message"},
|
||||||
|
"openticket:verifybar-unclaim-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-unclaim-message"},
|
||||||
|
"openticket:verifybar-pin-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-pin-message"},
|
||||||
|
"openticket:verifybar-unpin-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-unpin-message"}
|
||||||
|
"openticket:verifybar-autoclose-message":{source:"verifybar",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,verifybar:ODVerifyBar,originalMessage:discord.Message<boolean>},workers:"openticket:verifybar-autoclose-message"}
|
||||||
|
|
||||||
|
"openticket:error":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:string,layout:"simple"|"advanced"},workers:"openticket:error"},
|
||||||
|
"openticket:error-option-missing":{source:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:ODTextCommandErrorMissingOption},workers:"openticket:error-option-missing"},
|
||||||
|
"openticket:error-option-invalid":{source:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:ODTextCommandErrorInvalidOption},workers:"openticket:error-option-invalid"},
|
||||||
|
"openticket:error-unknown-command":{source:"slash"|"text"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,error:ODTextCommandErrorUnknownCommand},workers:"openticket:error-unknown-command"},
|
||||||
|
"openticket:error-no-permissions":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,permissions:ODPermissionEmbedType[]},workers:"openticket:error-no-permissions"},
|
||||||
|
"openticket:error-no-permissions-cooldown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,until?:Date},workers:"openticket:error-no-permissions-cooldown"},
|
||||||
|
"openticket:error-no-permissions-blacklisted":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-no-permissions-blacklisted"},
|
||||||
|
"openticket:error-no-permissions-limits":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,limit:"global"|"global-user"|"option"|"option-user"},workers:"openticket:error-no-permissions-limits"},
|
||||||
|
"openticket:error-responder-timeout":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-responder-timeout"},
|
||||||
|
"openticket:error-ticket-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-ticket-unknown"},
|
||||||
|
"openticket:error-ticket-deprecated":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-ticket-deprecated"},
|
||||||
|
"openticket:error-option-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-option-unknown"},
|
||||||
|
"openticket:error-panel-unknown":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-panel-unknown"},
|
||||||
|
"openticket:error-not-in-guild":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-not-in-guild"},
|
||||||
|
"openticket:error-channel-rename":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"ticket-pin"|"ticket-unpin"|"ticket-rename"|"ticket-move"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User,originalName:string,newName:string},workers:"openticket:error-channel-rename"},
|
||||||
|
"openticket:error-ticket-busy":{source:"slash"|"text"|"button"|"dropdown"|"modal"|"other",params:{guild:discord.Guild|null,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:error-ticket-busy"},
|
||||||
|
|
||||||
|
"openticket:help-menu":{source:"slash"|"text"|"button"|"other",params:{mode:"slash"|"text",page:number},workers:"openticket:help-menu"},
|
||||||
|
|
||||||
|
"openticket:stats-global":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:stats-global"},
|
||||||
|
"openticket:stats-ticket":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,scopeData:ODTicket},workers:"openticket:stats-ticket"},
|
||||||
|
"openticket:stats-user":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,scopeData:discord.User},workers:"openticket:stats-user"|"openticket:easter-egg"},
|
||||||
|
"openticket:stats-reset":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,reason:string|null},workers:"openticket:stats-reset"},
|
||||||
|
"openticket:stats-ticket-unknown":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,id:string},workers:"openticket:stats-ticket-unknown"},
|
||||||
|
|
||||||
|
"openticket:panel":{source:"slash"|"text"|"auto-update"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel},workers:"openticket:panel-layout"|"openticket:panel-components"},
|
||||||
|
"openticket:panel-ready":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,panel:ODPanel},workers:"openticket:panel-ready"},
|
||||||
|
|
||||||
|
"openticket:ticket-created":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-created"},
|
||||||
|
"openticket:ticket-created-dm":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-created-dm"},
|
||||||
|
"openticket:ticket-created-logs":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-created-logs"},
|
||||||
|
"openticket:ticket-message":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:ticket-message-layout"|"openticket:ticket-message-components"|"openticket:ticket-message-disable-components"},
|
||||||
|
"openticket:close-message":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:close-message"},
|
||||||
|
"openticket:reopen-message":{source:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:reopen-message"},
|
||||||
|
"openticket:delete-message":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:delete-message"},
|
||||||
|
"openticket:claim-message":{source:"slash"|"text"|"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:claim-message"},
|
||||||
|
"openticket:unclaim-message":{source:"slash"|"text"|"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:unclaim-message"},
|
||||||
|
"openticket:pin-message":{source:"slash"|"text"|"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:pin-message"},
|
||||||
|
"openticket:unpin-message":{source:"slash"|"text"|"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:unpin-message"},
|
||||||
|
"openticket:rename-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:string},workers:"openticket:rename-message"},
|
||||||
|
"openticket:move-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:ODTicketOption},workers:"openticket:move-message"},
|
||||||
|
"openticket:add-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:discord.User},workers:"openticket:add-message"},
|
||||||
|
"openticket:remove-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,data:discord.User},workers:"openticket:remove-message"},
|
||||||
|
"openticket:ticket-action-dm":{source:"slash"|"text"|"ticket-message"|"close-message"|"reopen-message"|"delete-message"|"claim-message"|"unclaim-message"|"pin-message"|"unpin-message"|"autoclose-message"|"autoclose"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"close"|"reopen"|"delete"|"claim"|"unclaim"|"pin"|"unpin"|"rename"|"move"|"add"|"remove",ticket:ODTicket,reason:string|null,additionalData:null|string|discord.User|ODTicketOption},workers:"openticket:ticket-action-dm"},
|
||||||
|
"openticket:ticket-action-logs":{source:"slash"|"text"|"ticket-message"|"close-message"|"reopen-message"|"delete-message"|"claim-message"|"unclaim-message"|"pin-message"|"unpin-message"|"autoclose-message"|"autoclose"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"close"|"reopen"|"delete"|"claim"|"unclaim"|"pin"|"unpin"|"rename"|"move"|"add"|"remove",ticket:ODTicket,reason:string|null,additionalData:null|string|discord.User|ODTicketOption},workers:"openticket:ticket-action-logs"},
|
||||||
|
|
||||||
|
"openticket:blacklist-view":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User},workers:"openticket:blacklist-view"},
|
||||||
|
"openticket:blacklist-get":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,data:discord.User},workers:"openticket:blacklist-get"},
|
||||||
|
"openticket:blacklist-add":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,data:discord.User,reason:string|null},workers:"openticket:blacklist-add"},
|
||||||
|
"openticket:blacklist-remove":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,data:discord.User,reason:string|null},workers:"openticket:blacklist-remove"},
|
||||||
|
"openticket:blacklist-dm":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"openticket:blacklist-dm"},
|
||||||
|
"openticket:blacklist-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,mode:"add"|"remove",data:discord.User,reason:string|null},workers:"openticket:blacklist-logs"},
|
||||||
|
|
||||||
|
"openticket:transcript-text-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{contents:string}>,result:ODTranscriptCompilerCompileResult<{contents:string}>},workers:"openticket:transcript-text-ready"},
|
||||||
|
"openticket:transcript-html-ready":{source:"channel"|"creator-dm"|"participant-dm"|"active-admin-dm"|"every-admin-dm"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,result:ODTranscriptCompilerCompileResult<{url:string}>},workers:"openticket:transcript-html-ready"},
|
||||||
|
"openticket:transcript-html-progress":{source:"channel"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<{url:string}>,remaining:number},workers:"openticket:transcript-html-progress"},
|
||||||
|
"openticket:transcript-error":{source:"slash"|"text"|"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"autodelete"|"clear"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,compiler:ODTranscriptCompiler<any>,reason:string|null},workers:"openticket:transcript-error"},
|
||||||
|
|
||||||
|
"openticket:reaction-role":{source:"panel-button"|"other",params:{guild:discord.Guild,user:discord.User,role:ODRole,result:OTRoleUpdateResult[]},workers:"openticket:reaction-role"},
|
||||||
|
"openticket:clear-verify-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-verify-message"},
|
||||||
|
"openticket:clear-message":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-message"},
|
||||||
|
"openticket:clear-logs":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,filter:ODTicketClearFilter,list:string[]},workers:"openticket:clear-logs"},
|
||||||
|
|
||||||
|
"openticket:autoclose-message":{source:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:autoclose-message"},
|
||||||
|
"openticket:autodelete-message":{source:"timeout"|"leave"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:autodelete-message"},
|
||||||
|
"openticket:autoclose-enable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"openticket:autoclose-enable"},
|
||||||
|
"openticket:autodelete-enable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,time:number,reason:string|null},workers:"openticket:autodelete-enable"},
|
||||||
|
"openticket:autoclose-disable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:autoclose-disable"},
|
||||||
|
"openticket:autodelete-disable":{source:"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null},workers:"openticket:autodelete-disable"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODMessageManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODMessageManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders.messages`!
|
||||||
|
*/
|
||||||
|
export class ODMessageManager_Default extends ODMessageManager {
|
||||||
|
get<MessageId extends keyof ODMessageManagerIds_Default>(id:MessageId): ODMessage_Default<ODMessageManagerIds_Default[MessageId]["source"],ODMessageManagerIds_Default[MessageId]["params"],ODMessageManagerIds_Default[MessageId]["workers"]>
|
||||||
|
get(id:ODValidId): ODMessage<string,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODMessage<string,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<MessageId extends keyof ODMessageManagerIds_Default>(id:MessageId): ODMessage_Default<ODMessageManagerIds_Default[MessageId]["source"],ODMessageManagerIds_Default[MessageId]["params"],ODMessageManagerIds_Default[MessageId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODMessage<string,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODMessage<string,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODMessageManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getSafe<MessageId extends keyof ODMessageManagerIds_Default>(id:MessageId): ODMessage_Default<ODMessageManagerIds_Default[MessageId]["source"],ODMessageManagerIds_Default[MessageId]["params"],ODMessageManagerIds_Default[MessageId]["workers"]>
|
||||||
|
getSafe(id:ODValidId): ODMessage<string,any>
|
||||||
|
|
||||||
|
getSafe(id:ODValidId): ODMessage<string,any> {
|
||||||
|
return super.getSafe(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODMessage_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODMessage class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODMessage`'s!
|
||||||
|
*/
|
||||||
|
export class ODMessage_Default<Source extends string, Params, WorkerIds extends string> extends ODMessage<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODMessageInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODModalManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODModalManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODModalManagerIds_Default {
|
||||||
|
"openticket:ticket-questions":{source:"panel-button"|"panel-dropdown"|"slash"|"text"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,option:ODTicketOption},workers:"openticket:ticket-questions"}
|
||||||
|
"openticket:close-ticket-reason":{source:"ticket-message"|"reopen-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:close-ticket-reason"}
|
||||||
|
"openticket:reopen-ticket-reason":{source:"ticket-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:reopen-ticket-reason"}
|
||||||
|
"openticket:delete-ticket-reason":{source:"ticket-message"|"reopen-message"|"close-message"|"autoclose-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:delete-ticket-reason"}
|
||||||
|
"openticket:claim-ticket-reason":{source:"ticket-message"|"unclaim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:claim-ticket-reason"}
|
||||||
|
"openticket:unclaim-ticket-reason":{source:"ticket-message"|"claim-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:unclaim-ticket-reason"}
|
||||||
|
"openticket:pin-ticket-reason":{source:"ticket-message"|"unpin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:pin-ticket-reason"}
|
||||||
|
"openticket:unpin-ticket-reason":{source:"ticket-message"|"pin-message"|"other",params:{guild:discord.Guild,channel:discord.TextBasedChannel,user:discord.User,ticket:ODTicket},workers:"openticket:unpin-ticket-reason"}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODModalManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODModalManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.builders.modals`!
|
||||||
|
*/
|
||||||
|
export class ODModalManager_Default extends ODModalManager {
|
||||||
|
get<ModalId extends keyof ODModalManagerIds_Default>(id:ModalId): ODModal_Default<ODModalManagerIds_Default[ModalId]["source"],ODModalManagerIds_Default[ModalId]["params"],ODModalManagerIds_Default[ModalId]["workers"]>
|
||||||
|
get(id:ODValidId): ODModal<string,any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODModal<string,any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<ModalId extends keyof ODModalManagerIds_Default>(id:ModalId): ODModal_Default<ODModalManagerIds_Default[ModalId]["source"],ODModalManagerIds_Default[ModalId]["params"],ODModalManagerIds_Default[ModalId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODModal<string,any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODModal<string,any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODModalManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getSafe<ModalId extends keyof ODModalManagerIds_Default>(id:ModalId): ODModal_Default<ODModalManagerIds_Default[ModalId]["source"],ODModalManagerIds_Default[ModalId]["params"],ODModalManagerIds_Default[ModalId]["workers"]>
|
||||||
|
getSafe(id:ODValidId): ODModal<string,any>
|
||||||
|
|
||||||
|
getSafe(id:ODValidId): ODModal<string,any> {
|
||||||
|
return super.getSafe(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODModal_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODModal class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODModal`'s!
|
||||||
|
*/
|
||||||
|
export class ODModal_Default<Source extends string, Params, WorkerIds extends string> extends ODModal<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODModalInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
@@ -0,0 +1,378 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT CONFIG CHECKER MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODLanguageManager_Default } from "../api"
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODCheckerManager, ODChecker, ODCheckerTranslationRegister, ODCheckerRenderer, ODCheckerFunctionManager, ODCheckerResult, ODCheckerFunction } from "../modules/checker"
|
||||||
|
import ansis from "ansis"
|
||||||
|
|
||||||
|
/**## ODCheckerManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCheckerManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODCheckerManagerIds_Default {
|
||||||
|
"openticket:general":ODChecker,
|
||||||
|
"openticket:options":ODChecker,
|
||||||
|
"openticket:messages":ODChecker,
|
||||||
|
"openticket:transcripts":ODChecker
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCheckerManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCheckerManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.checkers`!
|
||||||
|
*/
|
||||||
|
export class ODCheckerManager_Default extends ODCheckerManager {
|
||||||
|
declare translation: ODCheckerTranslationRegister_Default
|
||||||
|
declare renderer: ODCheckerRenderer_Default
|
||||||
|
declare functions: ODCheckerFunctionManager_Default
|
||||||
|
|
||||||
|
get<CheckerId extends keyof ODCheckerManagerIds_Default>(id:CheckerId): ODCheckerManagerIds_Default[CheckerId]
|
||||||
|
get(id:ODValidId): ODChecker|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODChecker|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<CheckerId extends keyof ODCheckerManagerIds_Default>(id:CheckerId): ODCheckerManagerIds_Default[CheckerId]
|
||||||
|
remove(id:ODValidId): ODChecker|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODChecker|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODCheckerManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCheckerRenderer_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & features to the ODCheckerRenderer class.
|
||||||
|
* It contains the code that renders the default config checker.
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.checkers.renderer`!
|
||||||
|
*/
|
||||||
|
export class ODCheckerRenderer_Default extends ODCheckerRenderer {
|
||||||
|
extraHeaderText: string[] = []
|
||||||
|
extraFooterText: string[] = []
|
||||||
|
extraTopText: string[] = []
|
||||||
|
extraBottomText: string[] = []
|
||||||
|
|
||||||
|
horizontalFiller: string = "="
|
||||||
|
verticalFiller: string = "|"
|
||||||
|
descriptionSeparator: string = " => "
|
||||||
|
footerTipPrefix: string = "=> "
|
||||||
|
|
||||||
|
disableHeader: boolean = false
|
||||||
|
disableFooter: boolean = false
|
||||||
|
|
||||||
|
getComponents(compact:boolean, renderEmpty:boolean, translation:ODCheckerTranslationRegister_Default, data:ODCheckerResult): string[] {
|
||||||
|
const tm = translation
|
||||||
|
const t = {
|
||||||
|
headerOpenticket:tm.get("other","openticket:header-openticket") ?? "OPEN TICKET",
|
||||||
|
headerConfigchecker:tm.get("other","openticket:header-configchecker") ?? "CONFIG CHECKER",
|
||||||
|
headerDescription:tm.get("other","openticket:header-description") ?? "check for errors in you config files!",
|
||||||
|
footerError:tm.get("other","openticket:footer-error") ?? "the bot won't start until all {0}'s are fixed!",
|
||||||
|
footerWarning:tm.get("other","openticket:footer-warning") ?? "it's recommended to fix all {0}'s before starting!",
|
||||||
|
footerSupport:tm.get("other","openticket:footer-support") ?? "SUPPORT: {0} - DOCS: {1}",
|
||||||
|
error:tm.get("other","openticket:type-error") ?? "[ERROR]",
|
||||||
|
warning:tm.get("other","openticket:type-warning") ?? "[WARNING]",
|
||||||
|
info:tm.get("other","openticket:type-info") ?? "[INFO]",
|
||||||
|
compactInfo:tm.get("other","openticket:compact-information") ?? "use {0} for more information!",
|
||||||
|
dataPath:tm.get("other","openticket:data-path") ?? "path",
|
||||||
|
dataDocs:tm.get("other","openticket:data-docs") ?? "docs",
|
||||||
|
dataMessage:tm.get("other","openticket:data-message") ?? "message"
|
||||||
|
}
|
||||||
|
const hasErrors = data.messages.filter((m) => m.type == "error").length > 0
|
||||||
|
const hasWarnings = data.messages.filter((m) => m.type == "warning").length > 0
|
||||||
|
const hasInfo = data.messages.filter((m) => m.type == "info").length > 0
|
||||||
|
|
||||||
|
if (!renderEmpty && !hasErrors && !hasWarnings && (!hasInfo || compact)) return []
|
||||||
|
|
||||||
|
const headerText = ansis.bold.hex("#f8ba00")(t.headerOpenticket)+" "+t.headerConfigchecker+" => "+ansis.hex("#f8ba00")(t.headerDescription)
|
||||||
|
const footerErrorText = (hasErrors) ? this.footerTipPrefix+ansis.gray(tm.insertTranslationParams(t.footerError,[ansis.bold.red(t.error)])) : ""
|
||||||
|
const footerWarningText = (hasWarnings) ? this.footerTipPrefix+ansis.gray(tm.insertTranslationParams(t.footerWarning,[ansis.bold.yellow(t.warning)])) : ""
|
||||||
|
const footerSupportText = tm.insertTranslationParams(t.footerSupport,[ansis.green("https://discord.dj-dj.be"),ansis.green("https://otdocs.dj-dj.be")])
|
||||||
|
const bottomCompactInfo = (compact) ? ansis.gray(tm.insertTranslationParams(t.compactInfo,[ansis.bold.green("npm start -- --checker")])) : ""
|
||||||
|
|
||||||
|
const finalHeader = [headerText,...this.extraHeaderText]
|
||||||
|
const finalFooter = [footerErrorText,footerWarningText,footerSupportText,...this.extraFooterText]
|
||||||
|
const finalTop = [...this.extraTopText]
|
||||||
|
const finalBottom = [bottomCompactInfo,...this.extraBottomText]
|
||||||
|
const borderLength = this.#getLongestLength([...finalHeader,...finalFooter])
|
||||||
|
|
||||||
|
const finalComponents: string[] = []
|
||||||
|
|
||||||
|
//header
|
||||||
|
if (!this.disableHeader){
|
||||||
|
finalHeader.forEach((text) => {
|
||||||
|
if (text.length < 1) return
|
||||||
|
finalComponents.push(this.#createBlockFromText(text,borderLength))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
finalComponents.push(this.#getHorizontalDivider(borderLength+4))
|
||||||
|
|
||||||
|
//top
|
||||||
|
finalTop.forEach((text) => {
|
||||||
|
if (text.length < 1) return
|
||||||
|
finalComponents.push(this.verticalFiller+" "+text)
|
||||||
|
})
|
||||||
|
finalComponents.push(this.verticalFiller)
|
||||||
|
|
||||||
|
//messages
|
||||||
|
if (compact){
|
||||||
|
//use compact messages
|
||||||
|
data.messages.forEach((msg,index) => {
|
||||||
|
//compact mode doesn't render info
|
||||||
|
if (msg.type == "info") return
|
||||||
|
|
||||||
|
//check if translation available & use it if possible
|
||||||
|
const rawTranslation = tm.get("message",msg.messageId.value)
|
||||||
|
const translatedMessage = (rawTranslation) ? tm.insertTranslationParams(rawTranslation,msg.translationParams) : msg.message
|
||||||
|
|
||||||
|
if (msg.type == "error") finalComponents.push(this.verticalFiller+" "+ansis.bold.red(`${t.error} ${translatedMessage}`))
|
||||||
|
else if (msg.type == "warning") finalComponents.push(this.verticalFiller+" "+ansis.bold.yellow(`${t.warning} ${translatedMessage}`))
|
||||||
|
|
||||||
|
const pathSplitter = msg.path ? ":" : ""
|
||||||
|
finalComponents.push(this.verticalFiller+ansis.bold(this.descriptionSeparator)+ansis.cyan(`${ansis.magenta(msg.filepath+pathSplitter)} ${msg.path}`))
|
||||||
|
if (index != data.messages.length-1) finalComponents.push(this.verticalFiller)
|
||||||
|
})
|
||||||
|
}else{
|
||||||
|
//use full messages
|
||||||
|
data.messages.forEach((msg,index) => {
|
||||||
|
//check if translation available & use it if possible
|
||||||
|
const rawTranslation = tm.get("message",msg.messageId.value)
|
||||||
|
const translatedMessage = (rawTranslation) ? tm.insertTranslationParams(rawTranslation,msg.translationParams) : msg.message
|
||||||
|
|
||||||
|
if (msg.type == "error") finalComponents.push(this.verticalFiller+" "+ansis.bold.red(`${t.error} ${translatedMessage}`))
|
||||||
|
else if (msg.type == "warning") finalComponents.push(this.verticalFiller+" "+ansis.bold.yellow(`${t.warning} ${translatedMessage}`))
|
||||||
|
else if (msg.type == "info") finalComponents.push(this.verticalFiller+" "+ansis.bold.blue(`${t.info} ${translatedMessage}`))
|
||||||
|
|
||||||
|
const pathSplitter = msg.path ? ":" : ""
|
||||||
|
finalComponents.push(this.verticalFiller+" "+ansis.bold((t.dataPath)+this.descriptionSeparator)+ansis.cyan(`${ansis.magenta(msg.filepath+pathSplitter)} ${msg.path}`))
|
||||||
|
if (msg.locationDocs) finalComponents.push(this.verticalFiller+" "+ansis.bold(t.dataDocs+this.descriptionSeparator)+ansis.italic.gray(msg.locationDocs))
|
||||||
|
if (msg.messageDocs) finalComponents.push(this.verticalFiller+" "+ansis.bold(t.dataMessage+this.descriptionSeparator)+ansis.italic.gray(msg.messageDocs))
|
||||||
|
if (index != data.messages.length-1) finalComponents.push(this.verticalFiller)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//bottom
|
||||||
|
finalComponents.push(this.verticalFiller)
|
||||||
|
finalBottom.forEach((text) => {
|
||||||
|
if (text.length < 1) return
|
||||||
|
finalComponents.push(this.verticalFiller+" "+text)
|
||||||
|
})
|
||||||
|
|
||||||
|
//footer
|
||||||
|
finalComponents.push(this.#getHorizontalDivider(borderLength+4))
|
||||||
|
if (!this.disableFooter){
|
||||||
|
finalFooter.forEach((text) => {
|
||||||
|
if (text.length < 1) return
|
||||||
|
finalComponents.push(this.#createBlockFromText(text,borderLength))
|
||||||
|
})
|
||||||
|
finalComponents.push(this.#getHorizontalDivider(borderLength+4))
|
||||||
|
}
|
||||||
|
|
||||||
|
//return all components
|
||||||
|
return finalComponents
|
||||||
|
}
|
||||||
|
/**Get the length of the longest string in the array. */
|
||||||
|
#getLongestLength(text:string[]): number {
|
||||||
|
let finalLength = 0
|
||||||
|
text.forEach((t) => {
|
||||||
|
const l = ansis.strip(t).length
|
||||||
|
if (l > finalLength) finalLength = l
|
||||||
|
})
|
||||||
|
|
||||||
|
return finalLength
|
||||||
|
}
|
||||||
|
/**Get a horizontal divider used between different parts of the config checker result. */
|
||||||
|
#getHorizontalDivider(width:number): string {
|
||||||
|
if (width > 2) width = width-2
|
||||||
|
else return this.verticalFiller+this.verticalFiller
|
||||||
|
let divider = this.verticalFiller + this.horizontalFiller.repeat(width) + this.verticalFiller
|
||||||
|
return divider
|
||||||
|
}
|
||||||
|
/**Create a block of text with a vertical divider on the left & right side. */
|
||||||
|
#createBlockFromText(text:string,width:number): string {
|
||||||
|
if (width < 3) return this.verticalFiller+this.verticalFiller
|
||||||
|
let newWidth = width-ansis.strip(text).length+1
|
||||||
|
let final = this.verticalFiller+" "+text+" ".repeat(newWidth)+this.verticalFiller
|
||||||
|
return final
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCheckerTranslationRegisterOtherIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCheckerTranslationRegister_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export type ODCheckerTranslationRegisterOtherIds_Default = (
|
||||||
|
"openticket:header-openticket"|
|
||||||
|
"openticket:header-configchecker"|
|
||||||
|
"openticket:header-description"|
|
||||||
|
"openticket:type-error"|
|
||||||
|
"openticket:type-warning"|
|
||||||
|
"openticket:type-info"|
|
||||||
|
"openticket:data-path"|
|
||||||
|
"openticket:data-docs"|
|
||||||
|
"openticket:data-message"|
|
||||||
|
"openticket:compact-information"|
|
||||||
|
"openticket:footer-error"|
|
||||||
|
"openticket:footer-warning"|
|
||||||
|
"openticket:footer-support"
|
||||||
|
)
|
||||||
|
|
||||||
|
/**## ODCheckerTranslationRegisterMessageIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCheckerTranslationRegister_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export type ODCheckerTranslationRegisterMessageIds_Default = (
|
||||||
|
"openticket:invalid-type"|
|
||||||
|
"openticket:property-missing"|
|
||||||
|
"openticket:property-optional"|
|
||||||
|
"openticket:object-disabled"|
|
||||||
|
"openticket:null-invalid"|
|
||||||
|
"openticket:switch-invalid-type"|
|
||||||
|
"openticket:object-switch-invalid-type"|
|
||||||
|
|
||||||
|
"openticket:string-too-short"|
|
||||||
|
"openticket:string-too-long"|
|
||||||
|
"openticket:string-length-invalid"|
|
||||||
|
"openticket:string-starts-with"|
|
||||||
|
"openticket:string-ends-with"|
|
||||||
|
"openticket:string-contains"|
|
||||||
|
"openticket:string-choices"|
|
||||||
|
"openticket:string-regex"|
|
||||||
|
|
||||||
|
"openticket:number-too-short"|
|
||||||
|
"openticket:number-too-long"|
|
||||||
|
"openticket:number-length-invalid"|
|
||||||
|
"openticket:number-too-small"|
|
||||||
|
"openticket:number-too-large"|
|
||||||
|
"openticket:number-not-equal"|
|
||||||
|
"openticket:number-step"|
|
||||||
|
"openticket:number-step-offset"|
|
||||||
|
"openticket:number-starts-with"|
|
||||||
|
"openticket:number-ends-with"|
|
||||||
|
"openticket:number-contains"|
|
||||||
|
"openticket:number-choices"|
|
||||||
|
"openticket:number-float"|
|
||||||
|
"openticket:number-negative"|
|
||||||
|
"openticket:number-positive"|
|
||||||
|
"openticket:number-zero"|
|
||||||
|
|
||||||
|
"openticket:boolean-true"|
|
||||||
|
"openticket:boolean-false"|
|
||||||
|
|
||||||
|
"openticket:array-empty-disabled"|
|
||||||
|
"openticket:array-empty-required"|
|
||||||
|
"openticket:array-too-short"|
|
||||||
|
"openticket:array-too-long"|
|
||||||
|
"openticket:array-length-invalid"|
|
||||||
|
"openticket:array-invalid-types"|
|
||||||
|
"openticket:array-double"|
|
||||||
|
|
||||||
|
"openticket:discord-invalid-id"|
|
||||||
|
"openticket:discord-invalid-id-options"|
|
||||||
|
"openticket:discord-invalid-token"|
|
||||||
|
"openticket:color-invalid"|
|
||||||
|
"openticket:emoji-too-short"|
|
||||||
|
"openticket:emoji-too-long"|
|
||||||
|
"openticket:emoji-custom"|
|
||||||
|
"openticket:emoji-invalid"|
|
||||||
|
"openticket:url-invalid"|
|
||||||
|
"openticket:url-invalid-http"|
|
||||||
|
"openticket:url-invalid-protocol"|
|
||||||
|
"openticket:url-invalid-hostname"|
|
||||||
|
"openticket:url-invalid-extension"|
|
||||||
|
"openticket:url-invalid-path"|
|
||||||
|
"openticket:id-not-unique"|
|
||||||
|
"openticket:id-non-existent"|
|
||||||
|
|
||||||
|
"openticket:invalid-language"|
|
||||||
|
"openticket:invalid-button"|
|
||||||
|
"openticket:unused-option"|
|
||||||
|
"openticket:unused-question"|
|
||||||
|
"openticket:dropdown-option"
|
||||||
|
)
|
||||||
|
|
||||||
|
/**## ODCheckerTranslationRegister_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCheckerTranslationRegister class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.checkers.translation`!
|
||||||
|
*/
|
||||||
|
export class ODCheckerTranslationRegister_Default extends ODCheckerTranslationRegister {
|
||||||
|
get(type:"other", id:ODCheckerTranslationRegisterOtherIds_Default): string
|
||||||
|
get(type:"message", id:ODCheckerTranslationRegisterMessageIds_Default): string
|
||||||
|
get(type:"message"|"other", id:string): string|null
|
||||||
|
|
||||||
|
get(type:"message"|"other", id:string): string|null {
|
||||||
|
return super.get(type,id)
|
||||||
|
}
|
||||||
|
|
||||||
|
set(type:"other", id:ODCheckerTranslationRegisterOtherIds_Default, translation:string): boolean
|
||||||
|
set(type:"message", id:ODCheckerTranslationRegisterMessageIds_Default, translation:string): boolean
|
||||||
|
set(type:"message"|"other", id:string, translation:string): boolean
|
||||||
|
|
||||||
|
set(type:"message"|"other", id:string, translation:string): boolean {
|
||||||
|
return super.set(type,id,translation)
|
||||||
|
}
|
||||||
|
|
||||||
|
delete(type:"other", id:ODCheckerTranslationRegisterOtherIds_Default): boolean
|
||||||
|
delete(type:"message", id:ODCheckerTranslationRegisterMessageIds_Default): boolean
|
||||||
|
delete(type:"message"|"other", id:string): boolean
|
||||||
|
|
||||||
|
delete(type:"message"|"other", id:string): boolean {
|
||||||
|
return super.delete(type,id)
|
||||||
|
}
|
||||||
|
|
||||||
|
quickTranslate(manager:ODLanguageManager_Default, translationId:string, type:"other"|"message", id:ODCheckerTranslationRegisterOtherIds_Default|ODCheckerTranslationRegisterMessageIds_Default)
|
||||||
|
quickTranslate(manager:ODLanguageManager_Default, translationId:string, type:"other"|"message", id:string)
|
||||||
|
|
||||||
|
quickTranslate(manager:ODLanguageManager_Default, translationId:string, type:"other"|"message", id:ODCheckerTranslationRegisterOtherIds_Default|ODCheckerTranslationRegisterMessageIds_Default|string){
|
||||||
|
super.quickTranslate(manager,translationId,type,id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCheckerFunctionManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCheckerFunctionManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODCheckerFunctionManagerIds_Default {
|
||||||
|
"openticket:unused-options":ODCheckerFunction,
|
||||||
|
"openticket:dropdown-options":ODCheckerFunction
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCheckerFunctionManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCheckerFunctionManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.checkers.functions`!
|
||||||
|
*/
|
||||||
|
export class ODCheckerFunctionManager_Default extends ODCheckerFunctionManager {
|
||||||
|
get<CheckerFunctionId extends keyof ODCheckerManagerIds_Default>(id:CheckerFunctionId): ODCheckerManagerIds_Default[CheckerFunctionId]
|
||||||
|
get(id:ODValidId): ODCheckerFunction|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODCheckerFunction|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<CheckerFunctionId extends keyof ODCheckerManagerIds_Default>(id:CheckerFunctionId): ODCheckerManagerIds_Default[CheckerFunctionId]
|
||||||
|
remove(id:ODValidId): ODCheckerFunction|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODCheckerFunction|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODCheckerFunctionManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,147 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT CLIENT MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODClientManager, ODSlashCommand, ODTextCommand, ODSlashCommandManager, ODTextCommandManager, ODSlashCommandInteractionCallback, ODTextCommandInteractionCallback } from "../modules/client"
|
||||||
|
|
||||||
|
/**## ODClientManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODClientManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.client`!
|
||||||
|
*/
|
||||||
|
export class ODClientManager_Default extends ODClientManager {
|
||||||
|
declare slashCommands: ODSlashCommandManager_Default
|
||||||
|
declare textCommands: ODTextCommandManager_Default
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODSlashCommandManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODSlashCommandManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODSlashCommandManagerIds_Default {
|
||||||
|
"openticket:help":ODSlashCommand,
|
||||||
|
"openticket:panel":ODSlashCommand,
|
||||||
|
"openticket:ticket":ODSlashCommand,
|
||||||
|
"openticket:close":ODSlashCommand,
|
||||||
|
"openticket:delete":ODSlashCommand,
|
||||||
|
"openticket:reopen":ODSlashCommand,
|
||||||
|
"openticket:claim":ODSlashCommand,
|
||||||
|
"openticket:unclaim":ODSlashCommand,
|
||||||
|
"openticket:pin":ODSlashCommand,
|
||||||
|
"openticket:unpin":ODSlashCommand,
|
||||||
|
"openticket:move":ODSlashCommand,
|
||||||
|
"openticket:rename":ODSlashCommand,
|
||||||
|
"openticket:add":ODSlashCommand,
|
||||||
|
"openticket:remove":ODSlashCommand,
|
||||||
|
"openticket:blacklist":ODSlashCommand,
|
||||||
|
"openticket:stats":ODSlashCommand,
|
||||||
|
"openticket:clear":ODSlashCommand,
|
||||||
|
"openticket:autoclose":ODSlashCommand,
|
||||||
|
"openticket:autodelete":ODSlashCommand,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODSlashCommandManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODSlashCommandManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.client.slashCommands`!
|
||||||
|
*/
|
||||||
|
export class ODSlashCommandManager_Default extends ODSlashCommandManager {
|
||||||
|
get<SlashCommandId extends keyof ODSlashCommandManagerIds_Default>(id:SlashCommandId): ODSlashCommandManagerIds_Default[SlashCommandId]
|
||||||
|
get(id:ODValidId): ODSlashCommand|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODSlashCommand|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<SlashCommandId extends keyof ODSlashCommandManagerIds_Default>(id:SlashCommandId): ODSlashCommandManagerIds_Default[SlashCommandId]
|
||||||
|
remove(id:ODValidId): ODSlashCommand|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODSlashCommand|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODSlashCommandManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
onInteraction(commandName:keyof ODSlashCommandManagerIds_Default, callback:ODSlashCommandInteractionCallback): void
|
||||||
|
onInteraction(commandName:string|RegExp, callback:ODSlashCommandInteractionCallback): void
|
||||||
|
|
||||||
|
onInteraction(commandName:string|RegExp, callback:ODSlashCommandInteractionCallback): void {
|
||||||
|
return super.onInteraction(commandName,callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODTextCommandManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODTextCommandManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODTextCommandManagerIds_Default {
|
||||||
|
"openticket:help":ODTextCommand,
|
||||||
|
"openticket:panel":ODTextCommand,
|
||||||
|
"openticket:close":ODTextCommand,
|
||||||
|
"openticket:delete":ODTextCommand,
|
||||||
|
"openticket:reopen":ODTextCommand,
|
||||||
|
"openticket:claim":ODTextCommand,
|
||||||
|
"openticket:unclaim":ODTextCommand,
|
||||||
|
"openticket:pin":ODTextCommand,
|
||||||
|
"openticket:unpin":ODTextCommand,
|
||||||
|
"openticket:move":ODTextCommand,
|
||||||
|
"openticket:rename":ODTextCommand,
|
||||||
|
"openticket:add":ODTextCommand,
|
||||||
|
"openticket:remove":ODTextCommand,
|
||||||
|
"openticket:blacklist-view":ODTextCommand,
|
||||||
|
"openticket:blacklist-add":ODTextCommand,
|
||||||
|
"openticket:blacklist-remove":ODTextCommand,
|
||||||
|
"openticket:blacklist-get":ODTextCommand,
|
||||||
|
"openticket:stats-global":ODTextCommand,
|
||||||
|
"openticket:stats-reset":ODTextCommand,
|
||||||
|
"openticket:stats-ticket":ODTextCommand,
|
||||||
|
"openticket:stats-user":ODTextCommand,
|
||||||
|
"openticket:clear":ODTextCommand,
|
||||||
|
"openticket:autoclose-disable":ODTextCommand,
|
||||||
|
"openticket:autoclose-enable":ODTextCommand,
|
||||||
|
"openticket:autodelete-disable":ODTextCommand,
|
||||||
|
"openticket:autodelete-enable":ODTextCommand
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODTextCommandManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODTextCommandManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.client.textCommands`!
|
||||||
|
*/
|
||||||
|
export class ODTextCommandManager_Default extends ODTextCommandManager {
|
||||||
|
get<TextCommandId extends keyof ODTextCommandManagerIds_Default>(id:TextCommandId): ODTextCommandManagerIds_Default[TextCommandId]
|
||||||
|
get(id:ODValidId): ODTextCommand|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODTextCommand|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<TextCommandId extends keyof ODTextCommandManagerIds_Default>(id:TextCommandId): ODTextCommandManagerIds_Default[TextCommandId]
|
||||||
|
remove(id:ODValidId): ODTextCommand|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODTextCommand|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODTextCommandManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
onInteraction(prefix:string, id:keyof ODTextCommandManagerIds_Default, callback:ODTextCommandInteractionCallback): void
|
||||||
|
onInteraction(commandPrefix:string, commandName:string|RegExp, callback:ODTextCommandInteractionCallback): void
|
||||||
|
|
||||||
|
onInteraction(commandPrefix:string, commandName:string|RegExp, callback:ODTextCommandInteractionCallback): void {
|
||||||
|
return super.onInteraction(commandPrefix,commandName,callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT CODE MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODCode, ODCodeManager } from "../modules/code"
|
||||||
|
|
||||||
|
/**## ODCodeManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCodeManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODCodeManagerIds_Default {
|
||||||
|
"openticket:command-error-handling":ODCode,
|
||||||
|
"openticket:start-listening-interactions":ODCode,
|
||||||
|
"openticket:panel-database-cleaner":ODCode,
|
||||||
|
"openticket:suffix-database-cleaner":ODCode,
|
||||||
|
"openticket:option-database-cleaner":ODCode,
|
||||||
|
"openticket:user-database-cleaner":ODCode,
|
||||||
|
"openticket:ticket-database-cleaner":ODCode,
|
||||||
|
"openticket:panel-auto-update":ODCode,
|
||||||
|
"openticket:ticket-saver":ODCode,
|
||||||
|
"openticket:blacklist-saver":ODCode,
|
||||||
|
"openticket:auto-role-on-join":ODCode,
|
||||||
|
"openticket:autoclose-timeout":ODCode,
|
||||||
|
"openticket:autoclose-leave":ODCode,
|
||||||
|
"openticket:autodelete-timeout":ODCode,
|
||||||
|
"openticket:autodelete-leave":ODCode
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCodeManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCodeManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.code`!
|
||||||
|
*/
|
||||||
|
export class ODCodeManager_Default extends ODCodeManager {
|
||||||
|
get<CodeId extends keyof ODCodeManagerIds_Default>(id:CodeId): ODCodeManagerIds_Default[CodeId]
|
||||||
|
get(id:ODValidId): ODCode|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODCode|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<CodeId extends keyof ODCodeManagerIds_Default>(id:CodeId): ODCodeManagerIds_Default[CodeId]
|
||||||
|
remove(id:ODValidId): ODCode|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODCode|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODCodeManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,470 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT CONFIG MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidButtonColor, ODValidId } from "../modules/base"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
import { ODConfigManager, ODConfig, ODJsonConfig } from "../modules/config"
|
||||||
|
import { ODClientActivityStatus, ODClientActivityType } from "../modules/client"
|
||||||
|
import { OTRoleUpdateMode } from "../openticket/role"
|
||||||
|
|
||||||
|
/**## ODConfigManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODConfigManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODConfigManagerIds_Default {
|
||||||
|
"openticket:general":ODJsonConfig_DefaultGeneral,
|
||||||
|
"openticket:options":ODJsonConfig_DefaultOptions,
|
||||||
|
"openticket:panels":ODJsonConfig_DefaultPanels,
|
||||||
|
"openticket:questions":ODJsonConfig_DefaultQuestions,
|
||||||
|
"openticket:transcripts":ODJsonConfig_DefaultTranscripts
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODConfigManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODConfigManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.configs`!
|
||||||
|
*/
|
||||||
|
export class ODConfigManager_Default extends ODConfigManager {
|
||||||
|
get<ConfigId extends keyof ODConfigManagerIds_Default>(id:ConfigId): ODConfigManagerIds_Default[ConfigId]
|
||||||
|
get(id:ODValidId): ODConfig|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODConfig|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<ConfigId extends keyof ODConfigManagerIds_Default>(id:ConfigId): ODConfigManagerIds_Default[ConfigId]
|
||||||
|
remove(id:ODValidId): ODConfig|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODConfig|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODConfigManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultStatusType `interface`
|
||||||
|
* This interface is an object which has all properties for the status object in the `general.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultStatusType {
|
||||||
|
enabled:boolean,
|
||||||
|
type:Exclude<ODClientActivityType,false>,
|
||||||
|
text:string,
|
||||||
|
status:ODClientActivityStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultMessageSettingsType `interface`
|
||||||
|
* This interface is an object which has all properties for the system/messages/... object in the `general.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultMessageSettingsType {
|
||||||
|
dm:boolean,
|
||||||
|
logs:boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultCmdPermissionSettingsType `type`
|
||||||
|
* This type is a collection of command permission settings for the system/permissions/... object in the `general.json` config!
|
||||||
|
*/
|
||||||
|
export type ODJsonConfig_DefaultCmdPermissionSettingsType = "admin"|"everyone"|"none"|string
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultGeneral `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODJsonConfig class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `general.json` config!
|
||||||
|
*/
|
||||||
|
export class ODJsonConfig_DefaultGeneral extends ODJsonConfig {
|
||||||
|
declare data: {
|
||||||
|
_INFO:{
|
||||||
|
support:string,
|
||||||
|
discord:string,
|
||||||
|
version:string
|
||||||
|
},
|
||||||
|
|
||||||
|
token:string,
|
||||||
|
tokenFromENV:boolean,
|
||||||
|
|
||||||
|
mainColor:discord.ColorResolvable,
|
||||||
|
language:string,
|
||||||
|
prefix:string,
|
||||||
|
serverId:string,
|
||||||
|
globalAdmins:string[],
|
||||||
|
|
||||||
|
slashCommands:boolean,
|
||||||
|
textCommands:boolean,
|
||||||
|
|
||||||
|
status:ODJsonConfig_DefaultStatusType,
|
||||||
|
|
||||||
|
system:{
|
||||||
|
removeParticipantsOnClose:boolean,
|
||||||
|
replyOnTicketCreation:boolean,
|
||||||
|
replyOnReactionRole:boolean,
|
||||||
|
useTranslatedConfigChecker:boolean,
|
||||||
|
preferSlashOverText:boolean,
|
||||||
|
sendErrorOnUnknownCommand:boolean,
|
||||||
|
questionFieldsInCodeBlock:boolean,
|
||||||
|
disableVerifyBars:boolean,
|
||||||
|
useRedErrorEmbeds:boolean,
|
||||||
|
emojiStyle:"before"|"after"|"double"|"disabled",
|
||||||
|
|
||||||
|
enableTicketClaimButtons:boolean,
|
||||||
|
enableTicketCloseButtons:boolean,
|
||||||
|
enableTicketPinButtons:boolean,
|
||||||
|
enableTicketDeleteButtons:boolean,
|
||||||
|
enableTicketActionWithReason:boolean,
|
||||||
|
enableDeleteWithoutTranscript:boolean,
|
||||||
|
|
||||||
|
logs:{
|
||||||
|
enabled:boolean,
|
||||||
|
channel:string
|
||||||
|
},
|
||||||
|
|
||||||
|
limits:{
|
||||||
|
enabled:boolean,
|
||||||
|
globalMaximum:number,
|
||||||
|
userMaximum:number
|
||||||
|
},
|
||||||
|
|
||||||
|
permissions:{
|
||||||
|
help:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
panel:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
ticket:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
close:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
delete:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
reopen:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
claim:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
unclaim:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
pin:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
unpin:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
move:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
rename:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
add:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
remove:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
blacklist:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
stats:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
clear:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
autoclose:ODJsonConfig_DefaultCmdPermissionSettingsType,
|
||||||
|
autodelete:ODJsonConfig_DefaultCmdPermissionSettingsType
|
||||||
|
},
|
||||||
|
|
||||||
|
messages:{
|
||||||
|
creation:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
closing:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
deleting:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
reopening:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
claiming:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
pinning:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
adding:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
removing:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
renaming:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
moving:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
blacklisting:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
roleAdding:ODJsonConfig_DefaultMessageSettingsType,
|
||||||
|
roleRemoving:ODJsonConfig_DefaultMessageSettingsType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionType `interface`
|
||||||
|
* This interface is an object which has all basic properties for options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionType {
|
||||||
|
id:string,
|
||||||
|
name:string,
|
||||||
|
description:string,
|
||||||
|
type:"ticket"|"website"|"role",
|
||||||
|
button:{
|
||||||
|
emoji:string,
|
||||||
|
label:string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionButtonSettingsType `interface`
|
||||||
|
* This interface is an object which has all button settings for ticket options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionButtonSettingsType {
|
||||||
|
emoji:string,
|
||||||
|
label:string,
|
||||||
|
color:ODValidButtonColor
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionEmbedSettingsType `interface`
|
||||||
|
* This interface is an object which has all message embed settings for ticket options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionEmbedSettingsType {
|
||||||
|
enabled:boolean,
|
||||||
|
title:string,
|
||||||
|
description:string,
|
||||||
|
customColor:string,
|
||||||
|
|
||||||
|
image:string,
|
||||||
|
thumbnail:string,
|
||||||
|
fields:{name:string, value:string, inline:boolean}[],
|
||||||
|
timestamp:boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionPingSettingsType `interface`
|
||||||
|
* This interface is an object which has all message ping settings for ticket options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionPingSettingsType {
|
||||||
|
"@here":boolean,
|
||||||
|
"@everyone":boolean,
|
||||||
|
custom:string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionTicketType `interface`
|
||||||
|
* This interface is an object which has all ticket properties for options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionTicketType extends ODJsonConfig_DefaultOptionType {
|
||||||
|
type:"ticket",
|
||||||
|
button:ODJsonConfig_DefaultOptionButtonSettingsType,
|
||||||
|
ticketAdmins:string[],
|
||||||
|
readonlyAdmins:string[],
|
||||||
|
allowCreationByBlacklistedUsers:boolean,
|
||||||
|
questions:string[],
|
||||||
|
channel:{
|
||||||
|
prefix:string,
|
||||||
|
suffix:"user-name"|"user-id"|"random-number"|"random-hex"|"counter-dynamic"|"counter-fixed",
|
||||||
|
category:string,
|
||||||
|
closedCategory:string,
|
||||||
|
backupCategory:string,
|
||||||
|
claimedCategory:{user:string, category:string}[],
|
||||||
|
description:string
|
||||||
|
},
|
||||||
|
dmMessage:{
|
||||||
|
enabled:boolean,
|
||||||
|
text:string,
|
||||||
|
embed:ODJsonConfig_DefaultOptionEmbedSettingsType
|
||||||
|
},
|
||||||
|
ticketMessage:{
|
||||||
|
enabled:boolean,
|
||||||
|
text:string,
|
||||||
|
embed:ODJsonConfig_DefaultOptionEmbedSettingsType,
|
||||||
|
ping:ODJsonConfig_DefaultOptionPingSettingsType
|
||||||
|
},
|
||||||
|
autoclose:{
|
||||||
|
enableInactiveHours:boolean,
|
||||||
|
inactiveHours:number,
|
||||||
|
enableUserLeave:boolean,
|
||||||
|
disableOnClaim:boolean
|
||||||
|
},
|
||||||
|
autodelete:{
|
||||||
|
enableInactiveDays:boolean,
|
||||||
|
inactiveDays:number,
|
||||||
|
enableUserLeave:boolean,
|
||||||
|
disableOnClaim:boolean
|
||||||
|
},
|
||||||
|
cooldown:{
|
||||||
|
enabled:boolean,
|
||||||
|
cooldownMinutes:number
|
||||||
|
},
|
||||||
|
limits:{
|
||||||
|
enabled:boolean,
|
||||||
|
globalMaximum:number,
|
||||||
|
userMaximum:number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionWebsiteType `interface`
|
||||||
|
* This interface is an object which has all website properties for options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionWebsiteType extends ODJsonConfig_DefaultOptionType {
|
||||||
|
type:"website",
|
||||||
|
url:string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptionRoleType `interface`
|
||||||
|
* This interface is an object which has all reaction role properties for options in the `options.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultOptionRoleType extends ODJsonConfig_DefaultOptionType {
|
||||||
|
type:"role",
|
||||||
|
button:ODJsonConfig_DefaultOptionButtonSettingsType,
|
||||||
|
roles:string[],
|
||||||
|
mode:OTRoleUpdateMode,
|
||||||
|
removeRolesOnAdd:string[],
|
||||||
|
addOnMemberJoin:boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultOptions `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODJsonConfig class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `options.json` config!
|
||||||
|
*/
|
||||||
|
export class ODJsonConfig_DefaultOptions extends ODJsonConfig {
|
||||||
|
declare data: (
|
||||||
|
ODJsonConfig_DefaultOptionTicketType|
|
||||||
|
ODJsonConfig_DefaultOptionWebsiteType|
|
||||||
|
ODJsonConfig_DefaultOptionRoleType
|
||||||
|
)[]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultPanelEmbedSettingsType `interface`
|
||||||
|
* This interface is an object which has all message embed settings for panels in the `panels.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultPanelEmbedSettingsType {
|
||||||
|
enabled:boolean,
|
||||||
|
title:string,
|
||||||
|
description:string,
|
||||||
|
|
||||||
|
customColor:string,
|
||||||
|
url:string,
|
||||||
|
|
||||||
|
image:string,
|
||||||
|
thumbnail:string,
|
||||||
|
|
||||||
|
footer:string,
|
||||||
|
fields:{name:string,value:string,inline:boolean}[],
|
||||||
|
timestamp:boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultPanelType `interface`
|
||||||
|
* This interface is an object which has all properties for panels in the `panels.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultPanelType {
|
||||||
|
id:string,
|
||||||
|
name:string,
|
||||||
|
dropdown:boolean,
|
||||||
|
options:string[],
|
||||||
|
|
||||||
|
text:string,
|
||||||
|
embed:ODJsonConfig_DefaultPanelEmbedSettingsType,
|
||||||
|
settings:{
|
||||||
|
dropdownPlaceholder:string,
|
||||||
|
|
||||||
|
enableMaxTicketsWarningInText:boolean,
|
||||||
|
enableMaxTicketsWarningInEmbed:boolean,
|
||||||
|
|
||||||
|
describeOptionsLayout:"simple"|"normal"|"detailed",
|
||||||
|
describeOptionsCustomTitle:string,
|
||||||
|
describeOptionsInText:boolean,
|
||||||
|
describeOptionsInEmbedFields:boolean,
|
||||||
|
describeOptionsInEmbedDescription:boolean
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultPanels `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODJsonConfig class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `panels.json` config!
|
||||||
|
*/
|
||||||
|
export class ODJsonConfig_DefaultPanels extends ODJsonConfig {
|
||||||
|
declare data: ODJsonConfig_DefaultPanelType[]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultShortQuestionType `interface`
|
||||||
|
* This interface is an object which has all properties for short questions in the `questions.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultShortQuestionType {
|
||||||
|
id:string,
|
||||||
|
name:string,
|
||||||
|
type:"short",
|
||||||
|
|
||||||
|
required:boolean,
|
||||||
|
placeholder:string,
|
||||||
|
length:{
|
||||||
|
enabled:boolean,
|
||||||
|
min:number,
|
||||||
|
max:number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultParagraphQuestionType `interface`
|
||||||
|
* This interface is an object which has all properties for paragraph questions in the `questions.json` config!
|
||||||
|
*/
|
||||||
|
export interface ODJsonConfig_DefaultParagraphQuestionType {
|
||||||
|
id:string,
|
||||||
|
name:string,
|
||||||
|
type:"paragraph",
|
||||||
|
|
||||||
|
required:boolean,
|
||||||
|
placeholder:string,
|
||||||
|
length:{
|
||||||
|
enabled:boolean,
|
||||||
|
min:number,
|
||||||
|
max:number
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultQuestions `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODJsonConfig class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `questions.json` config!
|
||||||
|
*/
|
||||||
|
export class ODJsonConfig_DefaultQuestions extends ODJsonConfig {
|
||||||
|
declare data: (
|
||||||
|
ODJsonConfig_DefaultShortQuestionType|
|
||||||
|
ODJsonConfig_DefaultParagraphQuestionType
|
||||||
|
)[]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODJsonConfig_DefaultTranscripts `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODJsonConfig class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `transcripts.json` config!
|
||||||
|
*/
|
||||||
|
export class ODJsonConfig_DefaultTranscripts extends ODJsonConfig {
|
||||||
|
declare data: {
|
||||||
|
general:{
|
||||||
|
enabled:boolean,
|
||||||
|
|
||||||
|
enableChannel:boolean,
|
||||||
|
enableCreatorDM:boolean,
|
||||||
|
enableParticipantDM:boolean,
|
||||||
|
enableActiveAdminDM:boolean,
|
||||||
|
enableEveryAdminDM:boolean,
|
||||||
|
|
||||||
|
channel:string,
|
||||||
|
mode:"html"|"text"
|
||||||
|
},
|
||||||
|
embedSettings:{
|
||||||
|
customColor:string,
|
||||||
|
listAllParticipants:boolean,
|
||||||
|
includeTicketStats:boolean
|
||||||
|
},
|
||||||
|
textTranscriptStyle:{
|
||||||
|
layout:"simple"|"normal"|"detailed",
|
||||||
|
includeStats:boolean,
|
||||||
|
includeIds:boolean,
|
||||||
|
includeEmbeds:boolean,
|
||||||
|
includeFiles:boolean,
|
||||||
|
includeBotMessages:boolean,
|
||||||
|
|
||||||
|
fileMode:"custom"|"channel-name"|"channel-id"|"user-name"|"user-id",
|
||||||
|
customFileName:string
|
||||||
|
},
|
||||||
|
htmlTranscriptStyle:{
|
||||||
|
background:{
|
||||||
|
enableCustomBackground:boolean,
|
||||||
|
backgroundColor:string,
|
||||||
|
backgroundImage:string
|
||||||
|
},
|
||||||
|
header:{
|
||||||
|
enableCustomHeader:boolean,
|
||||||
|
backgroundColor:string,
|
||||||
|
decoColor:string,
|
||||||
|
textColor:string
|
||||||
|
},
|
||||||
|
stats:{
|
||||||
|
enableCustomStats:false,
|
||||||
|
backgroundColor:string,
|
||||||
|
keyTextColor:string,
|
||||||
|
valueTextColor:string,
|
||||||
|
hideBackgroundColor:string,
|
||||||
|
hideTextColor:string
|
||||||
|
},
|
||||||
|
favicon:{
|
||||||
|
enableCustomFavicon:boolean,
|
||||||
|
imageUrl:string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT CONSOLE MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODLiveStatusUrlSource, ODLiveStatusManager, ODLiveStatusSource } from "../modules/console"
|
||||||
|
|
||||||
|
/**## ODLiveStatusManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODLiveStatusManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODLiveStatusManagerIds_Default {
|
||||||
|
"openticket:default-djdj-dev":ODLiveStatusUrlSource
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODLiveStatusManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODLiveStatusManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.livestatus`!
|
||||||
|
*/
|
||||||
|
export class ODLiveStatusManager_Default extends ODLiveStatusManager {
|
||||||
|
get<LiveStatusId extends keyof ODLiveStatusManagerIds_Default>(id:LiveStatusId): ODLiveStatusManagerIds_Default[LiveStatusId]
|
||||||
|
get(id:ODValidId): ODLiveStatusSource|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODLiveStatusSource|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<LiveStatusId extends keyof ODLiveStatusManagerIds_Default>(id:LiveStatusId): ODLiveStatusManagerIds_Default[LiveStatusId]
|
||||||
|
remove(id:ODValidId): ODLiveStatusSource|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODLiveStatusSource|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODLiveStatusManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT COOLDOWN MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODCooldown, ODCooldownManager } from "../modules/cooldown"
|
||||||
|
|
||||||
|
/**## ODCooldownManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCooldownManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODCooldownManagerIds_Default {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCooldownManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCooldownManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.cooldowns`!
|
||||||
|
*/
|
||||||
|
export class ODCooldownManager_Default extends ODCooldownManager {
|
||||||
|
get<CooldownId extends keyof ODCooldownManagerIds_Default>(id:CooldownId): ODCooldownManagerIds_Default[CooldownId]
|
||||||
|
get(id:ODValidId): ODCooldown<object>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODCooldown<object>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<CooldownId extends keyof ODCooldownManagerIds_Default>(id:CooldownId): ODCooldownManagerIds_Default[CooldownId]
|
||||||
|
remove(id:ODValidId): ODCooldown<object>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODCooldown<object>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODCooldownManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT DATABASE MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId, ODValidJsonType } from "../modules/base"
|
||||||
|
import { ODDatabaseManager, ODDatabase, ODFormattedJsonDatabase } from "../modules/database"
|
||||||
|
import { ODTicketJson } from "../openticket/ticket"
|
||||||
|
import { ODOptionJson } from "../openticket/option"
|
||||||
|
|
||||||
|
/**## ODDatabaseManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODDatabaseManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODDatabaseManagerIds_Default {
|
||||||
|
"openticket:global":ODFormattedJsonDatabase_DefaultGlobal,
|
||||||
|
"openticket:stats":ODFormattedJsonDatabase,
|
||||||
|
"openticket:tickets":ODFormattedJsonDatabase_DefaultTickets,
|
||||||
|
"openticket:users":ODFormattedJsonDatabase_DefaultUsers,
|
||||||
|
"openticket:options":ODFormattedJsonDatabase_DefaultOptions,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDatabaseManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODDatabaseManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.databases`!
|
||||||
|
*/
|
||||||
|
export class ODDatabaseManager_Default extends ODDatabaseManager {
|
||||||
|
get<DatabaseId extends keyof ODDatabaseManagerIds_Default>(id:DatabaseId): ODDatabaseManagerIds_Default[DatabaseId]
|
||||||
|
get(id:ODValidId): ODDatabase|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODDatabase|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<DatabaseId extends keyof ODDatabaseManagerIds_Default>(id:DatabaseId): ODDatabaseManagerIds_Default[DatabaseId]
|
||||||
|
remove(id:ODValidId): ODDatabase|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODDatabase|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODDatabaseManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabaseIds_DefaultGlobal `type`
|
||||||
|
* This type is an array of ids available in the `ODFormattedJsonDatabase_DefaultGlobal` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODFormattedJsonDatabaseIds_DefaultGlobal {
|
||||||
|
"openticket:panel-update":string,
|
||||||
|
"openticket:option-suffix-counter":number,
|
||||||
|
"openticket:option-suffix-history":string[],
|
||||||
|
"openticket:last-version":string
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabase_DefaultGlobal `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFormattedJsonDatabase class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `global.json` database!
|
||||||
|
*/
|
||||||
|
export class ODFormattedJsonDatabase_DefaultGlobal extends ODFormattedJsonDatabase {
|
||||||
|
set<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultGlobal>(category:CategoryId, key:string, value:ODFormattedJsonDatabaseIds_DefaultGlobal[CategoryId]): boolean
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean
|
||||||
|
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean {
|
||||||
|
return super.set(category,key,value)
|
||||||
|
}
|
||||||
|
|
||||||
|
get<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultGlobal>(category:CategoryId, key:string): ODFormattedJsonDatabaseIds_DefaultGlobal[CategoryId]|undefined
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined
|
||||||
|
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined {
|
||||||
|
return super.get(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
delete<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultGlobal>(category:CategoryId, key:string): boolean
|
||||||
|
delete(category:string, key:string): boolean
|
||||||
|
|
||||||
|
delete(category:string, key:string): boolean {
|
||||||
|
return super.delete(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(category:keyof ODFormattedJsonDatabaseIds_DefaultGlobal, key:string): boolean
|
||||||
|
exists(category:string, key:string): boolean
|
||||||
|
|
||||||
|
exists(category:string, key:string): boolean {
|
||||||
|
return super.exists(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategory<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultGlobal>(category:CategoryId): {key:string, value:ODFormattedJsonDatabaseIds_DefaultGlobal[CategoryId]}[]|undefined
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined
|
||||||
|
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined {
|
||||||
|
return super.getCategory(category)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabaseIds_DefaultTickets `type`
|
||||||
|
* This type is an array of ids available in the `ODDatabaseManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODFormattedJsonDatabaseIds_DefaultTickets {
|
||||||
|
"openticket:ticket":ODTicketJson
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabase_DefaultTickets `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFormattedJsonDatabase class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `tickets.json` database!
|
||||||
|
*/
|
||||||
|
export class ODFormattedJsonDatabase_DefaultTickets extends ODFormattedJsonDatabase {
|
||||||
|
set<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultTickets>(category:CategoryId, key:string, value:ODFormattedJsonDatabaseIds_DefaultTickets[CategoryId]): boolean
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean
|
||||||
|
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean {
|
||||||
|
return super.set(category,key,value)
|
||||||
|
}
|
||||||
|
|
||||||
|
get<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultTickets>(category:CategoryId, key:string): ODFormattedJsonDatabaseIds_DefaultTickets[CategoryId]|undefined
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined
|
||||||
|
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined {
|
||||||
|
return super.get(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
delete<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultTickets>(category:CategoryId, key:string): boolean
|
||||||
|
delete(category:string, key:string): boolean
|
||||||
|
|
||||||
|
delete(category:string, key:string): boolean {
|
||||||
|
return super.delete(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(category:keyof ODFormattedJsonDatabaseIds_DefaultTickets, key:string): boolean
|
||||||
|
exists(category:string, key:string): boolean
|
||||||
|
|
||||||
|
exists(category:string, key:string): boolean {
|
||||||
|
return super.exists(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategory<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultTickets>(category:CategoryId): {key:string, value:ODFormattedJsonDatabaseIds_DefaultTickets[CategoryId]}[]|undefined
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined
|
||||||
|
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined {
|
||||||
|
return super.getCategory(category)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabaseIds_DefaultUsers `type`
|
||||||
|
* This type is an array of ids available in the `ODDatabaseManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODFormattedJsonDatabaseIds_DefaultUsers {
|
||||||
|
"openticket:blacklist":ODTicketJson
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabase_DefaultUsers `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFormattedJsonDatabase class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `users.json` database!
|
||||||
|
*/
|
||||||
|
export class ODFormattedJsonDatabase_DefaultUsers extends ODFormattedJsonDatabase {
|
||||||
|
set<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultUsers>(category:CategoryId, key:string, value:ODFormattedJsonDatabaseIds_DefaultUsers[CategoryId]): boolean
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean
|
||||||
|
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean {
|
||||||
|
return super.set(category,key,value)
|
||||||
|
}
|
||||||
|
|
||||||
|
get<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultUsers>(category:CategoryId, key:string): ODFormattedJsonDatabaseIds_DefaultUsers[CategoryId]|undefined
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined
|
||||||
|
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined {
|
||||||
|
return super.get(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
delete<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultUsers>(category:CategoryId, key:string): boolean
|
||||||
|
delete(category:string, key:string): boolean
|
||||||
|
|
||||||
|
delete(category:string, key:string): boolean {
|
||||||
|
return super.delete(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(category:keyof ODFormattedJsonDatabaseIds_DefaultUsers, key:string): boolean
|
||||||
|
exists(category:string, key:string): boolean
|
||||||
|
|
||||||
|
exists(category:string, key:string): boolean {
|
||||||
|
return super.exists(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategory<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultUsers>(category:CategoryId): {key:string, value:ODFormattedJsonDatabaseIds_DefaultUsers[CategoryId]}[]|undefined
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined
|
||||||
|
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined {
|
||||||
|
return super.getCategory(category)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabaseIds_DefaultOptions `type`
|
||||||
|
* This type is an array of ids available in the `ODDatabaseManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODFormattedJsonDatabaseIds_DefaultOptions {
|
||||||
|
"openticket:used-option":ODOptionJson
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFormattedJsonDatabase_DefaultOptions `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFormattedJsonDatabase class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `options.json` database!
|
||||||
|
*/
|
||||||
|
export class ODFormattedJsonDatabase_DefaultOptions extends ODFormattedJsonDatabase {
|
||||||
|
set<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultOptions>(category:CategoryId, key:string, value:ODFormattedJsonDatabaseIds_DefaultOptions[CategoryId]): boolean
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean
|
||||||
|
|
||||||
|
set(category:string, key:string, value:ODValidJsonType): boolean {
|
||||||
|
return super.set(category,key,value)
|
||||||
|
}
|
||||||
|
|
||||||
|
get<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultOptions>(category:CategoryId, key:string): ODFormattedJsonDatabaseIds_DefaultOptions[CategoryId]|undefined
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined
|
||||||
|
|
||||||
|
get(category:string, key:string): ODValidJsonType|undefined {
|
||||||
|
return super.get(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
delete<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultOptions>(category:CategoryId, key:string): boolean
|
||||||
|
delete(category:string, key:string): boolean
|
||||||
|
|
||||||
|
delete(category:string, key:string): boolean {
|
||||||
|
return super.delete(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(category:keyof ODFormattedJsonDatabaseIds_DefaultOptions, key:string): boolean
|
||||||
|
exists(category:string, key:string): boolean
|
||||||
|
|
||||||
|
exists(category:string, key:string): boolean {
|
||||||
|
return super.exists(category,key)
|
||||||
|
}
|
||||||
|
|
||||||
|
getCategory<CategoryId extends keyof ODFormattedJsonDatabaseIds_DefaultOptions>(category:CategoryId): {key:string, value:ODFormattedJsonDatabaseIds_DefaultOptions[CategoryId]}[]|undefined
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined
|
||||||
|
|
||||||
|
getCategory(category:string): {key:string, value:ODValidJsonType}[]|undefined {
|
||||||
|
return super.getCategory(category)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,331 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT EVENT MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
//BASE MODULES
|
||||||
|
import { ODPromiseVoid, ODValidId } from "../modules/base"
|
||||||
|
import { ODPluginClassManager, ODPluginEventManager, ODPluginManager } from "../modules/plugin"
|
||||||
|
import { ODConsoleManager, ODError } from "../modules/console"
|
||||||
|
import { ODCheckerResult, ODCheckerStorage } from "../modules/checker"
|
||||||
|
import { ODDefaultsManager } from "../modules/defaults"
|
||||||
|
import { ODLanguage } from "../modules/language"
|
||||||
|
import { ODClientActivityManager } from "../modules/client"
|
||||||
|
import { ODEvent, ODEventManager } from "../modules/event"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
//DEFAULT MODULES
|
||||||
|
import { ODVersionManager_Default } from "./base"
|
||||||
|
import { ODConfigManager_Default} from "./config"
|
||||||
|
import { ODDatabaseManager_Default } from "./database"
|
||||||
|
import { ODFlagManager_Default } from "./flag"
|
||||||
|
import { ODSessionManager_Default } from "./session"
|
||||||
|
import { ODLanguageManager_Default } from "./language"
|
||||||
|
import { ODCheckerFunctionManager_Default, ODCheckerManager_Default, ODCheckerRenderer_Default, ODCheckerTranslationRegister_Default } from "./checker"
|
||||||
|
import { ODClientManager_Default, ODSlashCommandManager_Default, ODTextCommandManager_Default } from "./client"
|
||||||
|
import { ODBuilderManager_Default, ODButtonManager_Default, ODDropdownManager_Default, ODEmbedManager_Default, ODFileManager_Default, ODMessageManager_Default, ODModalManager_Default } from "./builder"
|
||||||
|
import { ODButtonResponderManager_Default, ODCommandResponderManager_Default, ODDropdownResponderManager_Default, ODModalResponderManager_Default, ODResponderManager_Default } from "./responder"
|
||||||
|
import { ODActionManager_Default } from "./action"
|
||||||
|
import { ODPermissionManager_Default } from "./permission"
|
||||||
|
import { ODHelpMenuManager_Default } from "./helpmenu"
|
||||||
|
import { ODStatsManager_Default } from "./stat"
|
||||||
|
import { ODCodeManager_Default } from "./code"
|
||||||
|
import { ODCooldownManager_Default } from "./cooldown"
|
||||||
|
import { ODPostManager_Default } from "./post"
|
||||||
|
import { ODVerifyBarManager_Default } from "./verifybar"
|
||||||
|
import { ODStartScreenManager_Default } from "./startscreen"
|
||||||
|
import { ODLiveStatusManager_Default } from "./console"
|
||||||
|
|
||||||
|
//OPEN TICKET MODULES
|
||||||
|
import { ODOptionManager, ODTicketOption } from "../openticket/option"
|
||||||
|
import { ODPanel, ODPanelManager } from "../openticket/panel"
|
||||||
|
import { ODTicket, ODTicketClearFilter, ODTicketManager } from "../openticket/ticket"
|
||||||
|
import { ODQuestionManager } from "../openticket/question"
|
||||||
|
import { ODBlacklistManager } from "../openticket/blacklist"
|
||||||
|
import { ODTranscriptManager_Default } from "../openticket/transcript"
|
||||||
|
import { ODRole, ODRoleManager } from "../openticket/role"
|
||||||
|
|
||||||
|
/**## ODEventIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODEvent_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODEventIds_Default {
|
||||||
|
//error handling
|
||||||
|
"onErrorHandling": ODEvent_Default<(error:Error, origin:NodeJS.UncaughtExceptionOrigin) => ODPromiseVoid>
|
||||||
|
"afterErrorHandling": ODEvent_Default<(error:Error, origin:NodeJS.UncaughtExceptionOrigin, message:ODError) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//plugins
|
||||||
|
"afterPluginsLoaded": ODEvent_Default<(plugins:ODPluginManager) => ODPromiseVoid>
|
||||||
|
"onPluginClassLoad": ODEvent_Default<(classes:ODPluginClassManager, plugins:ODPluginManager) => ODPromiseVoid>
|
||||||
|
"afterPluginClassesLoaded": ODEvent_Default<(classes:ODPluginClassManager, plugins:ODPluginManager) => ODPromiseVoid>
|
||||||
|
"onPluginEventLoad": ODEvent_Default<(classes:ODPluginEventManager, plugins:ODPluginManager) => ODPromiseVoid>
|
||||||
|
"afterPluginEventsLoaded": ODEvent_Default<(classes:ODPluginEventManager, plugins:ODPluginManager) => ODPromiseVoid>
|
||||||
|
|
||||||
|
|
||||||
|
"onFlagLoad": ODEvent_Default<(flags:ODFlagManager_Default) => ODPromiseVoid>
|
||||||
|
"afterFlagsLoaded": ODEvent_Default<(flags:ODFlagManager_Default) => ODPromiseVoid>
|
||||||
|
"onFlagInit": ODEvent_Default<(flags:ODFlagManager_Default) => ODPromiseVoid>
|
||||||
|
"afterFlagsInitiated": ODEvent_Default<(flags:ODFlagManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//configs
|
||||||
|
"onConfigLoad": ODEvent_Default<(configs:ODConfigManager_Default) => ODPromiseVoid>
|
||||||
|
"afterConfigsLoaded": ODEvent_Default<(configs:ODConfigManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//databases
|
||||||
|
"onDatabaseLoad": ODEvent_Default<(databases:ODDatabaseManager_Default) => ODPromiseVoid>
|
||||||
|
"afterDatabasesLoaded": ODEvent_Default<(databases:ODDatabaseManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//languages
|
||||||
|
"onLanguageLoad": ODEvent_Default<(languages:ODLanguageManager_Default) => ODPromiseVoid>
|
||||||
|
"afterLanguagesLoaded": ODEvent_Default<(languages:ODLanguageManager_Default) => ODPromiseVoid>
|
||||||
|
"onLanguageSelect": ODEvent_Default<(languages:ODLanguageManager_Default) => ODPromiseVoid>
|
||||||
|
"afterLanguagesSelected": ODEvent_Default<(main:ODLanguage|null, backup:ODLanguage|null, languages:ODLanguageManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//sessions
|
||||||
|
"onSessionLoad": ODEvent_Default<(languages:ODSessionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterSessionsLoaded": ODEvent_Default<(languages:ODSessionManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//config checkers
|
||||||
|
"onCheckerLoad": ODEvent_Default<(checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCheckersLoaded": ODEvent_Default<(checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"onCheckerFunctionLoad": ODEvent_Default<(functions:ODCheckerFunctionManager_Default, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCheckerFunctionsLoaded": ODEvent_Default<(functions:ODCheckerFunctionManager_Default, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"onCheckerExecute": ODEvent_Default<(checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCheckersExecuted": ODEvent_Default<(result:ODCheckerResult, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"onCheckerTranslationLoad": ODEvent_Default<(translations:ODCheckerTranslationRegister_Default, enabled:boolean, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCheckerTranslationsLoaded": ODEvent_Default<(translations:ODCheckerTranslationRegister_Default, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"onCheckerRender": ODEvent_Default<(renderer:ODCheckerRenderer_Default, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCheckersRendered": ODEvent_Default<(renderer:ODCheckerRenderer_Default, checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
"onCheckerQuit": ODEvent_Default<(checkers:ODCheckerManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//client configuration
|
||||||
|
"onClientLoad": ODEvent_Default<(client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterClientLoaded": ODEvent_Default<(client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"onClientInit": ODEvent_Default<(client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterClientInitiated": ODEvent_Default<(client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"onClientReady": ODEvent_Default<(client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterClientReady": ODEvent_Default<(client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"onClientActivityLoad": ODEvent_Default<(activity:ODClientActivityManager, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterClientActivityLoaded": ODEvent_Default<(activity:ODClientActivityManager, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"onClientActivityInit": ODEvent_Default<(activity:ODClientActivityManager, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterClientActivityInitiated": ODEvent_Default<(activity:ODClientActivityManager, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//client slash commands
|
||||||
|
"onSlashCommandLoad": ODEvent_Default<(slash:ODSlashCommandManager_Default, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterSlashCommandsLoaded": ODEvent_Default<(slash:ODSlashCommandManager_Default, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"onSlashCommandRegister": ODEvent_Default<(slash:ODSlashCommandManager_Default, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
"afterSlashCommandsRegistered": ODEvent_Default<(slash:ODSlashCommandManager_Default, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//client text commands
|
||||||
|
"onTextCommandLoad": ODEvent_Default<(text:ODTextCommandManager_Default, client:ODClientManager_Default,) => ODPromiseVoid>
|
||||||
|
"afterTextCommandsLoaded": ODEvent_Default<(text:ODTextCommandManager_Default, client:ODClientManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//questions
|
||||||
|
"onQuestionLoad": ODEvent_Default<(questions:ODQuestionManager) => ODPromiseVoid>
|
||||||
|
"afterQuestionsLoaded": ODEvent_Default<(questions:ODQuestionManager) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//options
|
||||||
|
"onOptionLoad": ODEvent_Default<(options:ODOptionManager) => ODPromiseVoid>
|
||||||
|
"afterOptionsLoaded": ODEvent_Default<(options:ODOptionManager) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//panels
|
||||||
|
"onPanelLoad": ODEvent_Default<(panels:ODPanelManager) => ODPromiseVoid>
|
||||||
|
"afterPanelsLoaded": ODEvent_Default<(panels:ODPanelManager) => ODPromiseVoid>
|
||||||
|
"onPanelSpawn": ODEvent_Default<(panel:ODPanel) => ODPromiseVoid>
|
||||||
|
"afterPanelSpawned": ODEvent_Default<(panel:ODPanel) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//tickets
|
||||||
|
"onTicketLoad": ODEvent_Default<(tickets:ODTicketManager) => ODPromiseVoid>
|
||||||
|
"afterTicketsLoaded": ODEvent_Default<(tickets:ODTicketManager) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//ticket creation
|
||||||
|
"onTicketChannelCreation": ODEvent_Default<(option:ODTicketOption, user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTicketChannelCreated": ODEvent_Default<(option:ODTicketOption, channel:discord.GuildTextBasedChannel, user:discord.User) => ODPromiseVoid>
|
||||||
|
"onTicketChannelDeletion": ODEvent_Default<(ticket:ODTicket, channel:discord.GuildTextBasedChannel, user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTicketChannelDeleted": ODEvent_Default<(ticket:ODTicket, user:discord.User) => ODPromiseVoid>
|
||||||
|
"onTicketPermissionsCreated": ODEvent_Default<(option:ODTicketOption, permissions:ODPermissionManager_Default, channel:discord.GuildTextBasedChannel, user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTicketPermissionsCreated": ODEvent_Default<(option:ODTicketOption, permissions:ODPermissionManager_Default, channel:discord.GuildTextBasedChannel, user:discord.User) => ODPromiseVoid>
|
||||||
|
"onTicketMainMessageCreated": ODEvent_Default<(ticket:ODTicket, channel:discord.GuildTextBasedChannel, user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTicketMainMessageCreated": ODEvent_Default<(ticket:ODTicket, message:discord.Message, channel:discord.GuildTextBasedChannel, user:discord.User) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//ticket actions
|
||||||
|
"onTicketCreate": ODEvent_Default<(creator:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTicketCreated": ODEvent_Default<(ticket:ODTicket, creator:discord.User, channel:discord.GuildTextBasedChannel) => ODPromiseVoid>
|
||||||
|
"onTicketClose": ODEvent_Default<(ticket:ODTicket, closer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketClosed": ODEvent_Default<(ticket:ODTicket, closer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketReopen": ODEvent_Default<(ticket:ODTicket, reopener:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketReopened": ODEvent_Default<(ticket:ODTicket, reopener:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketDelete": ODEvent_Default<(ticket:ODTicket, deleter:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketDeleted": ODEvent_Default<(ticket:ODTicket, deleter:discord.User, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketMove": ODEvent_Default<(ticket:ODTicket, mover:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketMoved": ODEvent_Default<(ticket:ODTicket, mover:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketClaim": ODEvent_Default<(ticket:ODTicket, claimer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketClaimed": ODEvent_Default<(ticket:ODTicket, claimer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketUnclaim": ODEvent_Default<(ticket:ODTicket, unclaimer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketUnclaimed": ODEvent_Default<(ticket:ODTicket, unclaimer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketPin": ODEvent_Default<(ticket:ODTicket, pinner:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketPinned": ODEvent_Default<(ticket:ODTicket, pinner:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketUnpin": ODEvent_Default<(ticket:ODTicket, unpinner:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketUnpinned": ODEvent_Default<(ticket:ODTicket, unpinner:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketUserAdd": ODEvent_Default<(ticket:ODTicket, adder:discord.User, user:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketUserAdded": ODEvent_Default<(ticket:ODTicket, adder:discord.User, user:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketUserRemove": ODEvent_Default<(ticket:ODTicket, remover:discord.User, user:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketUserRemoved": ODEvent_Default<(ticket:ODTicket, remover:discord.User, user:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketRename": ODEvent_Default<(ticket:ODTicket, renamer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"afterTicketRenamed": ODEvent_Default<(ticket:ODTicket, renamer:discord.User, channel:discord.GuildTextBasedChannel, reason:string|null) => ODPromiseVoid>
|
||||||
|
"onTicketsClear": ODEvent_Default<(tickets:ODTicket[], clearer:discord.User, channel:discord.GuildTextBasedChannel, filter:ODTicketClearFilter) => ODPromiseVoid>
|
||||||
|
"afterTicketsCleared": ODEvent_Default<(tickets:ODTicket[], clearer:discord.User, channel:discord.GuildTextBasedChannel, filter:ODTicketClearFilter) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//roles
|
||||||
|
"onRoleLoad": ODEvent_Default<(roles:ODRoleManager) => ODPromiseVoid>
|
||||||
|
"afterRolesLoaded": ODEvent_Default<(roles:ODRoleManager) => ODPromiseVoid>
|
||||||
|
"onRoleUpdate": ODEvent_Default<(user:discord.User,role:ODRole) => ODPromiseVoid>
|
||||||
|
"afterRolesUpdated": ODEvent_Default<(user:discord.User,role:ODRole) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//blacklist
|
||||||
|
"onBlacklistLoad": ODEvent_Default<(blacklist:ODBlacklistManager) => ODPromiseVoid>
|
||||||
|
"afterBlacklistLoaded": ODEvent_Default<(blacklist:ODBlacklistManager) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//transcripts
|
||||||
|
"onTranscriptCompilerLoad": ODEvent_Default<(transcripts:ODTranscriptManager_Default) => ODPromiseVoid>
|
||||||
|
"afterTranscriptCompilersLoaded": ODEvent_Default<(transcripts:ODTranscriptManager_Default) => ODPromiseVoid>
|
||||||
|
"onTranscriptHistoryLoad": ODEvent_Default<(transcripts:ODTranscriptManager_Default) => ODPromiseVoid>
|
||||||
|
"afterTranscriptHistoryLoaded": ODEvent_Default<(transcripts:ODTranscriptManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//transcript creation
|
||||||
|
"onTranscriptCreate": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTranscriptCreated": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"onTranscriptInit": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTranscriptInitiated": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"onTranscriptCompile": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTranscriptCompiled": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"onTranscriptReady": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
"afterTranscriptReady": ODEvent_Default<(transcripts:ODTranscriptManager_Default,ticket:ODTicket,channel:discord.TextChannel,user:discord.User) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//builders
|
||||||
|
"onButtonBuilderLoad": ODEvent_Default<(buttons:ODButtonManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterButtonBuildersLoaded": ODEvent_Default<(buttons:ODButtonManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onDropdownBuilderLoad": ODEvent_Default<(dropdowns:ODDropdownManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterDropdownBuildersLoaded": ODEvent_Default<(dropdowns:ODDropdownManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onFileBuilderLoad": ODEvent_Default<(files:ODFileManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterFileBuildersLoaded": ODEvent_Default<(files:ODFileManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onEmbedBuilderLoad": ODEvent_Default<(embeds:ODEmbedManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterEmbedBuildersLoaded": ODEvent_Default<(embeds:ODEmbedManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onMessageBuilderLoad": ODEvent_Default<(messages:ODMessageManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterMessageBuildersLoaded": ODEvent_Default<(messages:ODMessageManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onModalBuilderLoad": ODEvent_Default<(modals:ODModalManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterModalBuildersLoaded": ODEvent_Default<(modals:ODModalManager_Default, builders:ODBuilderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//responders
|
||||||
|
"onCommandResponderLoad": ODEvent_Default<(commands:ODCommandResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCommandRespondersLoaded": ODEvent_Default<(commands:ODCommandResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onButtonResponderLoad": ODEvent_Default<(buttons:ODButtonResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterButtonRespondersLoaded": ODEvent_Default<(buttons:ODButtonResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onDropdownResponderLoad": ODEvent_Default<(dropdowns:ODDropdownResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterDropdownRespondersLoaded": ODEvent_Default<(dropdowns:ODDropdownResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"onModalResponderLoad": ODEvent_Default<(modals:ODModalResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterModalRespondersLoaded": ODEvent_Default<(modals:ODModalResponderManager_Default, responders:ODResponderManager_Default, actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//actions
|
||||||
|
"onActionLoad": ODEvent_Default<(actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterActionsLoaded": ODEvent_Default<(actions:ODActionManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//verifybars
|
||||||
|
"onVerifyBarLoad": ODEvent_Default<(verifybars:ODVerifyBarManager_Default) => ODPromiseVoid>
|
||||||
|
"afterVerifyBarsLoaded": ODEvent_Default<(verifybars:ODVerifyBarManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//permissions
|
||||||
|
"onPermissionLoad": ODEvent_Default<(permissions:ODPermissionManager_Default) => ODPromiseVoid>
|
||||||
|
"afterPermissionsLoaded": ODEvent_Default<(permissions:ODPermissionManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//posts
|
||||||
|
"onPostLoad": ODEvent_Default<(posts:ODPostManager_Default) => ODPromiseVoid>
|
||||||
|
"afterPostsLoaded": ODEvent_Default<(posts:ODPostManager_Default) => ODPromiseVoid>
|
||||||
|
"onPostInit": ODEvent_Default<(posts:ODPostManager_Default) => ODPromiseVoid>
|
||||||
|
"afterPostsInitiated": ODEvent_Default<(posts:ODPostManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//cooldowns
|
||||||
|
"onCooldownLoad": ODEvent_Default<(cooldowns:ODCooldownManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCooldownsLoaded": ODEvent_Default<(cooldowns:ODCooldownManager_Default) => ODPromiseVoid>
|
||||||
|
"onCooldownInit": ODEvent_Default<(cooldowns:ODCooldownManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCooldownsInitiated": ODEvent_Default<(cooldowns:ODCooldownManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//help menu
|
||||||
|
"onHelpMenuCategoryLoad": ODEvent_Default<(menu:ODHelpMenuManager_Default) => ODPromiseVoid>
|
||||||
|
"afterHelpMenuCategoriesLoaded": ODEvent_Default<(menu:ODHelpMenuManager_Default) => ODPromiseVoid>
|
||||||
|
"onHelpMenuComponentLoad": ODEvent_Default<(menu:ODHelpMenuManager_Default) => ODPromiseVoid>
|
||||||
|
"afterHelpMenuComponentsLoaded": ODEvent_Default<(menu:ODHelpMenuManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//stats
|
||||||
|
"onStatScopeLoad": ODEvent_Default<(stats:ODStatsManager_Default) => ODPromiseVoid>
|
||||||
|
"afterStatScopesLoaded": ODEvent_Default<(stats:ODStatsManager_Default) => ODPromiseVoid>
|
||||||
|
"onStatLoad": ODEvent_Default<(stats:ODStatsManager_Default) => ODPromiseVoid>
|
||||||
|
"afterStatsLoaded": ODEvent_Default<(stats:ODStatsManager_Default) => ODPromiseVoid>
|
||||||
|
"onStatInit": ODEvent_Default<(stats:ODStatsManager_Default) => ODPromiseVoid>
|
||||||
|
"afterStatsInitiated": ODEvent_Default<(stats:ODStatsManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//code
|
||||||
|
"onCodeLoad": ODEvent_Default<(code:ODCodeManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCodeLoaded": ODEvent_Default<(code:ODCodeManager_Default) => ODPromiseVoid>
|
||||||
|
"onCodeExecute": ODEvent_Default<(code:ODCodeManager_Default) => ODPromiseVoid>
|
||||||
|
"afterCodeExecuted": ODEvent_Default<(code:ODCodeManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//livestatus
|
||||||
|
"onLiveStatusSourceLoad": ODEvent_Default<(livestatus:ODLiveStatusManager_Default) => ODPromiseVoid>
|
||||||
|
"afterLiveStatusSourcesLoaded": ODEvent_Default<(livestatus:ODLiveStatusManager_Default) => ODPromiseVoid>
|
||||||
|
|
||||||
|
//startscreen
|
||||||
|
"onStartScreenLoad": ODEvent_Default<(startscreen:ODStartScreenManager_Default) => ODPromiseVoid>
|
||||||
|
"afterStartScreensLoaded": ODEvent_Default<(startscreen:ODStartScreenManager_Default) => ODPromiseVoid>
|
||||||
|
"onStartScreenRender": ODEvent_Default<(startscreen:ODStartScreenManager_Default) => ODPromiseVoid>
|
||||||
|
"afterStartScreensRendered": ODEvent_Default<(startscreen:ODStartScreenManager_Default) => ODPromiseVoid>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODEventManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODEvent class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.events`!
|
||||||
|
*/
|
||||||
|
export class ODEventManager_Default extends ODEventManager {
|
||||||
|
get<StartScreenId extends keyof ODEventIds_Default>(id:StartScreenId): ODEventIds_Default[StartScreenId]
|
||||||
|
get(id:ODValidId): ODEvent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODEvent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StartScreenId extends keyof ODEventIds_Default>(id:StartScreenId): ODEventIds_Default[StartScreenId]
|
||||||
|
remove(id:ODValidId): ODEvent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODEvent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODEventIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODEventManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODEvent class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.events`!
|
||||||
|
*/
|
||||||
|
export class ODEvent_Default<Callback extends ((...args:any) => ODPromiseVoid)> extends ODEvent {
|
||||||
|
listen(callback:Callback): void {
|
||||||
|
return super.listen(callback)
|
||||||
|
}
|
||||||
|
listenOnce(callback:Callback): void {
|
||||||
|
return super.listenOnce(callback)
|
||||||
|
}
|
||||||
|
wait(): Promise<Parameters<Callback>>
|
||||||
|
wait(): Promise<any[]> {
|
||||||
|
return super.wait()
|
||||||
|
}
|
||||||
|
emit(params:Parameters<Callback>): Promise<void> {
|
||||||
|
return super.emit(params)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT PROCESS MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODFlagManager, ODFlag } from "../modules/flag"
|
||||||
|
|
||||||
|
/**## ODFlagManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODFlagManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODFlagManagerIds_Default {
|
||||||
|
"openticket:no-migration":ODFlag,
|
||||||
|
"openticket:dev-config":ODFlag,
|
||||||
|
"openticket:dev-database":ODFlag,
|
||||||
|
"openticket:debug":ODFlag,
|
||||||
|
"openticket:crash":ODFlag,
|
||||||
|
"openticket:no-transcripts":ODFlag,
|
||||||
|
"openticket:no-checker":ODFlag,
|
||||||
|
"openticket:checker":ODFlag,
|
||||||
|
"openticket:no-easter":ODFlag,
|
||||||
|
"openticket:no-plugins":ODFlag,
|
||||||
|
"openticket:soft-plugins":ODFlag,
|
||||||
|
"openticket:force-slash-update":ODFlag,
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODFlagManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODFlagManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.flags`!
|
||||||
|
*/
|
||||||
|
export class ODFlagManager_Default extends ODFlagManager {
|
||||||
|
get<FlagId extends keyof ODFlagManagerIds_Default>(id:FlagId): ODFlagManagerIds_Default[FlagId]
|
||||||
|
get(id:ODValidId): ODFlag|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODFlag|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<FlagId extends keyof ODFlagManagerIds_Default>(id:FlagId): ODFlagManagerIds_Default[FlagId]
|
||||||
|
remove(id:ODValidId): ODFlag|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODFlag|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODFlagManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,323 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT HELP MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODHelpMenuCategory, ODHelpMenuCommandComponent, ODHelpMenuComponent, ODHelpMenuManager } from "../modules/helpmenu"
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerIds_Default {
|
||||||
|
"openticket:general":ODHelpMenuCategory_DefaultGeneral,
|
||||||
|
"openticket:ticket-basic":ODHelpMenuCategory_DefaultTicketBasic,
|
||||||
|
"openticket:ticket-advanced":ODHelpMenuCategory_DefaultTicketAdvanced,
|
||||||
|
"openticket:ticket-user":ODHelpMenuCategory_DefaultTicketUser,
|
||||||
|
"openticket:admin":ODHelpMenuCategory_DefaultAdmin,
|
||||||
|
"openticket:advanced":ODHelpMenuCategory_DefaultAdvanced,
|
||||||
|
"openticket:extra":ODHelpMenuCategory_DefaultExtra
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuManager_Default extends ODHelpMenuManager {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerIds_Default>(id:HelpMenuCategoryId): ODHelpMenuManagerIds_Default[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuCategory|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuCategory|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerIds_Default>(id:HelpMenuCategoryId): ODHelpMenuManagerIds_Default[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuCategory|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuCategory|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultGeneral `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultGeneral` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultGeneral {
|
||||||
|
"openticket:help":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:ticket":ODHelpMenuCommandComponent|null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultGeneral `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:general` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultGeneral extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultGeneral>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultGeneral[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultGeneral>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultGeneral[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultGeneral): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultTicketBasic `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultTicketBasic` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultTicketBasic {
|
||||||
|
"openticket:close":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:delete":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:reopen":ODHelpMenuCommandComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultTicketBasic `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:ticket` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultTicketBasic extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketBasic>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketBasic[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketBasic>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketBasic[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultTicketBasic): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultTicketAdvanced` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced {
|
||||||
|
"openticket:pin":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:unpin":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:move":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:rename":ODHelpMenuCommandComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultTicketAdvanced `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:ticket` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultTicketAdvanced extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultTicketAdvanced): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultTicketUser `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultTicketUser` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultTicketUser {
|
||||||
|
"openticket:claim":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:unclaim":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:add":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:remove":ODHelpMenuCommandComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultTicketUser `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:ticket` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultTicketUser extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketUser>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketUser[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultTicketUser>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultTicketUser[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultTicketUser): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultAdmin `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultAdmin` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultAdmin {
|
||||||
|
"openticket:panel":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:blacklist-view":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:blacklist-add":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:blacklist-remove":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:blacklist-get":ODHelpMenuCommandComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultAdmin `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:admin` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultAdmin extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultAdmin>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultAdmin[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultAdmin>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultAdmin[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultAdmin): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultAdvanced `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultAdvanced` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultAdvanced {
|
||||||
|
"openticket:stats-global":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:stats-reset":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:stats-ticket":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:stats-user":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:autoclose-disable":ODHelpMenuCommandComponent,
|
||||||
|
"openticket:autoclose-enable":ODHelpMenuCommandComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultAdvanced `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:advanced` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultAdvanced extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultAdvanced>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultAdvanced[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultAdvanced>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultAdvanced[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultAdvanced): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODHelpMenuManagerCategoryIds_DefaultExtra `type`
|
||||||
|
* This type is an array of ids available in the `ODHelpMenuCategory_DefaultExtra` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODHelpMenuManagerCategoryIds_DefaultExtra {}
|
||||||
|
|
||||||
|
/**## ODHelpMenuCategory_DefaultExtra `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODHelpMenuManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:general` category in `openticket.helpmenu`!
|
||||||
|
*/
|
||||||
|
export class ODHelpMenuCategory_DefaultExtra extends ODHelpMenuCategory {
|
||||||
|
get<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultExtra>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultExtra[HelpMenuCategoryId]
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<HelpMenuCategoryId extends keyof ODHelpMenuManagerCategoryIds_DefaultExtra>(id:HelpMenuCategoryId): ODHelpMenuManagerCategoryIds_DefaultExtra[HelpMenuCategoryId]
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODHelpMenuComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODHelpMenuManagerCategoryIds_DefaultExtra): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,510 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT LANGUAGE MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODLanguageManager, ODLanguage } from "../modules/language"
|
||||||
|
|
||||||
|
/**## ODLanguageManagerTranslations_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODLanguageManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export type ODLanguageManagerTranslations_Default = (
|
||||||
|
"checker.system.headerOpenTicket"|
|
||||||
|
"checker.system.typeError"|
|
||||||
|
"checker.system.typeWarning"|
|
||||||
|
"checker.system.typeInfo"|
|
||||||
|
"checker.system.headerConfigChecker"|
|
||||||
|
"checker.system.headerDescription"|
|
||||||
|
"checker.system.footerError"|
|
||||||
|
"checker.system.footerWarning"|
|
||||||
|
"checker.system.footerSupport"|
|
||||||
|
"checker.system.compactInformation"|
|
||||||
|
"checker.system.dataPath"|
|
||||||
|
"checker.system.dataDocs"|
|
||||||
|
"checker.system.dataMessages"|
|
||||||
|
"checker.messages.invalidType"|
|
||||||
|
"checker.messages.propertyMissing"|
|
||||||
|
"checker.messages.propertyOptional"|
|
||||||
|
"checker.messages.objectDisabled"|
|
||||||
|
"checker.messages.nullInvalid"|
|
||||||
|
"checker.messages.switchInvalidType"|
|
||||||
|
"checker.messages.objectSwitchInvalid"|
|
||||||
|
"checker.messages.stringTooShort"|
|
||||||
|
"checker.messages.stringTooLong"|
|
||||||
|
"checker.messages.stringLengthInvalid"|
|
||||||
|
"checker.messages.stringStartsWith"|
|
||||||
|
"checker.messages.stringEndsWith"|
|
||||||
|
"checker.messages.stringContains"|
|
||||||
|
"checker.messages.stringChoices"|
|
||||||
|
"checker.messages.stringRegex"|
|
||||||
|
"checker.messages.numberTooShort"|
|
||||||
|
"checker.messages.numberTooLong"|
|
||||||
|
"checker.messages.numberLengthInvalid"|
|
||||||
|
"checker.messages.numberTooSmall"|
|
||||||
|
"checker.messages.numberTooLarge"|
|
||||||
|
"checker.messages.numberNotEqual"|
|
||||||
|
"checker.messages.numberStep"|
|
||||||
|
"checker.messages.numberStepOffset"|
|
||||||
|
"checker.messages.numberStartsWith"|
|
||||||
|
"checker.messages.numberEndsWith"|
|
||||||
|
"checker.messages.numberContains"|
|
||||||
|
"checker.messages.numberChoices"|
|
||||||
|
"checker.messages.numberFloat"|
|
||||||
|
"checker.messages.numberNegative"|
|
||||||
|
"checker.messages.numberPositive"|
|
||||||
|
"checker.messages.numberZero"|
|
||||||
|
"checker.messages.booleanTrue"|
|
||||||
|
"checker.messages.booleanFalse"|
|
||||||
|
"checker.messages.arrayEmptyDisabled"|
|
||||||
|
"checker.messages.arrayEmptyRequired"|
|
||||||
|
"checker.messages.arrayTooShort"|
|
||||||
|
"checker.messages.arrayTooLong"|
|
||||||
|
"checker.messages.arrayLengthInvalid"|
|
||||||
|
"checker.messages.arrayInvalidTypes"|
|
||||||
|
"checker.messages.arrayDouble"|
|
||||||
|
"checker.messages.discordInvalidId"|
|
||||||
|
"checker.messages.discordInvalidIdOptions"|
|
||||||
|
"checker.messages.discordInvalidToken"|
|
||||||
|
"checker.messages.colorInvalid"|
|
||||||
|
"checker.messages.emojiTooShort"|
|
||||||
|
"checker.messages.emojiTooLong"|
|
||||||
|
"checker.messages.emojiCustom"|
|
||||||
|
"checker.messages.emojiInvalid"|
|
||||||
|
"checker.messages.urlInvalid"|
|
||||||
|
"checker.messages.urlInvalidHttp"|
|
||||||
|
"checker.messages.urlInvalidProtocol"|
|
||||||
|
"checker.messages.urlInvalidHostname"|
|
||||||
|
"checker.messages.urlInvalidExtension"|
|
||||||
|
"checker.messages.urlInvalidPath"|
|
||||||
|
"checker.messages.idNotUnique"|
|
||||||
|
"checker.messages.idNonExistent"|
|
||||||
|
"checker.messages.invalidLanguage"|
|
||||||
|
"checker.messages.invalidButton"|
|
||||||
|
"checker.messages.unusedOption"|
|
||||||
|
"checker.messages.unusedQuestion"|
|
||||||
|
"checker.messages.dropdownOption"|
|
||||||
|
"actions.buttons.create"|
|
||||||
|
"actions.buttons.close"|
|
||||||
|
"actions.buttons.delete"|
|
||||||
|
"actions.buttons.reopen"|
|
||||||
|
"actions.buttons.claim"|
|
||||||
|
"actions.buttons.unclaim"|
|
||||||
|
"actions.buttons.pin"|
|
||||||
|
"actions.buttons.unpin"|
|
||||||
|
"actions.buttons.clear"|
|
||||||
|
"actions.buttons.helpSwitchSlash"|
|
||||||
|
"actions.buttons.helpSwitchText"|
|
||||||
|
"actions.buttons.helpPage"|
|
||||||
|
"actions.buttons.withReason"|
|
||||||
|
"actions.buttons.withoutTranscript"|
|
||||||
|
|
||||||
|
"actions.titles.created"|
|
||||||
|
"actions.titles.close"|
|
||||||
|
"actions.titles.delete"|
|
||||||
|
"actions.titles.reopen"|
|
||||||
|
"actions.titles.claim"|
|
||||||
|
"actions.titles.unclaim"|
|
||||||
|
"actions.titles.pin"|
|
||||||
|
"actions.titles.unpin"|
|
||||||
|
"actions.titles.rename"|
|
||||||
|
"actions.titles.move"|
|
||||||
|
"actions.titles.add"|
|
||||||
|
"actions.titles.remove"|
|
||||||
|
|
||||||
|
"actions.titles.help"|
|
||||||
|
"actions.titles.statsReset"|
|
||||||
|
"actions.titles.blacklistAdd"|
|
||||||
|
"actions.titles.blacklistRemove"|
|
||||||
|
"actions.titles.blacklistGet"|
|
||||||
|
"actions.titles.blacklistView"|
|
||||||
|
"actions.titles.blacklistAddDm"|
|
||||||
|
"actions.titles.blacklistRemoveDm"|
|
||||||
|
"actions.titles.clear"|
|
||||||
|
"actions.titles.roles"|
|
||||||
|
|
||||||
|
"actions.titles.autoclose"|
|
||||||
|
"actions.titles.autocloseEnabled"|
|
||||||
|
"actions.titles.autocloseDisabled"|
|
||||||
|
"actions.titles.autodelete"|
|
||||||
|
"actions.titles.autodeleteEnabled"|
|
||||||
|
"actions.titles.autodeleteDisabled"|
|
||||||
|
|
||||||
|
"actions.descriptions.create"|
|
||||||
|
"actions.descriptions.close"|
|
||||||
|
"actions.descriptions.delete"|
|
||||||
|
"actions.descriptions.reopen"|
|
||||||
|
"actions.descriptions.claim"|
|
||||||
|
"actions.descriptions.unclaim"|
|
||||||
|
"actions.descriptions.pin"|
|
||||||
|
"actions.descriptions.unpin"|
|
||||||
|
"actions.descriptions.rename"|
|
||||||
|
"actions.descriptions.move"|
|
||||||
|
"actions.descriptions.add"|
|
||||||
|
"actions.descriptions.remove"|
|
||||||
|
|
||||||
|
"actions.descriptions.helpExplanation"|
|
||||||
|
"actions.descriptions.statsReset"|
|
||||||
|
"actions.descriptions.statsError"|
|
||||||
|
"actions.descriptions.blacklistAdd"|
|
||||||
|
"actions.descriptions.blacklistRemove"|
|
||||||
|
"actions.descriptions.blacklistGetSuccess"|
|
||||||
|
"actions.descriptions.blacklistGetEmpty"|
|
||||||
|
"actions.descriptions.blacklistViewEmpty"|
|
||||||
|
"actions.descriptions.blacklistViewTip"|
|
||||||
|
"actions.descriptions.clearVerify"|
|
||||||
|
"actions.descriptions.clearReady"|
|
||||||
|
"actions.descriptions.rolesEmpty"|
|
||||||
|
|
||||||
|
"actions.descriptions.autocloseLeave"|
|
||||||
|
"actions.descriptions.autocloseTimeout"|
|
||||||
|
"actions.descriptions.autodeleteLeave"|
|
||||||
|
"actions.descriptions.autodeleteTimeout"|
|
||||||
|
"actions.descriptions.autocloseEnabled"|
|
||||||
|
"actions.descriptions.autocloseDisabled"|
|
||||||
|
"actions.descriptions.autodeleteEnabled"|
|
||||||
|
"actions.descriptions.autodeleteDisabled"|
|
||||||
|
|
||||||
|
"actions.descriptions.ticketMessageLimit"|
|
||||||
|
"actions.descriptions.ticketMessageAutoclose"|
|
||||||
|
"actions.descriptions.ticketMessageAutodelete"|
|
||||||
|
"actions.descriptions.panelReady"|
|
||||||
|
|
||||||
|
"actions.modal.closePlaceholder"|
|
||||||
|
"actions.modal.deletePlaceholder"|
|
||||||
|
"actions.modal.reopenPlaceholder"|
|
||||||
|
"actions.modal.claimPlaceholder"|
|
||||||
|
"actions.modal.unclaimPlaceholder"|
|
||||||
|
"actions.modal.pinPlaceholder"|
|
||||||
|
"actions.modal.unpinPlaceholder"|
|
||||||
|
|
||||||
|
"actions.logs.createLog"|
|
||||||
|
"actions.logs.closeLog"|
|
||||||
|
"actions.logs.closeDm"|
|
||||||
|
"actions.logs.deleteLog"|
|
||||||
|
"actions.logs.deleteDm"|
|
||||||
|
"actions.logs.reopenLog"|
|
||||||
|
"actions.logs.reopenDm"|
|
||||||
|
"actions.logs.claimLog"|
|
||||||
|
"actions.logs.claimDm"|
|
||||||
|
"actions.logs.unclaimLog"|
|
||||||
|
"actions.logs.unclaimDm"|
|
||||||
|
"actions.logs.pinLog"|
|
||||||
|
"actions.logs.pinDm"|
|
||||||
|
"actions.logs.unpinLog"|
|
||||||
|
"actions.logs.unpinDm"|
|
||||||
|
"actions.logs.renameLog"|
|
||||||
|
"actions.logs.renameDm"|
|
||||||
|
"actions.logs.moveLog"|
|
||||||
|
"actions.logs.moveDm"|
|
||||||
|
"actions.logs.addLog"|
|
||||||
|
"actions.logs.addDm"|
|
||||||
|
"actions.logs.removeLog"|
|
||||||
|
"actions.logs.removeDm"|
|
||||||
|
|
||||||
|
"actions.logs.blacklistAddLog"|
|
||||||
|
"actions.logs.blacklistRemoveLog"|
|
||||||
|
"actions.logs.blacklistAddDm"|
|
||||||
|
"actions.logs.blacklistRemoveDm"|
|
||||||
|
"actions.logs.clearLog"|
|
||||||
|
|
||||||
|
"transcripts.success.visit"|
|
||||||
|
"transcripts.success.ready"|
|
||||||
|
"transcripts.success.textFileDescription"|
|
||||||
|
"transcripts.success.htmlProgress"|
|
||||||
|
|
||||||
|
"transcripts.success.createdChannel"|
|
||||||
|
"transcripts.success.createdCreator"|
|
||||||
|
"transcripts.success.createdParticipant"|
|
||||||
|
"transcripts.success.createdActiveAdmin"|
|
||||||
|
"transcripts.success.createdEveryAdmin"|
|
||||||
|
"transcripts.success.createdOther"|
|
||||||
|
|
||||||
|
"transcripts.errors.retry"|
|
||||||
|
"transcripts.errors.continue"|
|
||||||
|
"transcripts.errors.backup"|
|
||||||
|
"transcripts.errors.error"|
|
||||||
|
|
||||||
|
"errors.titles.internalError"|
|
||||||
|
"errors.titles.optionMissing"|
|
||||||
|
"errors.titles.optionInvalid"|
|
||||||
|
"errors.titles.unknownCommand"|
|
||||||
|
"errors.titles.noPermissions"|
|
||||||
|
"errors.titles.unknownTicket"|
|
||||||
|
"errors.titles.deprecatedTicket"|
|
||||||
|
"errors.titles.unknownOption"|
|
||||||
|
"errors.titles.unknownPanel"|
|
||||||
|
"errors.titles.notInGuild"|
|
||||||
|
"errors.titles.channelRename"|
|
||||||
|
"errors.titles.busy"|
|
||||||
|
|
||||||
|
"errors.descriptions.askForInfo"|
|
||||||
|
"errors.descriptions.askForInfoResolve"|
|
||||||
|
"errors.descriptions.internalError"|
|
||||||
|
"errors.descriptions.optionMissing"|
|
||||||
|
"errors.descriptions.optionInvalid"|
|
||||||
|
"errors.descriptions.optionInvalidChoose"|
|
||||||
|
"errors.descriptions.unknownCommand"|
|
||||||
|
"errors.descriptions.noPermissions"|
|
||||||
|
"errors.descriptions.noPermissionsList"|
|
||||||
|
"errors.descriptions.noPermissionsCooldown"|
|
||||||
|
"errors.descriptions.noPermissionsBlacklist"|
|
||||||
|
"errors.descriptions.noPermissionsLimitGlobal"|
|
||||||
|
"errors.descriptions.noPermissionsLimitGlobalUser"|
|
||||||
|
"errors.descriptions.noPermissionsLimitOption"|
|
||||||
|
"errors.descriptions.noPermissionsLimitOptionUser"|
|
||||||
|
"errors.descriptions.unknownTicket"|
|
||||||
|
"errors.descriptions.deprecatedTicket"|
|
||||||
|
"errors.descriptions.notInGuild"|
|
||||||
|
"errors.descriptions.channelRename"|
|
||||||
|
"errors.descriptions.channelRenameSource"|
|
||||||
|
"errors.descriptions.busy"|
|
||||||
|
|
||||||
|
"errors.optionInvalidReasons.stringRegex"|
|
||||||
|
"errors.optionInvalidReasons.stringMinLength"|
|
||||||
|
"errors.optionInvalidReasons.stringMaxLength"|
|
||||||
|
"errors.optionInvalidReasons.numberInvalid"|
|
||||||
|
"errors.optionInvalidReasons.numberMin"|
|
||||||
|
"errors.optionInvalidReasons.numberMax"|
|
||||||
|
"errors.optionInvalidReasons.numberDecimal"|
|
||||||
|
"errors.optionInvalidReasons.numberNegative"|
|
||||||
|
"errors.optionInvalidReasons.numberPositive"|
|
||||||
|
"errors.optionInvalidReasons.numberZero"|
|
||||||
|
"errors.optionInvalidReasons.channelNotFound"|
|
||||||
|
"errors.optionInvalidReasons.userNotFound"|
|
||||||
|
"errors.optionInvalidReasons.roleNotFound"|
|
||||||
|
"errors.optionInvalidReasons.memberNotFound"|
|
||||||
|
"errors.optionInvalidReasons.mentionableNotFound"|
|
||||||
|
"errors.optionInvalidReasons.channelType"|
|
||||||
|
"errors.optionInvalidReasons.notInGuild"|
|
||||||
|
|
||||||
|
"errors.permissions.developer"|
|
||||||
|
"errors.permissions.owner"|
|
||||||
|
"errors.permissions.admin"|
|
||||||
|
"errors.permissions.moderator"|
|
||||||
|
"errors.permissions.support"|
|
||||||
|
"errors.permissions.member"|
|
||||||
|
"errors.permissions.discord-administrator"|
|
||||||
|
|
||||||
|
"errors.actionInvalid.close"|
|
||||||
|
"errors.actionInvalid.reopen"|
|
||||||
|
"errors.actionInvalid.claim"|
|
||||||
|
"errors.actionInvalid.unclaim"|
|
||||||
|
"errors.actionInvalid.pin"|
|
||||||
|
"errors.actionInvalid.unpin"|
|
||||||
|
"errors.actionInvalid.add"|
|
||||||
|
"errors.actionInvalid.remove"|
|
||||||
|
|
||||||
|
"params.uppercase.ticket"|
|
||||||
|
"params.uppercase.tickets"|
|
||||||
|
"params.uppercase.reason"|
|
||||||
|
"params.uppercase.creator"|
|
||||||
|
"params.uppercase.remaining"|
|
||||||
|
"params.uppercase.added"|
|
||||||
|
"params.uppercase.removed"|
|
||||||
|
"params.uppercase.filter"|
|
||||||
|
"params.uppercase.claimedBy"|
|
||||||
|
"params.uppercase.method"|
|
||||||
|
"params.uppercase.type"|
|
||||||
|
"params.uppercase.blacklisted"|
|
||||||
|
"params.uppercase.panel"|
|
||||||
|
"params.uppercase.command"|
|
||||||
|
"params.uppercase.system"|
|
||||||
|
"params.uppercase.true"|
|
||||||
|
"params.uppercase.false"|
|
||||||
|
"params.uppercase.syntax"|
|
||||||
|
"params.uppercase.originalName"|
|
||||||
|
"params.uppercase.newName"|
|
||||||
|
"params.uppercase.until"|
|
||||||
|
"params.uppercase.validOptions"|
|
||||||
|
"params.uppercase.validPanels"|
|
||||||
|
"params.uppercase.autoclose"|
|
||||||
|
"params.uppercase.autodelete"|
|
||||||
|
"params.uppercase.startupDate"|
|
||||||
|
"params.uppercase.version"|
|
||||||
|
"params.uppercase.name"|
|
||||||
|
"params.uppercase.role"|
|
||||||
|
"params.uppercase.status"|
|
||||||
|
"params.uppercase.claimed"|
|
||||||
|
"params.uppercase.pinned"|
|
||||||
|
"params.uppercase.creationDate"|
|
||||||
|
|
||||||
|
"params.lowercase.text"|
|
||||||
|
"params.lowercase.html"|
|
||||||
|
"params.lowercase.command"|
|
||||||
|
"params.lowercase.modal"|
|
||||||
|
"params.lowercase.button"|
|
||||||
|
"params.lowercase.dropdown"|
|
||||||
|
"params.lowercase.method"|
|
||||||
|
|
||||||
|
"commands.reason"|
|
||||||
|
"commands.help"|
|
||||||
|
"commands.panel"|
|
||||||
|
"commands.panelId"|
|
||||||
|
"commands.panelAutoUpdate"|
|
||||||
|
"commands.ticket"|
|
||||||
|
"commands.ticketId"|
|
||||||
|
"commands.close"|
|
||||||
|
"commands.delete"|
|
||||||
|
"commands.deleteNoTranscript"|
|
||||||
|
"commands.reopen"|
|
||||||
|
"commands.claim"|
|
||||||
|
"commands.claimUser"|
|
||||||
|
"commands.unclaim"|
|
||||||
|
"commands.pin"|
|
||||||
|
"commands.unpin"|
|
||||||
|
"commands.move"|
|
||||||
|
"commands.moveId"|
|
||||||
|
"commands.rename"|
|
||||||
|
"commands.renameName"|
|
||||||
|
"commands.add"|
|
||||||
|
"commands.addUser"|
|
||||||
|
"commands.remove"|
|
||||||
|
"commands.removeUser"|
|
||||||
|
"commands.blacklist"|
|
||||||
|
"commands.blacklistView"|
|
||||||
|
"commands.blacklistAdd"|
|
||||||
|
"commands.blacklistRemove"|
|
||||||
|
"commands.blacklistGet"|
|
||||||
|
"commands.blacklistGetUser"|
|
||||||
|
"commands.stats"|
|
||||||
|
"commands.statsReset"|
|
||||||
|
"commands.statsGlobal"|
|
||||||
|
"commands.statsUser"|
|
||||||
|
"commands.statsUserUser"|
|
||||||
|
"commands.statsTicket"|
|
||||||
|
"commands.statsTicketTicket"|
|
||||||
|
"commands.clear"|
|
||||||
|
"commands.clearFilter"|
|
||||||
|
|
||||||
|
"commands.clearFilters.all"|
|
||||||
|
"commands.clearFilters.open"|
|
||||||
|
"commands.clearFilters.close"|
|
||||||
|
"commands.clearFilters.claim"|
|
||||||
|
"commands.clearFilters.unclaim"|
|
||||||
|
"commands.clearFilters.pin"|
|
||||||
|
"commands.clearFilters.unpin"|
|
||||||
|
"commands.clearFilters.autoclose"|
|
||||||
|
|
||||||
|
"commands.autoclose"|
|
||||||
|
"commands.autocloseDisable"|
|
||||||
|
"commands.autocloseEnable"|
|
||||||
|
"commands.autocloseEnableTime"|
|
||||||
|
"commands.autodelete"|
|
||||||
|
"commands.autodeleteDisable"|
|
||||||
|
"commands.autodeleteEnable"|
|
||||||
|
"commands.autodeleteEnableTime"|
|
||||||
|
|
||||||
|
"helpMenu.help"|
|
||||||
|
"helpMenu.ticket"|
|
||||||
|
"helpMenu.close"|
|
||||||
|
"helpMenu.delete"|
|
||||||
|
"helpMenu.reopen"|
|
||||||
|
"helpMenu.pin"|
|
||||||
|
"helpMenu.unpin"|
|
||||||
|
"helpMenu.move"|
|
||||||
|
"helpMenu.rename"|
|
||||||
|
"helpMenu.claim"|
|
||||||
|
"helpMenu.unclaim"|
|
||||||
|
"helpMenu.add"|
|
||||||
|
"helpMenu.remove"|
|
||||||
|
"helpMenu.panel"|
|
||||||
|
"helpMenu.blacklistView"|
|
||||||
|
"helpMenu.blacklistAdd"|
|
||||||
|
"helpMenu.blacklistRemove"|
|
||||||
|
"helpMenu.blacklistGet"|
|
||||||
|
"helpMenu.statsGlobal"|
|
||||||
|
"helpMenu.statsTicket"|
|
||||||
|
"helpMenu.statsUser"|
|
||||||
|
"helpMenu.statsReset"|
|
||||||
|
"helpMenu.autocloseDisable"|
|
||||||
|
"helpMenu.autocloseEnable"|
|
||||||
|
"helpMenu.autodeleteDisable"|
|
||||||
|
"helpMenu.autodeleteEnable"|
|
||||||
|
|
||||||
|
"stats.scopes.global"|
|
||||||
|
"stats.scopes.system"|
|
||||||
|
"stats.scopes.user"|
|
||||||
|
"stats.scopes.ticket"|
|
||||||
|
"stats.scopes.participants"|
|
||||||
|
|
||||||
|
"stats.properties.ticketsCreated"|
|
||||||
|
"stats.properties.ticketsClosed"|
|
||||||
|
"stats.properties.ticketsDeleted"|
|
||||||
|
"stats.properties.ticketsReopened"|
|
||||||
|
"stats.properties.ticketsAutoclosed"|
|
||||||
|
"stats.properties.ticketsClaimed"|
|
||||||
|
"stats.properties.ticketsPinned"|
|
||||||
|
"stats.properties.ticketsMoved"|
|
||||||
|
"stats.properties.usersBlacklisted"|
|
||||||
|
"stats.properties.transcriptsCreated"
|
||||||
|
)
|
||||||
|
|
||||||
|
/**## ODLanguageManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODLanguageManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODLanguageManagerIds_Default {
|
||||||
|
"openticket:custom":ODLanguage,
|
||||||
|
"openticket:english":ODLanguage,
|
||||||
|
"openticket:dutch":ODLanguage,
|
||||||
|
"openticket:portuguese":ODLanguage,
|
||||||
|
"openticket:czech":ODLanguage,
|
||||||
|
//ADD NEW LANGUAGES HERE!!!
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODLanguageManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODLanguageManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.languages`!
|
||||||
|
*/
|
||||||
|
export class ODLanguageManager_Default extends ODLanguageManager {
|
||||||
|
get<LanguageId extends keyof ODLanguageManagerIds_Default>(id:LanguageId): ODLanguageManagerIds_Default[LanguageId]
|
||||||
|
get(id:ODValidId): ODLanguage|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODLanguage|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<LanguageId extends keyof ODLanguageManagerIds_Default>(id:LanguageId): ODLanguageManagerIds_Default[LanguageId]
|
||||||
|
remove(id:ODValidId): ODLanguage|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODLanguage|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODLanguageManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getTranslation(id:ODLanguageManagerTranslations_Default): string
|
||||||
|
getTranslation(id:string): string|null
|
||||||
|
|
||||||
|
getTranslation(id:string): string|null {
|
||||||
|
return super.getTranslation(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
setCurrentLanguage(id:keyof ODLanguageManagerIds_Default): void
|
||||||
|
setCurrentLanguage(id:ODValidId): void
|
||||||
|
|
||||||
|
setCurrentLanguage(id:ODValidId): void {
|
||||||
|
return super.setCurrentLanguage(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
setBackupLanguage(id:keyof ODLanguageManagerIds_Default): void
|
||||||
|
setBackupLanguage(id:ODValidId): void
|
||||||
|
|
||||||
|
setBackupLanguage(id:ODValidId): void {
|
||||||
|
return super.setBackupLanguage(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getTranslationWithParams(id:ODLanguageManagerTranslations_Default, params:string[]): string
|
||||||
|
getTranslationWithParams(id:string, params:string[]): string|null
|
||||||
|
|
||||||
|
getTranslationWithParams(id:string, params:string[]): string|null {
|
||||||
|
return super.getTranslationWithParams(id,params)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT PERMISSION MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODDebugger } from "../modules/console"
|
||||||
|
import { ODPermissionManager } from "../modules/permission"
|
||||||
|
|
||||||
|
/**## ODPermissionManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODPermissionManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.permissions`!
|
||||||
|
*/
|
||||||
|
export class ODPermissionManager_Default extends ODPermissionManager {
|
||||||
|
constructor(debug:ODDebugger){
|
||||||
|
super(debug,true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODPermissionEmbedType `type`
|
||||||
|
* This type contains all types available in the `openticket:no-permissions` embed.
|
||||||
|
*/
|
||||||
|
export type ODPermissionEmbedType = (
|
||||||
|
"developer"|
|
||||||
|
"owner"|
|
||||||
|
"admin"|
|
||||||
|
"moderator"|
|
||||||
|
"support"|
|
||||||
|
"member"|
|
||||||
|
"discord-administrator"
|
||||||
|
)
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT POST MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODPost, ODPostManager } from "../modules/post"
|
||||||
|
import * as discord from "discord.js"
|
||||||
|
|
||||||
|
/**## ODPostManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODPostManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODPostManagerIds_Default {
|
||||||
|
"openticket:logs":ODPost<discord.GuildTextBasedChannel>|null,
|
||||||
|
"openticket:transcripts":ODPost<discord.GuildTextBasedChannel>|null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODPostManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODPostManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.code`!
|
||||||
|
*/
|
||||||
|
export class ODPostManager_Default extends ODPostManager {
|
||||||
|
get<PostId extends keyof ODPostManagerIds_Default>(id:PostId): ODPostManagerIds_Default[PostId]
|
||||||
|
get(id:ODValidId): ODPost<discord.GuildBasedChannel>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODPost<discord.GuildBasedChannel>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<PostId extends keyof ODPostManagerIds_Default>(id:PostId): ODPostManagerIds_Default[PostId]
|
||||||
|
remove(id:ODValidId): ODPost<discord.GuildBasedChannel>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODPost<discord.GuildBasedChannel>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODPostManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,255 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT RESPONDER MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODButtonResponder, ODButtonResponderInstance, ODButtonResponderManager, ODCommandResponder, ODCommandResponderInstance, ODCommandResponderManager, ODDropdownResponder, ODDropdownResponderInstance, ODDropdownResponderManager, ODModalResponder, ODModalResponderInstance, ODModalResponderManager, ODResponderManager } from "../modules/responder"
|
||||||
|
import { ODWorkerManager_Default } from "./worker"
|
||||||
|
|
||||||
|
/**## ODResponderManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODResponderManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.responders`!
|
||||||
|
*/
|
||||||
|
export class ODResponderManager_Default extends ODResponderManager {
|
||||||
|
declare commands: ODCommandResponderManager_Default
|
||||||
|
declare buttons: ODButtonResponderManager_Default
|
||||||
|
declare dropdowns: ODDropdownResponderManager_Default
|
||||||
|
declare modals: ODModalResponderManager_Default
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCommandResponderManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODCommandResponderManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODCommandResponderManagerIds_Default {
|
||||||
|
"openticket:help":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:help"|"openticket:logs"},
|
||||||
|
"openticket:stats":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:stats"|"openticket:logs"},
|
||||||
|
"openticket:panel":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:panel"|"openticket:logs"},
|
||||||
|
"openticket:ticket":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:ticket"|"openticket:logs"},
|
||||||
|
"openticket:blacklist":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:blacklist"|"openticket:discord-logs"|"openticket:logs"},
|
||||||
|
|
||||||
|
"openticket:close":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:close"|"openticket:logs"},
|
||||||
|
"openticket:reopen":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:reopen"|"openticket:logs"},
|
||||||
|
"openticket:delete":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:delete"|"openticket:logs"},
|
||||||
|
"openticket:claim":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:claim"|"openticket:logs"},
|
||||||
|
"openticket:unclaim":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:unclaim"|"openticket:logs"},
|
||||||
|
"openticket:pin":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:pin"|"openticket:logs"},
|
||||||
|
"openticket:unpin":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:unpin"|"openticket:logs"},
|
||||||
|
|
||||||
|
"openticket:rename":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:rename"|"openticket:logs"},
|
||||||
|
"openticket:move":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:move"|"openticket:logs"},
|
||||||
|
"openticket:add":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:add"|"openticket:logs"},
|
||||||
|
"openticket:remove":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:remove"|"openticket:logs"},
|
||||||
|
"openticket:clear":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:clear"|"openticket:logs"},
|
||||||
|
|
||||||
|
"openticket:autoclose":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:autoclose"|"openticket:logs"},
|
||||||
|
"openticket:autodelete":{source:"slash"|"text",params:{},workers:"openticket:permissions"|"openticket:autodelete"|"openticket:logs"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCommandResponderManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCommandResponderManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.responders.commands`!
|
||||||
|
*/
|
||||||
|
export class ODCommandResponderManager_Default extends ODCommandResponderManager {
|
||||||
|
get<CommandResponderId extends keyof ODCommandResponderManagerIds_Default>(id:CommandResponderId): ODCommandResponder_Default<ODCommandResponderManagerIds_Default[CommandResponderId]["source"],ODCommandResponderManagerIds_Default[CommandResponderId]["params"],ODCommandResponderManagerIds_Default[CommandResponderId]["workers"]>
|
||||||
|
get(id:ODValidId): ODCommandResponder<"slash"|"text",any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODCommandResponder<"slash"|"text",any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<CommandResponderId extends keyof ODCommandResponderManagerIds_Default>(id:CommandResponderId): ODCommandResponder_Default<ODCommandResponderManagerIds_Default[CommandResponderId]["source"],ODCommandResponderManagerIds_Default[CommandResponderId]["params"],ODCommandResponderManagerIds_Default[CommandResponderId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODCommandResponder<"slash"|"text",any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODCommandResponder<"slash"|"text",any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODCommandResponderManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODCommandResponder_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODCommandResponder class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODCommandResponder`'s!
|
||||||
|
*/
|
||||||
|
export class ODCommandResponder_Default<Source extends "slash"|"text", Params, WorkerIds extends string> extends ODCommandResponder<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODCommandResponderInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODButtonResponderManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODButtonResponderManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODButtonResponderManagerIds_Default {
|
||||||
|
"openticket:verifybar-success":{source:"button",params:{},workers:"openticket:handle-verifybar"},
|
||||||
|
"openticket:verifybar-failure":{source:"button",params:{},workers:"openticket:handle-verifybar"},
|
||||||
|
|
||||||
|
"openticket:help-menu-switch":{source:"button",params:{},workers:"openticket:update-help-menu"},
|
||||||
|
"openticket:help-menu-previous":{source:"button",params:{},workers:"openticket:update-help-menu"},
|
||||||
|
"openticket:help-menu-next":{source:"button",params:{},workers:"openticket:update-help-menu"},
|
||||||
|
|
||||||
|
"openticket:ticket-option":{source:"button",params:{},workers:"openticket:ticket-option"},
|
||||||
|
"openticket:role-option":{source:"button",params:{},workers:"openticket:role-option"},
|
||||||
|
|
||||||
|
"openticket:claim-ticket":{source:"button",params:{},workers:"openticket:claim-ticket"},
|
||||||
|
"openticket:unclaim-ticket":{source:"button",params:{},workers:"openticket:unclaim-ticket"},
|
||||||
|
"openticket:pin-ticket":{source:"button",params:{},workers:"openticket:pin-ticket"},
|
||||||
|
"openticket:unpin-ticket":{source:"button",params:{},workers:"openticket:unpin-ticket"},
|
||||||
|
"openticket:close-ticket":{source:"button",params:{},workers:"openticket:close-ticket"},
|
||||||
|
"openticket:reopen-ticket":{source:"button",params:{},workers:"openticket:reopen-ticket"},
|
||||||
|
"openticket:delete-ticket":{source:"button",params:{},workers:"openticket:delete-ticket"},
|
||||||
|
|
||||||
|
"openticket:transcript-error-retry":{source:"button",params:{},workers:"openticket:permissions"|"openticket:delete-ticket"|"openticket:logs"},
|
||||||
|
"openticket:transcript-error-continue":{source:"button",params:{},workers:"openticket:permissions"|"openticket:delete-ticket"|"openticket:logs"},
|
||||||
|
"openticket:clear-continue":{source:"button",params:{},workers:"openticket:clear-continue"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODButtonResponderManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODButtonResponderManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.responders.buttons`!
|
||||||
|
*/
|
||||||
|
export class ODButtonResponderManager_Default extends ODButtonResponderManager {
|
||||||
|
get<ButtonResponderId extends keyof ODButtonResponderManagerIds_Default>(id:ButtonResponderId): ODButtonResponder_Default<ODButtonResponderManagerIds_Default[ButtonResponderId]["source"],ODButtonResponderManagerIds_Default[ButtonResponderId]["params"],ODButtonResponderManagerIds_Default[ButtonResponderId]["workers"]>
|
||||||
|
get(id:ODValidId): ODButtonResponder<"button",any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODButtonResponder<"button",any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<ButtonResponderId extends keyof ODButtonResponderManagerIds_Default>(id:ButtonResponderId): ODButtonResponder_Default<ODButtonResponderManagerIds_Default[ButtonResponderId]["source"],ODButtonResponderManagerIds_Default[ButtonResponderId]["params"],ODButtonResponderManagerIds_Default[ButtonResponderId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODButtonResponder<"button",any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODButtonResponder<"button",any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODButtonResponderManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODButtonResponder_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODButtonResponder class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODButtonResponder`'s!
|
||||||
|
*/
|
||||||
|
export class ODButtonResponder_Default<Source extends string, Params, WorkerIds extends string> extends ODButtonResponder<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODButtonResponderInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDropdownResponderManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODDropdownResponderManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODDropdownResponderManagerIds_Default {
|
||||||
|
"openticket:panel-dropdown-tickets":{source:"dropdown",params:{},workers:"openticket:panel-dropdown-tickets"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDropdownResponderManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODDropdownResponderManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.responders.dropdowns`!
|
||||||
|
*/
|
||||||
|
export class ODDropdownResponderManager_Default extends ODDropdownResponderManager {
|
||||||
|
get<DropdownResponderId extends keyof ODDropdownResponderManagerIds_Default>(id:DropdownResponderId): ODDropdownResponder_Default<ODDropdownResponderManagerIds_Default[DropdownResponderId]["source"],ODDropdownResponderManagerIds_Default[DropdownResponderId]["params"],ODDropdownResponderManagerIds_Default[DropdownResponderId]["workers"]>
|
||||||
|
get(id:ODValidId): ODDropdownResponder<"dropdown",any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODDropdownResponder<"dropdown",any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<DropdownResponderId extends keyof ODDropdownResponderManagerIds_Default>(id:DropdownResponderId): ODDropdownResponder_Default<ODDropdownResponderManagerIds_Default[DropdownResponderId]["source"],ODDropdownResponderManagerIds_Default[DropdownResponderId]["params"],ODDropdownResponderManagerIds_Default[DropdownResponderId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODDropdownResponder<"dropdown",any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODDropdownResponder<"dropdown",any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODDropdownResponderManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODDropdownResponder_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODDropdownResponder class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODDropdownResponder`'s!
|
||||||
|
*/
|
||||||
|
export class ODDropdownResponder_Default<Source extends string, Params, WorkerIds extends string> extends ODDropdownResponder<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODDropdownResponderInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODModalResponderManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODModalResponderManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODModalResponderManagerIds_Default {
|
||||||
|
"openticket:ticket-questions":{source:"modal",params:{},workers:"openticket:ticket-questions"},
|
||||||
|
"openticket:close-ticket-reason":{source:"modal",params:{},workers:"openticket:close-ticket-reason"},
|
||||||
|
"openticket:reopen-ticket-reason":{source:"modal",params:{},workers:"openticket:reopen-ticket-reason"},
|
||||||
|
"openticket:delete-ticket-reason":{source:"modal",params:{},workers:"openticket:delete-ticket-reason"},
|
||||||
|
"openticket:claim-ticket-reason":{source:"modal",params:{},workers:"openticket:claim-ticket-reason"},
|
||||||
|
"openticket:unclaim-ticket-reason":{source:"modal",params:{},workers:"openticket:unclaim-ticket-reason"},
|
||||||
|
"openticket:pin-ticket-reason":{source:"modal",params:{},workers:"openticket:pin-ticket-reason"},
|
||||||
|
"openticket:unpin-ticket-reason":{source:"modal",params:{},workers:"openticket:unpin-ticket-reason"},
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODModalResponderManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODModalResponderManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.responders.dropdowns`!
|
||||||
|
*/
|
||||||
|
export class ODModalResponderManager_Default extends ODModalResponderManager {
|
||||||
|
get<ModalResponderId extends keyof ODModalResponderManagerIds_Default>(id:ModalResponderId): ODModalResponder_Default<ODModalResponderManagerIds_Default[ModalResponderId]["source"],ODModalResponderManagerIds_Default[ModalResponderId]["params"],ODModalResponderManagerIds_Default[ModalResponderId]["workers"]>
|
||||||
|
get(id:ODValidId): ODModalResponder<"modal",any>|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODModalResponder<"modal",any>|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<ModalResponderId extends keyof ODModalResponderManagerIds_Default>(id:ModalResponderId): ODModalResponder_Default<ODModalResponderManagerIds_Default[ModalResponderId]["source"],ODModalResponderManagerIds_Default[ModalResponderId]["params"],ODModalResponderManagerIds_Default[ModalResponderId]["workers"]>
|
||||||
|
remove(id:ODValidId): ODModalResponder<"modal",any>|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODModalResponder<"modal",any>|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODModalResponderManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODModalResponder_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODModalResponder class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the default `ODModalResponder`'s!
|
||||||
|
*/
|
||||||
|
export class ODModalResponder_Default<Source extends string, Params, WorkerIds extends string> extends ODModalResponder<Source,Params> {
|
||||||
|
declare workers: ODWorkerManager_Default<ODModalResponderInstance,Source,Params,WorkerIds>
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT SESSION MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODSession, ODSessionManager } from "../modules/session"
|
||||||
|
|
||||||
|
/**## ODSessionManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODSessionManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODSessionManagerIds_Default {
|
||||||
|
"test-session":ODSession
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODSessionManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODSessionManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.sessions`!
|
||||||
|
*/
|
||||||
|
export class ODSessionManager_Default extends ODSessionManager {
|
||||||
|
get<SessionId extends keyof ODSessionManagerIds_Default>(id:SessionId): ODSessionManagerIds_Default[SessionId]
|
||||||
|
get(id:ODValidId): ODSession|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODSession|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<SessionId extends keyof ODSessionManagerIds_Default>(id:SessionId): ODSessionManagerIds_Default[SessionId]
|
||||||
|
remove(id:ODValidId): ODSession|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODSession|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODSessionManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT STARTSCREEN MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODStartScreenCategoryComponent, ODStartScreenComponent, ODStartScreenFlagsCategoryComponent, ODStartScreenHeaderComponent, ODStartScreenLiveStatusCategoryComponent, ODStartScreenLogoComponent, ODStartScreenManager, ODStartScreenPluginsCategoryComponent, ODStartScreenPropertiesCategoryComponent } from "../modules/startscreen"
|
||||||
|
|
||||||
|
/**## ODStartScreenManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODStartScreenManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStartScreenManagerIds_Default {
|
||||||
|
"openticket:logo":ODStartScreenLogoComponent,
|
||||||
|
"openticket:header":ODStartScreenHeaderComponent,
|
||||||
|
"openticket:flags":ODStartScreenFlagsCategoryComponent,
|
||||||
|
"openticket:plugins":ODStartScreenPluginsCategoryComponent,
|
||||||
|
"openticket:stats":ODStartScreenPropertiesCategoryComponent,
|
||||||
|
"openticket:livestatus":ODStartScreenLiveStatusCategoryComponent,
|
||||||
|
"openticket:logs":ODStartScreenCategoryComponent
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStartScreenManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStartScreenManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.startscreen`!
|
||||||
|
*/
|
||||||
|
export class ODStartScreenManager_Default extends ODStartScreenManager {
|
||||||
|
get<StartScreenId extends keyof ODStartScreenManagerIds_Default>(id:StartScreenId): ODStartScreenManagerIds_Default[StartScreenId]
|
||||||
|
get(id:ODValidId): ODStartScreenComponent|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStartScreenComponent|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StartScreenId extends keyof ODStartScreenManagerIds_Default>(id:StartScreenId): ODStartScreenManagerIds_Default[StartScreenId]
|
||||||
|
remove(id:ODValidId): ODStartScreenComponent|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStartScreenComponent|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStartScreenManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,363 @@
|
|||||||
|
///////////////////////////////////////
|
||||||
|
//DEFAULT SESSION MODULE
|
||||||
|
///////////////////////////////////////
|
||||||
|
import { Guild, TextBasedChannel, User } from "discord.js"
|
||||||
|
import { ODValidId } from "../modules/base"
|
||||||
|
import { ODStatScope, ODStatGlobalScope, ODStatsManager, ODStat, ODBasicStat, ODDynamicStat, ODValidStatValue, ODStatScopeSetMode } from "../modules/stat"
|
||||||
|
|
||||||
|
/**## ODStatsManagerIds_Default `type`
|
||||||
|
* This type is an array of ids available in the `ODStatsManager_Default` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStatsManagerIds_Default {
|
||||||
|
"openticket:global":ODStatGlobalScope_DefaultGlobal,
|
||||||
|
"openticket:system":ODStatGlobalScope_DefaultSystem,
|
||||||
|
"openticket:user":ODStatScope_DefaultUser,
|
||||||
|
"openticket:ticket":ODStatScope_DefaultTicket,
|
||||||
|
"openticket:participants":ODStatScope_DefaultParticipants
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatsManager_Default `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the global variable `openticket.stats`!
|
||||||
|
*/
|
||||||
|
export class ODStatsManager_Default extends ODStatsManager {
|
||||||
|
get<StatsId extends keyof ODStatsManagerIds_Default>(id:StatsId): ODStatsManagerIds_Default[StatsId]
|
||||||
|
get(id:ODValidId): ODStatScope|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStatScope|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StatsId extends keyof ODStatsManagerIds_Default>(id:StatsId): ODStatsManagerIds_Default[StatsId]
|
||||||
|
remove(id:ODValidId): ODStatScope|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStatScope|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStatsManagerIds_Default): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatGlobalScopeIds_DefaultGlobal `type`
|
||||||
|
* This type is an array of ids available in the `ODStatGlobalScope_DefaultGlobal` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStatGlobalScopeIds_DefaultGlobal {
|
||||||
|
"openticket:tickets-created":ODBasicStat,
|
||||||
|
"openticket:tickets-closed":ODBasicStat,
|
||||||
|
"openticket:tickets-deleted":ODBasicStat,
|
||||||
|
"openticket:tickets-reopened":ODBasicStat,
|
||||||
|
"openticket:tickets-autoclosed":ODBasicStat,
|
||||||
|
"openticket:tickets-autodeleted":ODBasicStat,
|
||||||
|
"openticket:tickets-claimed":ODBasicStat,
|
||||||
|
"openticket:tickets-pinned":ODBasicStat,
|
||||||
|
"openticket:tickets-moved":ODBasicStat,
|
||||||
|
"openticket:users-blacklisted":ODBasicStat,
|
||||||
|
"openticket:transcripts-created":ODBasicStat
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatGlobalScope_DefaultGlobal `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:global` category in `openticket.stats`!
|
||||||
|
*/
|
||||||
|
export class ODStatGlobalScope_DefaultGlobal extends ODStatGlobalScope {
|
||||||
|
get<StatsId extends keyof ODStatGlobalScopeIds_DefaultGlobal>(id:StatsId): ODStatGlobalScopeIds_DefaultGlobal[StatsId]
|
||||||
|
get(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStat|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StatsId extends keyof ODStatGlobalScopeIds_DefaultGlobal>(id:StatsId): ODStatGlobalScopeIds_DefaultGlobal[StatsId]
|
||||||
|
remove(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStat|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStatGlobalScopeIds_DefaultGlobal): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getStat<StatsId extends keyof ODStatGlobalScopeIds_DefaultGlobal>(id:StatsId): ODValidStatValue|null
|
||||||
|
getStat(id:ODValidId): ODValidStatValue|null
|
||||||
|
|
||||||
|
getStat(id:ODValidId): ODValidStatValue|null {
|
||||||
|
return super.getStat(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
setStat<StatsId extends keyof ODStatGlobalScopeIds_DefaultGlobal>(id:StatsId, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
setStat(id:ODValidId, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
|
||||||
|
setStat(id:ODValidId, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean {
|
||||||
|
return super.setStat(id,value,mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
resetStat<StatsId extends keyof ODStatGlobalScopeIds_DefaultGlobal>(id:ODValidId): ODValidStatValue|null
|
||||||
|
resetStat(id:ODValidId): ODValidStatValue|null
|
||||||
|
|
||||||
|
resetStat(id:ODValidId): ODValidStatValue|null {
|
||||||
|
return super.resetStat(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatGlobalScopeIds_DefaultSystem `type`
|
||||||
|
* This type is an array of ids available in the `ODStatScope_DefaultSystem` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStatGlobalScopeIds_DefaultSystem {
|
||||||
|
"openticket:startup-date":ODDynamicStat,
|
||||||
|
"openticket:version":ODDynamicStat
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatGlobalScope_DefaultSystem `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:system` category in `openticket.stats`!
|
||||||
|
*/
|
||||||
|
export class ODStatGlobalScope_DefaultSystem extends ODStatGlobalScope {
|
||||||
|
get<StatsId extends keyof ODStatGlobalScopeIds_DefaultSystem>(id:StatsId): ODStatGlobalScopeIds_DefaultSystem[StatsId]
|
||||||
|
get(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStat|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StatsId extends keyof ODStatGlobalScopeIds_DefaultSystem>(id:StatsId): ODStatGlobalScopeIds_DefaultSystem[StatsId]
|
||||||
|
remove(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStat|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStatGlobalScopeIds_DefaultSystem): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getStat<StatsId extends keyof ODStatGlobalScopeIds_DefaultSystem>(id:StatsId): ODValidStatValue|null
|
||||||
|
getStat(id:ODValidId): ODValidStatValue|null
|
||||||
|
|
||||||
|
getStat(id:ODValidId): ODValidStatValue|null {
|
||||||
|
return super.getStat(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
setStat<StatsId extends keyof ODStatGlobalScopeIds_DefaultSystem>(id:StatsId, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
setStat(id:ODValidId, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
|
||||||
|
setStat(id:ODValidId, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean {
|
||||||
|
return super.setStat(id,value,mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
resetStat<StatsId extends keyof ODStatGlobalScopeIds_DefaultSystem>(id:ODValidId): ODValidStatValue|null
|
||||||
|
resetStat(id:ODValidId): ODValidStatValue|null
|
||||||
|
|
||||||
|
resetStat(id:ODValidId): ODValidStatValue|null {
|
||||||
|
return super.resetStat(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatScopeIds_DefaultUser `type`
|
||||||
|
* This type is an array of ids available in the `ODStatScope_DefaultUser` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStatScopeIds_DefaultUser {
|
||||||
|
"openticket:name":ODDynamicStat,
|
||||||
|
"openticket:role":ODDynamicStat,
|
||||||
|
"openticket:tickets-created":ODBasicStat,
|
||||||
|
"openticket:tickets-closed":ODBasicStat,
|
||||||
|
"openticket:tickets-deleted":ODBasicStat,
|
||||||
|
"openticket:tickets-reopened":ODBasicStat,
|
||||||
|
"openticket:tickets-claimed":ODBasicStat,
|
||||||
|
"openticket:tickets-pinned":ODBasicStat,
|
||||||
|
"openticket:tickets-moved":ODBasicStat,
|
||||||
|
"openticket:users-blacklisted":ODBasicStat,
|
||||||
|
"openticket:transcripts-created":ODBasicStat
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatScope_DefaultUser `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:user` category in `openticket.stats`!
|
||||||
|
*/
|
||||||
|
export class ODStatScope_DefaultUser extends ODStatScope {
|
||||||
|
get<StatsId extends keyof ODStatScopeIds_DefaultUser>(id:StatsId): ODStatScopeIds_DefaultUser[StatsId]
|
||||||
|
get(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStat|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StatsId extends keyof ODStatScopeIds_DefaultUser>(id:StatsId): ODStatScopeIds_DefaultUser[StatsId]
|
||||||
|
remove(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStat|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStatScopeIds_DefaultUser): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getStat<StatsId extends keyof ODStatScopeIds_DefaultUser>(id:StatsId, scopeId:string): ODValidStatValue|null
|
||||||
|
getStat(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
|
||||||
|
getStat(id:ODValidId, scopeId:string): ODValidStatValue|null {
|
||||||
|
return super.getStat(id,scopeId)
|
||||||
|
}
|
||||||
|
|
||||||
|
setStat<StatsId extends keyof ODStatScopeIds_DefaultUser>(id:StatsId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
setStat(id:ODValidId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
|
||||||
|
setStat(id:ODValidId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean {
|
||||||
|
return super.setStat(id,scopeId,value,mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
resetStat<StatsId extends keyof ODStatScopeIds_DefaultUser>(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
resetStat(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
|
||||||
|
resetStat(id:ODValidId, scopeId:string): ODValidStatValue|null {
|
||||||
|
return super.resetStat(id,scopeId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatScopeIds_DefaultTicket `type`
|
||||||
|
* This type is an array of ids available in the `ODStatScope_DefaultTicket` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStatScopeIds_DefaultTicket {
|
||||||
|
"openticket:name":ODDynamicStat,
|
||||||
|
"openticket:status":ODDynamicStat,
|
||||||
|
"openticket:claimed":ODDynamicStat,
|
||||||
|
"openticket:pinned":ODDynamicStat,
|
||||||
|
"openticket:creation-date":ODDynamicStat,
|
||||||
|
"openticket:creator":ODDynamicStat
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatScope_DefaultTicket `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:ticket` category in `openticket.stats`!
|
||||||
|
*/
|
||||||
|
export class ODStatScope_DefaultTicket extends ODStatScope {
|
||||||
|
get<StatsId extends keyof ODStatScopeIds_DefaultTicket>(id:StatsId): ODStatScopeIds_DefaultTicket[StatsId]
|
||||||
|
get(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStat|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StatsId extends keyof ODStatScopeIds_DefaultTicket>(id:StatsId): ODStatScopeIds_DefaultTicket[StatsId]
|
||||||
|
remove(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStat|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStatScopeIds_DefaultTicket): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getStat<StatsId extends keyof ODStatScopeIds_DefaultTicket>(id:StatsId, scopeId:string): ODValidStatValue|null
|
||||||
|
getStat(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
|
||||||
|
getStat(id:ODValidId, scopeId:string): ODValidStatValue|null {
|
||||||
|
return super.getStat(id,scopeId)
|
||||||
|
}
|
||||||
|
|
||||||
|
setStat<StatsId extends keyof ODStatScopeIds_DefaultTicket>(id:StatsId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
setStat(id:ODValidId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
|
||||||
|
setStat(id:ODValidId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean {
|
||||||
|
return super.setStat(id,scopeId,value,mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
resetStat<StatsId extends keyof ODStatScopeIds_DefaultTicket>(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
resetStat(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
|
||||||
|
resetStat(id:ODValidId, scopeId:string): ODValidStatValue|null {
|
||||||
|
return super.resetStat(id,scopeId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatScopeIds_DefaultParticipants `type`
|
||||||
|
* This type is an array of ids available in the `ODStatScope_DefaultParticipants` class.
|
||||||
|
* It's used to generate typescript declarations for this class.
|
||||||
|
*/
|
||||||
|
export interface ODStatScopeIds_DefaultParticipants {
|
||||||
|
"openticket:participants":ODDynamicStat
|
||||||
|
}
|
||||||
|
|
||||||
|
/**## ODStatScope_DefaultParticipants `default_class`
|
||||||
|
* This is a special class that adds type definitions & typescript to the ODStatsManager class.
|
||||||
|
* It doesn't add any extra features!
|
||||||
|
*
|
||||||
|
* This default class is made for the `openticket:participants` category in `openticket.stats`!
|
||||||
|
*/
|
||||||
|
export class ODStatScope_DefaultParticipants extends ODStatScope {
|
||||||
|
get<StatsId extends keyof ODStatScopeIds_DefaultParticipants>(id:StatsId): ODStatScopeIds_DefaultParticipants[StatsId]
|
||||||
|
get(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
get(id:ODValidId): ODStat|null {
|
||||||
|
return super.get(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
remove<StatsId extends keyof ODStatScopeIds_DefaultParticipants>(id:StatsId): ODStatScopeIds_DefaultParticipants[StatsId]
|
||||||
|
remove(id:ODValidId): ODStat|null
|
||||||
|
|
||||||
|
remove(id:ODValidId): ODStat|null {
|
||||||
|
return super.remove(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists(id:keyof ODStatScopeIds_DefaultParticipants): boolean
|
||||||
|
exists(id:ODValidId): boolean
|
||||||
|
|
||||||
|
exists(id:ODValidId): boolean {
|
||||||
|
return super.exists(id)
|
||||||
|
}
|
||||||
|
|
||||||
|
getStat<StatsId extends keyof ODStatScopeIds_DefaultParticipants>(id:StatsId, scopeId:string): ODValidStatValue|null
|
||||||
|
getStat(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
|
||||||
|
getStat(id:ODValidId, scopeId:string): ODValidStatValue|null {
|
||||||
|
return super.getStat(id,scopeId)
|
||||||
|
}
|
||||||
|
|
||||||
|
setStat<StatsId extends keyof ODStatScopeIds_DefaultParticipants>(id:StatsId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
setStat(id:ODValidId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean
|
||||||
|
|
||||||
|
setStat(id:ODValidId, scopeId:string, value:ODValidStatValue, mode:ODStatScopeSetMode): boolean {
|
||||||
|
return super.setStat(id,scopeId,value,mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
resetStat<StatsId extends keyof ODStatScopeIds_DefaultParticipants>(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
resetStat(id:ODValidId, scopeId:string): ODValidStatValue|null
|
||||||
|
|
||||||
|
resetStat(id:ODValidId, scopeId:string): ODValidStatValue|null {
|
||||||
|
return super.resetStat(id,scopeId)
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user