Open Ticket v4.0.1

Open Ticket v4.0.1
This commit is contained in:
Jasper
2025-04-02 14:35:53 +02:00
committed by GitHub
59 changed files with 2801 additions and 418 deletions
+8 -1
View File
@@ -1,7 +1,11 @@
# Pterodactyl Eggs # Pterodactyl Eggs
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px"> <img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
[![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.0.0-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.0) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj) [![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3)
[![version](https://img.shields.io/badge/version-4.0.1-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.1)
[![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj)
[![Open Ticket supports Pterodactyl Eggs!](https://img.shields.io/badge/pterodactyl-supported-10539F?style=flat-square&logo=pterodactyl)](.eggs/README.md)
Hi there! Open Ticket provides **official eggs** for the Pterodactyl & Pelican panels!<br> Hi there! Open Ticket provides **official eggs** for the Pterodactyl & Pelican panels!<br>
There are different eggs for different versions of Open Ticket. There are different eggs for different versions of Open Ticket.
@@ -16,6 +20,9 @@ It's recommended to provide at least `1GB` of **Memory/RAM** and `5GB` of **disk
[**`openticket-egg-main.json` (Recommended)**](openticket-egg-main.json) [**`openticket-egg-main.json` (Recommended)**](openticket-egg-main.json)
- This egg will use the `main` branch of Open Ticket. - This egg will use the `main` branch of Open Ticket.
[**`openticket-egg-v4.0.1.json`**](openticket-egg-v4.0.1.json)
- This egg will always use Open Ticket `v4.0.1`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.0.json`**](openticket-egg-v4.0.0.json) [**`openticket-egg-v4.0.0.json`**](openticket-egg-v4.0.0.json)
- This egg will always use Open Ticket `v4.0.0`. Open Ticket updates will not have an effect on this egg. - This egg will always use Open Ticket `v4.0.0`. Open Ticket updates will not have an effect on this egg.
+62
View File
@@ -0,0 +1,62 @@
{
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
"meta": {
"version": "PTDL_v2",
"update_url": null
},
"exported_at": "2025-03-16T18:10:18+01:00",
"name": "Open Ticket (v4.0.1)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.1, the most advanced & customisable discord ticket bot that you will ever find! You can customise up to 300+ variables! This includes Html Transcripts, Advanced Plugins, Custom Embeds, Questions\/Modals, Stats & more!",
"features": null,
"docker_images": {
"ghcr.io\/parkervcp\/yolks:nodejs_20": "ghcr.io\/parkervcp\/yolks:nodejs_20"
},
"file_denylist": [],
"startup": "if [[ ! -z ${NODE_PACKAGES} ]]; then npm install ${NODE_PACKAGES}; fi; if [[ ! -z ${UNNODE_PACKAGES} ]]; then npm uninstall ${UNNODE_PACKAGES}; fi; if [ -f \/home\/container\/package.json ]; then npm install; fi; node \"\/home\/container\/index.js\" ${NODE_FLAGS};",
"config": {
"files": "{}",
"startup": "{\r\n \"done\": \"STARTUP INFO:\"\r\n}",
"logs": "{}",
"stop": "^C"
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.1)\r\n# Inspired by: Node.js Installation Script\r\n# \u00a9 DJdj Development\r\n\r\necho -e \"[OT INSTALLER] installing dependencies. please wait...\"\r\napt update\r\napt install -y git curl\r\n\r\necho -e \"[OT INSTALLER] updating npm. please wait...\"\r\nnpm install npm@latest --location=global\r\n\r\nmkdir -p \/mnt\/server\r\ncd \/mnt\/server\r\n\r\nBRANCH=\"v4.0.1\"\r\n\r\nif [ \"$(ls -A \/mnt\/server)\" ]; then\r\n echo -e \"[OT INSTALLER] \/mnt\/server directory is not empty.\"\r\n if [ -d .git ]; then\r\n echo -e \"[OT INSTALLER] .git directory exists\"\r\n if [ -f .git\/config ]; then\r\n echo -e \"[OT INSTALLER] loading info from git config\"\r\n ORIGIN=$(git config --get remote.origin.url)\r\n else\r\n echo -e \"[OT INSTALLER] files found with no git config\"\r\n echo -e \"[OT INSTALLER] closing out without touching things to not break anything\"\r\n exit 10\r\n fi\r\n fi\r\n\r\n if [ \"${ORIGIN}\" == \"https:\/\/github.com\/open-discord-bots\/open-ticket.git\" ]; then\r\n echo \"pulling latest from github\"\r\n git pull\r\n fi\r\nelse\r\n echo -e \"[OT INSTALLER] \/mnt\/server is empty.\"\r\n echo -e \"[OT INSTALLER] cloning files into repo.\"\r\n if [ -z ${BRANCH} ]; then\r\n echo -e \"[OT INSTALLER] cloning default branch\"\r\n git clone https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n else\r\n echo -e \"[OT INSTALLER] cloning ${BRANCH}'\"\r\n git clone --single-branch --branch ${BRANCH} https:\/\/github.com\/open-discord-bots\/open-ticket.git .\r\n fi\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing Open Ticket node.js packages.\"\r\nif [ -f \/mnt\/server\/package.json ]; then\r\n \/usr\/local\/bin\/npm install --omit=dev\r\nfi\r\n\r\necho -e \"[OT INSTALLER] installing custom node.js packages.\"\r\nif [[ ! -z ${NODE_PACKAGES} ]]; then\r\n \/usr\/local\/bin\/npm install ${NODE_PACKAGES}\r\nfi\r\n\r\necho -e \"[OT INSTALLER] install complete!\"\r\nexit 0",
"container": "node:latest",
"entrypoint": "bash"
}
},
"variables": [
{
"name": "Additional Npm Packages",
"description": "Specify additional npm packages used by Open Ticket plugins. Use spaces to separate.",
"env_variable": "NODE_PACKAGES",
"default_value": "",
"user_viewable": false,
"user_editable": true,
"rules": "string|nullable",
"field_type": "text"
},
{
"name": "Startup Flags",
"description": "Start the bot with additional Open Ticket flags. Separate using spaces.\r\nA full reference list can be found in the documentation.",
"env_variable": "NODE_FLAGS",
"default_value": "",
"user_viewable": false,
"user_editable": true,
"rules": "string|nullable",
"field_type": "text"
},
{
"name": "Uninstall Npm Packages",
"description": "A list of npm packages to uninstall. Separate by spaces.",
"env_variable": "UNNODE_PACKAGES",
"default_value": "",
"user_viewable": false,
"user_editable": true,
"rules": "string|nullable",
"field_type": "text"
}
]
}
+6 -8
View File
@@ -6,14 +6,12 @@ You can choose which type of tutorial you want to make. You can create a quick s
You are not required to talk in the video, but make sure it has some kind of subtitles instead. You are not required to talk in the video, but make sure it has some kind of subtitles instead.
### 📄 Requirements ### 📄 Requirements
- 📌 At least 2k subscribers! - 📌 Video length of at least 2 minutes.
- 📌 A little bit of channel activity! *(minimum 2 uploads/month)* - 📌 Provide a link to the Open Ticket repository in the description of the video.
- 📌 Video length of at least 3 minutes! - 📌 Please use the latest version of Open Ticket available at the time of making the video.
- 📌 Provide a clear link to the Open Ticket repository! - 📌 **(Optional)** Recommended language is English.
- 📌 Recommended language is English! - 📌 **(Optional)** Recommended platform is YouTube!
- 📌 Recommended platform is YouTube! - 📌 **(Optional)** Speech in the video *(AI is allowed)*
- 📌 Must be for the latest version of Open Ticket!
- 📌 **(OPTIONAL)** Speech in the video *(AI is allowed)*
### 🎁 Rewards ### 🎁 Rewards
+1 -1
View File
@@ -1,7 +1,7 @@
# Contributing Guidelines # Contributing Guidelines
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px"> <img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
[![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.0.0-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.0) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj) [![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.0.1-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.1) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj)
These are the Contributing Guidelines of Open Ticket!<br> These are the Contributing Guidelines of Open Ticket!<br>
Here you can find everything you need to know about contributing to Open Ticket.<br> Here you can find everything you need to know about contributing to Open Ticket.<br>
+8 -8
View File
@@ -1,7 +1,7 @@
# Security Policy # Security Policy
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px"> <img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="500px">
[![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.0.0-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.0) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj) [![discord](https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord)](https://discord.com/invite/26vT9wt3n3) [![version](https://img.shields.io/badge/version-4.0.1-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.1) [![Sponsor DJj123dj](https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors)](https://github.com/sponsors/DJj123dj)
This is the Security Policy of Open Ticket!<br> This is the Security Policy of Open Ticket!<br>
Here you can find a list of all supported & deprecated versions of the bot.<br> Here you can find a list of all supported & deprecated versions of the bot.<br>
@@ -11,7 +11,7 @@ You will also find some guidelines about how to report vulnerabilities, bugs & e
Below, you can find a list with the status of every Open Ticket version.<br> Below, you can find a list with the status of every Open Ticket version.<br>
This list will be updated on every release. This list will be updated on every release.
- 🟦 Early Access **(ideas, bugs, support, html transcripts)** - 🟦 In Development **(ideas, bugs, support, html transcripts)**
- ✅ Supported **(features, bugs, support, docs, html transcripts)** - ✅ Supported **(features, bugs, support, docs, html transcripts)**
- 🚧 Maintenance **(support, docs, html transcripts)** - 🚧 Maintenance **(support, docs, html transcripts)**
- 🟧 Deprecated **(docs)** - 🟧 Deprecated **(docs)**
@@ -19,12 +19,12 @@ This list will be updated on every release.
| Version | Supported | Notes | | Version | Supported | Notes |
|------------|-----------|--------------------------------| |------------|-----------|--------------------------------|
| 4.0.0-beta | 🟦 | For v4.0.0 Full Release | | 4.1.0 | 🟦 | |
| 3.5.8 | ✅ | Supported until October 2024 | | 4.0.1 | ✅ | |
| 3.5.7 | ✅ | Supported until September 2024 | | 4.0.0 | ✅ | |
| 3.5.6 | 🟧 | Documentation Only | | 3.5.9 | 🚧 | Supported until May 2025 (LTS) |
| < 3.5.6 | 🟧 | Documentation Only | | 3.5.8 | 🟧 | Documentation Only |
| < 3.5.0 | ❌ | | | < 3.5.8 | ❌ | |
### 🕷️ Reporting Vulnerabilities ### 🕷️ Reporting Vulnerabilities
You can report vulnerabilities, errors & bugs using one of the following methods: You can report vulnerabilities, errors & bugs using one of the following methods:
+19 -16
View File
@@ -8,16 +8,19 @@
<br>Powered By<br> <br>Powered By<br>
<img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Ticket" width="170px"><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://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/open-discord-bots/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://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.1"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.0.1-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://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/open-discord-bots/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://github.com/open-discord-bots/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> <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>
<br>
<a href="https://github.com/sponsors/DJj123dj"><img alt="Sponsor DJj123dj" src="https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors"></img></a> <a href="https://github.com/sponsors/DJj123dj"><img alt="Sponsor DJj123dj" src="https://img.shields.io/badge/sponsor-DJj123dj-ea4aaa?style=flat-square&logo=githubsponsors"></img></a>
<a href="https://hub.docker.com/repository/docker/djj123dj/open-ticket"><img alt="Open Ticket supports Docker!" src="https://img.shields.io/badge/docker-supported-2496ED?style=flat-square&logo=docker"></img></a>
<a href=".eggs/README.md"><img alt="Open Ticket supports Pterodactyl Eggs!" src="https://img.shields.io/badge/pterodactyl-supported-10539F?style=flat-square&logo=pterodactyl"></img></a>
</p> </p>
<p align="center"> <p align="center">
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! 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!
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>22 Languages</code>! If you need any help, feel free to join our <a href="https://discord.dj-dj.be">discord server</a>! 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>26 Languages</code>! If you need any help, feel free to join our <a href="https://discord.dj-dj.be">discord server</a>!
</p> </p>
<p align="center"><b>⭐️ Help us grow by giving a star! ⭐️</b></p> <p align="center"><b>⭐️ Help us grow by giving a star! ⭐️</b></p>
@@ -25,11 +28,11 @@ You're also able to customise every little aspect of the bot! From embeds to tra
### 📌 Features ### 📌 Features
- **🦇 pterodactyl support** - Open Ticket works perfect on Pterodactyl based panels! [(Download official eggs)](.eggs/README.md) - **🦇 pterodactyl support** - Open Ticket works perfect on Pterodactyl based panels! [(Download official eggs)](.eggs/README.md)
- **💩 no bloat** - Your Open Ticket bot doesn't contain any form of bloat or credits! - **💩 no bloat** - Your Open Ticket bot doesn't contain any form of bloat or credits!
- **🔒 tested & secure** - Open Ticket has been tested by thousands of servers and is very secure! - **🔒 tested & secure** - Open Ticket has been battletested by thousands of servers and is very secure!
- **📈 scalable** - Open Ticket is made to handle huge servers! (Already tested in **servers with 100k members**) - **📈 scalable** - Open Ticket is made to handle huge servers! (Already tested in **servers with 100k members**)
- **📄 HTML transcripts** - Make use of the most customisable, beautiful and easy-to-use HTML Transcripts! - **📄 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! - **✅ ticket actions** - Close, Reopen, Delete, Claim, Pin, Rename & Move all your tickets!
- **🇬🇧 translation** - Open Ticket has been translated in more than **22 languages** by our community! - **🇬🇧 translation** - Open Ticket has been translated in more than **26 languages** by our community!
- **🎨 customisation** - Open Ticket has been created around customisation, everything can be customised! - **🎨 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! - **🖥️ interactions** - The bot has full support for Buttons, Dropdowns, Slash Commands and Modals!
- **∞ unlimited** - Create an infinite amount of tickets & panels! - **∞ unlimited** - Create an infinite amount of tickets & panels!
@@ -57,7 +60,7 @@ You're also able to customise every little aspect of the bot! From embeds to tra
> ### 📦 Resources > ### 📦 Resources
> Resources might not be accurate yet! *(because v4 is still in beta)*<br> > 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://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://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/open-discord-bots/plugins"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-plugins.png" alt="Open Ticket Plugins" width="180px"></a> > <a href="https://github.com/open-discord-bots/plugins"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-plugins.png" alt="Open Ticket Plugins" width="180px"></a>
### ❤️ Sponsors ### ❤️ Sponsors
@@ -114,17 +117,17 @@ A big thanks to all our sponsors! Without them, it wouldn't be possible to creat
|[`example-command`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/example-command/) |📄 Example |Sample custom command using the Open Discord system. | |[`example-command`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/example-command/) |📄 Example |Sample custom command using the Open Discord system. |
|[`ot-jump-to-top`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-jump-to-top/) |📢 Command |Add a simple command to jump to the top of the ticket. | |[`ot-jump-to-top`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-jump-to-top/) |📢 Command |Add a simple command to jump to the top of the ticket. |
|[`ot-kill-switch`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-kill-switch/) |📢 Command |Temporarily disable the ticket system using a kill switch. | |[`ot-kill-switch`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-kill-switch/) |📢 Command |Temporarily disable the ticket system using a kill switch. |
|[`ot-hosting-status`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-hosting-status/) |📢 Command |A simple command to send hosting status updates to a channel. | |[`od-hosting-status`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-hosting-status/) |📢 Command |A simple command to send hosting status updates to a channel. |
|[`ot-shutdown`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-shutdown/) |📢 Command |A simple command to turn off the bot from a slash command (server & bot owner only). | |[`od-shutdown`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-shutdown/) |📢 Command |A simple command to turn off the bot from a slash command (server & bot owner only). |
|[`ot-sqlite-database`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-sqlite-database/) |⚙️ Utility |With this plugin, the database will be an SQLite file. It's a must-have for large servers! | |[`ot-sqlite-database`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-sqlite-database/) |⚙️ Utility |With this plugin, the database will be an SQLite file. It's a must-have for large servers! |
|[`ot-no-slash-clear`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-no-slash-clear/) |⚙️ Utility |Disable the automatic removal of slash commands that aren't used by Open Ticket. | |[`od-no-slash-clear`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-no-slash-clear/) |⚙️ Utility |Disable the automatic removal of slash commands that aren't used by Open Ticket. |
|[`ot-migrate-v3`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-migrate-v3/) |⚙️ Utility |Use this plugin to migrate all tickets from Open Ticket v3 to v4. | |[`ot-migrate-v3`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-migrate-v3/) |⚙️ Utility |Use this plugin to migrate all tickets from Open Ticket v3 to v4. |
|[`ot-ticket-message-extras`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ticket-message-extras/) |🎨 Customisation |A plugin which adds a few little features to the ticket message. | |[`ot-ticket-message-extras`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ticket-message-extras/) |🎨 Customisation |A plugin which adds a few little features to the ticket message. |
|[`ot-rename-keep-prefix`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-rename-keep-prefix/) |🎨 Customisation |Simple plugin to keep the channel prefix when using the /rename command. | |[`ot-rename-keep-prefix`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-rename-keep-prefix/) |🎨 Customisation |Simple plugin to keep the channel prefix when using the /rename command. |
|[`ot-customise-buttons`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-customise-buttons/) |🎨 Customisation |Customise almost all built-in buttons. This includes the claim, reopen, close & delete buttons. | |[`ot-customise-buttons`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-customise-buttons/) |🎨 Customisation |Customise almost all built-in buttons. This includes the claim, reopen, close & delete buttons. |
|[`ot-ephemeral-messages`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ephemeral-messages/) |🎨 Customisation |Customise for every messages if it needs to be ephemeral or not. | |[`ot-ephemeral-messages`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-ephemeral-messages/) |🎨 Customisation |Customise for every messages if it needs to be ephemeral or not. |
|[`ot-footers`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-footers/) |🎨 Customisation |A simple plugin to add footers in all Open Ticket embeds. | |[`ot-footers`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-footers/) |🎨 Customisation |A simple plugin to add footers in all Open Ticket embeds. |
|[`ot-alt-detector`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-alt-detector/) |💼 Management |Use the discord-alt-detector npm package by DJdj Development in your ticket bot. | |[`od-alt-detector`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-alt-detector/) |💼 Management |Use the discord-alt-detector npm package by DJdj Development in your ticket bot. |
|[`ot-embeds`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-embeds/) |💼 Management |Create custom premade embeds in the config or use the command to create one from scratch. | |[`ot-embeds`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-embeds/) |💼 Management |Create custom premade embeds in the config or use the command to create one from scratch. |
|[`ot-move-actions`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-move-actions/) |💼 Management |Automatically unclaim/unpin a ticket when it's moved using `/move`. | |[`ot-move-actions`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-move-actions/) |💼 Management |Automatically unclaim/unpin a ticket when it's moved using `/move`. |
|[`ot-reviews`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-reviews/) |💼 Management |Review system for Open Ticket! It is very customisable and has lots of features. | |[`ot-reviews`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-reviews/) |💼 Management |Review system for Open Ticket! It is very customisable and has lots of features. |
@@ -189,16 +192,16 @@ This is the main team working on Open Ticket. Don't forget to check their profil
|🇮🇳 Hindi |an_developer |🟢 Up To Date | |🇮🇳 Hindi |an_developer |🟢 Up To Date |
|🇱🇹 Lithuanian |tsgindrius |🟢 Up To Date | |🇱🇹 Lithuanian |tsgindrius |🟢 Up To Date |
|🇵🇱 Polish |danoglez |🟢 Up To Date | |🇵🇱 Polish |danoglez |🟢 Up To Date |
|🇪🇪 Estonian |iamnotmega |🔵 Up To Date (ChatGPT) | |🇳🇴 Norwegian |NoOneNook |🟢 Up To Date |
|🇫🇮 Finnish |iamnotmega |🔵 Up To Date (ChatGPT) | |🇸🇪 Swedish |NoOneNook |🟢 Up To Date |
|🇷🇺 Russian |/ |🔴 Missing | |🇪🇪 Estonian |iamnotmega |🔵 Up To Date (AI) |
|🇳🇴 Norwegian |/ |🔴 Missing | |🇫🇮 Finnish |iamnotmega |🔵 Up To Date (AI) |
|🇱🇻 Latvian |/ |🔴 Missing | |🇷🇺 Russian |NoOneNook |🔵 Up To Date (AI) |
|🇱🇻 Latvian |NoOneNook |🔵 Up To Date (AI) |
|🇯🇵 Japanese |/ |🔴 Missing | |🇯🇵 Japanese |/ |🔴 Missing |
|🇰🇷 Korean |/ |🔴 Missing | |🇰🇷 Korean |/ |🔴 Missing |
|🇨🇳 Simplified Chinese |/ |🔴 Missing | |🇨🇳 Simplified Chinese |/ |🔴 Missing |
|🇨🇳 Traditional Chinese|/ |🔴 Missing | |🇨🇳 Traditional Chinese|/ |🔴 Missing |
|🇸🇪 Swedish |/ |🔴 Missing |
|🇻🇳 Vietnamese |/ |🔴 Missing | |🇻🇳 Vietnamese |/ |🔴 Missing |
|🇸🇮 Slovenian |/ |🔴 Missing | |🇸🇮 Slovenian |/ |🔴 Missing |
|🇬🇷 Greek |/ |🔴 Missing | |🇬🇷 Greek |/ |🔴 Missing |
+1 -1
View File
@@ -2,7 +2,7 @@
"_INFO":{ "_INFO":{
"support":"https://otdocs.dj-dj.be", "support":"https://otdocs.dj-dj.be",
"discord":"https://discord.dj-dj.be", "discord":"https://discord.dj-dj.be",
"version":"open-ticket-v4.0.0" "version":"open-ticket-v4.0.1"
}, },
"token":"your bot token here! (or leave empty when using 'tokenFromENV')", "token":"your bot token here! (or leave empty when using 'tokenFromENV')",
+1 -1
View File
@@ -17,7 +17,7 @@
"image":"https://www.example.com/image.png (or leave empty)", "image":"https://www.example.com/image.png (or leave empty)",
"thumbnail":"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)", "footer":"Open Ticket v4.0.1 (or leave empty)",
"fields":[ "fields":[
{"name":"field name","value":"field value","inline":false} {"name":"field name","value":"field value","inline":false}
], ],
+1 -1
View File
@@ -14,7 +14,7 @@ process.argv.push(...flags)
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║ ██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║ ██║██║ ██╔═██╗ ██╔══╝ ██║
╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║ ╚██████╔╝██║ ███████╗██║ ╚████║ ██║ ██║╚██████╗██║ ██╗███████╗ ██║
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝ ╚═╝
v4.0.0 - Made by DJj123dj & Contributors v4.0.1 - Made by DJj123dj & Contributors
Discord: https://discord.dj-dj.be Discord: https://discord.dj-dj.be
Docs: https://otdocs.dj-dj.be Docs: https://otdocs.dj-dj.be
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION": { "_TRANSLATION": {
"otversion": "v4.0.0", "otversion": "v4.0.1",
"translators": ["palestinian"], "translators": ["palestinian"],
"lastedited": "06/12/2024", "lastedited": "06/12/2024",
"language": "Arabic", "language": "Arabic",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["guillee3"], "translators":["guillee3"],
"lastedited":"21/08/2024", "lastedited":"21/08/2024",
"language":"Catalan", "language":"Catalan",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["DJj123dj"], "translators":["DJj123dj"],
"lastedited":"21/08/2024", "lastedited":"21/08/2024",
"language":"Custom", "language":"Custom",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["spyeye_"], "translators":["spyeye_"],
"lastedited":"21/08/2024", "lastedited":"21/08/2024",
"language":"Czech", "language":"Czech",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["the_gamer"], "translators":["the_gamer"],
"lastedited":"26/09/2024", "lastedited":"26/09/2024",
"language":"Danish", "language":"Danish",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["DJj123dj"], "translators":["DJj123dj"],
"lastedited":"21/08/2024", "lastedited":"21/08/2024",
"language":"Dutch", "language":"Dutch",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["DJj123dj"], "translators":["DJj123dj"],
"lastedited":"21/08/2024", "lastedited":"21/08/2024",
"language":"English", "language":"English",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["iamnotmega","ChatGPT"], "translators":["iamnotmega","ChatGPT"],
"lastedited":"21/10/2024", "lastedited":"21/10/2024",
"language":"Estonian", "language":"Estonian",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["iamnotmega","ChatGPT"], "translators":["iamnotmega","ChatGPT"],
"lastedited":"21/10/2024", "lastedited":"21/10/2024",
"language":"Finnish", "language":"Finnish",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["guillee3"], "translators":["guillee3"],
"lastedited":"04/12/2024", "lastedited":"04/12/2024",
"language":"French", "language":"French",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["benzorich"], "translators":["benzorich"],
"lastedited":"06/10/2024", "lastedited":"06/10/2024",
"language":"German", "language":"German",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["an_developer"], "translators":["an_developer"],
"lastedited":"14/12/2024", "lastedited":"14/12/2024",
"language":"Hindi", "language":"Hindi",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["Kornel0706"], "translators":["Kornel0706"],
"lastedited":"22/08/2024", "lastedited":"22/08/2024",
"language":"Hungarian", "language":"Hungarian",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["erxg"], "translators":["erxg"],
"lastedited":"25/08/2024", "lastedited":"25/08/2024",
"language":"Indonesian", "language":"Indonesian",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["fraden1mvp."], "translators":["fraden1mvp."],
"lastedited":"08/10/2024", "lastedited":"08/10/2024",
"language":"Italian", "language":"Italian",
+478
View File
@@ -0,0 +1,478 @@
{
"_TRANSLATION": {
"otversion": "v4.0.1",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Latvian",
"automated": false
},
"checker": {
"system": {
"typeError": "[KĻŪDA]",
"headerOpenTicket": "ATVĒRT BIĻETI",
"typeWarning": "[BRĪDINĀJUMS]",
"typeInfo": "[INFORMĀCIJA]",
"headerConfigChecker": "KONFIGURĀCIJAS PĀRBAUDĪTĀJS",
"headerDescription": "pārbaudiet kļūdas savos konfigurācijas failos!",
"footerError": "bots netiks startēts, kamēr visas {0} nebūs izlabotas!",
"footerWarning": "ieteicams izlabot visas {0} pirms startēšanas!",
"footerSupport": "ATBALSTS: {0} - DOKUMENTI: {1}",
"compactInformation": "izmantojiet {0}, lai iegūtu vairāk informācijas!",
"dataPath": "ceļš",
"dataDocs": "dokumenti",
"dataMessages": "ziņojums"
},
"messages": {
"stringTooShort": "Šis teksts nedrīkst būt īsāks par {0} rakstzīmēm!",
"stringTooLong": "Šis teksts nedrīkst būt garāks par {0} rakstzīmēm!",
"stringLengthInvalid": "Šim tekstam jābūt {0} rakstzīmju garam!",
"stringStartsWith": "Šim tekstam jāsākas ar {0}!",
"stringEndsWith": "Šim tekstam jābeidzas ar {0}!",
"stringContains": "Šim tekstam jāsatur {0}!",
"stringChoices": "Šis teksts var būt tikai viena no šīm vērtībām: {0}!",
"stringRegex": "Šis teksts ir nederīgs!",
"numberTooShort": "Šis skaitlis nedrīkst būt īsāks par {0} rakstzīmēm!",
"numberTooLong": "Šis skaitlis nedrīkst būt garāks par {0} rakstzīmēm!",
"numberLengthInvalid": "Šim skaitlim jābūt {0} rakstzīmju garam!",
"numberTooSmall": "Šim skaitlim jābūt vismaz {0}!",
"numberTooLarge": "Šim skaitlim jābūt ne vairāk kā {0}!",
"numberNotEqual": "Šim skaitlim jābūt {0}!",
"numberStep": "Šim skaitlim jābūt {0} reizinājumam!",
"numberStepOffset": "Šim skaitlim jābūt {0} reizinājumam, sākot ar {1}!",
"numberStartsWith": "Šim skaitlim jāsākas ar {0}!",
"numberEndsWith": "Šim skaitlim jābeidzas ar {0}!",
"numberContains": "Šim skaitlim jāsatur {0}!",
"numberChoices": "Šis skaitlis var būt tikai viena no šīm vērtībām: {0}!",
"numberFloat": "Šis skaitlis nedrīkst būt decimāldaļa!",
"numberNegative": "Šis skaitlis nedrīkst būt negatīvs!",
"numberPositive": "Šis skaitlis nedrīkst būt pozitīvs!",
"numberZero": "Šis skaitlis nedrīkst būt nulle!",
"booleanTrue": "Šis loģiskais mainīgais nedrīkst būt patiess!",
"booleanFalse": "Šis loģiskais mainīgais nedrīkst būt nepatiess!",
"arrayEmptyDisabled": "Šis masīvs nedrīkst būt tukšs!",
"arrayEmptyRequired": "Šim masīvam jābūt tukšam!",
"arrayTooShort": "Šim masīvam jābūt vismaz {0} garam!",
"arrayTooLong": "Šim masīvam jābūt ne garākam par {0}!",
"arrayLengthInvalid": "Šim masīvam jābūt {0} garam!",
"arrayInvalidTypes": "Šis masīvs var saturēt tikai šādus tipus: {0}!",
"arrayDouble": "Šis masīvs neatļauj vienādas vērtības divreiz!",
"discordInvalidId": "Šis ir nederīgs Discord {0} ID!",
"discordInvalidIdOptions": "Šis ir nederīgs Discord {0} ID! Jūs varat izmantot arī kādu no šiem: {1}!",
"discordInvalidToken": "Šis ir nederīgs Discord tokens (sintaktiski)!",
"colorInvalid": "Šī ir nederīga heksadecimālā krāsa!",
"emojiTooShort": "Šim tekstam jābūt vismaz {0} emocijzīmēm!",
"emojiTooLong": "Šim tekstam jābūt ne vairāk kā {0} emocijzīmēm!",
"emojiCustom": "Šī emocijzīme nedrīkst būt pielāgota Discord emocijzīme!",
"emojiInvalid": "Šī ir nederīga emocijzīme!",
"urlInvalid": "Šī URL ir nederīga!",
"urlInvalidHttp": "Šī URL var izmantot tikai https:// protokolu!",
"urlInvalidProtocol": "Šī URL var izmantot tikai http:// un https:// protokolus!",
"urlInvalidHostname": "Šai URL ir neatļauts resursdatora nosaukums!",
"urlInvalidExtension": "Šai URL ir nederīgs paplašinājums! Izvēlieties starp: {0}!",
"urlInvalidPath": "Šai URL ir nederīgs ceļš!",
"idNotUnique": "Šis ID nav unikāls, izmantojiet citu ID!",
"idNonExistent": "ID {0} neeksistē!",
"invalidType": "Šai īpašībai jābūt tipam: {0}!",
"propertyMissing": "Īpašība {0} trūkst šajā objektā!",
"propertyOptional": "Īpašība {0} šajā objektā ir izvēles!",
"objectDisabled": "Šis objekts ir atspējots, aktivizējiet to, izmantojot {0}!",
"nullInvalid": "Šī īpašība nedrīkst būt null!",
"switchInvalidType": "Tam jābūt vienam no šiem tipiem: {0}!",
"objectSwitchInvalid": "Šim objektam jābūt vienam no šiem tipiem: {0}!",
"invalidLanguage": "Šī ir nederīga valoda!",
"invalidButton": "Šai pogai jābūt vismaz {0} vai {1}!",
"unusedOption": "Opcija {0} nekur netiek izmantota!",
"unusedQuestion": "Jautājums {0} nekur netiek izmantots!",
"dropdownOption": "Panelim ar iespējotu izvēlni var būt tikai 'ticket' tipa opcijas!"
}
},
"actions": {
"buttons": {
"create": "Apmeklēt biļeti",
"close": "Aizvērt biļeti",
"delete": "Dzēst biļeti",
"reopen": "Atvērt biļeti no jauna",
"claim": "Pieprasīt biļeti",
"unclaim": "Atcelt biļetes pieprasījumu",
"pin": "Piespraust biļeti",
"unpin": "Atspraust biļeti",
"clear": "Dzēst biļetes",
"helpSwitchSlash": "Skatīt slīpsvītras komandas",
"helpSwitchText": "Skatīt teksta komandas",
"helpPage": "Lapa {0}",
"withReason": "Ar iemeslu",
"withoutTranscript": "Bez transkripta"
},
"titles": {
"created": "Biļete izveidota",
"close": "Biļete aizvērta",
"delete": "Biļete dzēsta",
"reopen": "Biļete atkal atvērta",
"claim": "Biļete pieprasīta",
"unclaim": "Biļetes pieprasījums atcelts",
"pin": "Biļete piesprausta",
"unpin": "Biļete atsprausta",
"rename": "Biļete pārdēvēta",
"move": "Biļete pārvietota",
"add": "Lietotājs pievienots biļetei",
"remove": "Lietotājs noņemts no biļetes",
"help": "Pieejamās komandas",
"statsReset": "Atiestatīt statistiku",
"blacklistAdd": "Lietotājs pievienots melnajam sarakstam",
"blacklistRemove": "Lietotājs atbrīvots",
"blacklistGet": "Melnajā sarakstā esošs lietotājs",
"blacklistView": "Pašreizējais melnais saraksts",
"blacklistAddDm": "Pievienots melnajam sarakstam",
"blacklistRemoveDm": "Noņemts no melnā saraksta",
"clear": "Biļetes izdzēstas",
"roles": "Lomas atjauninātas",
"autoclose": "Biļete automātiski aizvērta",
"autocloseEnabled": "Automātiskā aizvēršana ieslēgta",
"autocloseDisabled": "Automātiskā aizvēršana izslēgta",
"autodelete": "Biļete automātiski dzēsta",
"autodeleteEnabled": "Automātiskā dzēšana ieslēgta",
"autodeleteDisabled": "Automātiskā dzēšana izslēgta"
},
"descriptions": {
"create": "Jūsu biļete ir izveidota. Noklikšķiniet uz pogas zemāk, lai tai piekļūtu!",
"close": "Biļete ir veiksmīgi aizvērta!",
"delete": "Biļete ir veiksmīgi dzēsta!",
"reopen": "Biļete ir veiksmīgi atkal atvērta!",
"claim": "Biļete ir veiksmīgi pieprasīta!",
"unclaim": "Biļetes pieprasījums ir veiksmīgi atcelts!",
"pin": "Biļete ir veiksmīgi piesprausta!",
"unpin": "Biļete ir veiksmīgi atsprausta!",
"rename": "Biļete ir veiksmīgi pārdēvēta par {0}!",
"move": "Biļete ir veiksmīgi pārvietota uz {0}!",
"add": "{0} ir veiksmīgi pievienots biļetei!",
"remove": "{0} ir veiksmīgi noņemts no biļetes!",
"helpExplanation": "`<nosaukums>` => obligāts parametrs\n`[nosaukums]` => izvēles parametrs",
"statsReset": "Bota statistika ir veiksmīgi atiestatīta!",
"statsError": "Nevar skatīt biļešu statistiku!\n{0} nav biļete!",
"blacklistAdd": "{0} ir veiksmīgi pievienots melnajam sarakstam!",
"blacklistRemove": "{0} ir veiksmīgi atbrīvots!",
"blacklistGetSuccess": "{0} pašlaik ir melnajā sarakstā!",
"blacklistGetEmpty": "{0} pašlaik nav melnajā sarakstā!",
"blacklistViewEmpty": "Vēl neviens nav melnajā sarakstā!",
"blacklistViewTip": "Izmantojiet \"/blacklist add\", lai pievienotu lietotāju melnajam sarakstam!",
"clearVerify": "Vai esat pārliecināts, ka vēlaties dzēst vairākas biļetes?\nŠo darbību nevar atsaukt!",
"clearReady": "{0} biļetes ir veiksmīgi dzēstas!",
"rolesEmpty": "Neviena loma nav atjaunināta!",
"autocloseLeave": "Šī biļete tika automātiski aizvērta, jo izveidotājs pameta serveri!",
"autocloseTimeout": "Šī biļete tika automātiski aizvērta, jo tā bija neaktīva ilgāk par `{0}h`!",
"autodeleteLeave": "Šī biļete tika automātiski dzēsta, jo izveidotājs pameta serveri!",
"autodeleteTimeout": "Šī biļete tika automātiski dzēsta, jo tā bija neaktīva ilgāk par `{0} dienām`!",
"autocloseEnabled": "Automātiskā aizvēršana ir ieslēgta šai biļetei!\nTā tiks aizvērta, ja būs neaktīva ilgāk par `{0}h`!",
"autocloseDisabled": "Automātiskā aizvēršana ir izslēgta šai biļetei!\nTā vairs netiks automātiski aizvērta!",
"autodeleteEnabled": "Automātiskā dzēšana ir ieslēgta šai biļetei!\nTā tiks dzēsta, ja būs neaktīva ilgāk par `{0} dienām`!",
"autodeleteDisabled": "Automātiskā dzēšana ir izslēgta šai biļetei!\nTā vairs netiks automātiski dzēsta!",
"ticketMessageLimit": "Jūs varat izveidot tikai {0} biļeti(-es) vienlaikus!",
"ticketMessageAutoclose": "Šī biļete tiks automātiski aizvērta, ja būs neaktīva {0}h!",
"ticketMessageAutodelete": "Šī biļete tiks automātiski dzēsta, ja būs neaktīva {0} dienas!",
"panelReady": "Paneli var atrast zemāk!\nŠo ziņojumu tagad var dzēst!"
},
"modal": {
"closePlaceholder": "Kāpēc jūs aizvērāt šo biļeti?",
"deletePlaceholder": "Kāpēc jūs dzēsāt šo biļeti?",
"reopenPlaceholder": "Kāpēc jūs atkal atvērāt šo biļeti?",
"claimPlaceholder": "Kāpēc jūs pieprasījāt šo biļeti?",
"unclaimPlaceholder": "Kāpēc jūs atcēlāt šīs biļetes pieprasījumu?",
"pinPlaceholder": "Kāpēc jūs piespraudāt šo biļeti?",
"unpinPlaceholder": "Kāpēc jūs atspraudāt šo biļeti?"
},
"logs": {
"createLog": "Jauna biļete tika izveidota no {0}!",
"closeLog": "Šī biļete tika aizvērta no {0}!",
"closeDm": "Jūsu biļete tika aizvērta mūsu serverī!",
"deleteLog": "Šī biļete tika dzēsta no {0}!",
"deleteDm": "Jūsu biļete tika dzēsta mūsu serverī!",
"reopenLog": "Šī biļete tika atkal atvērta no {0}!",
"reopenDm": "Jūsu biļete tika atkal atvērta mūsu serverī!",
"claimLog": "Šī biļete tika pieprasīta no {0}!",
"claimDm": "Jūsu biļete tika pieprasīta mūsu serverī!",
"unclaimLog": "Šīs biļetes pieprasījums tika atcelts no {0}!",
"unclaimDm": "Jūsu biļetes pieprasījums tika atcelts mūsu serverī!",
"pinLog": "Šī biļete tika piesprausta no {0}!",
"pinDm": "Jūsu biļete tika piesprausta mūsu serverī!",
"unpinLog": "Šī biļete tika atsprausta no {0}!",
"unpinDm": "Jūsu biļete tika atsprausta mūsu serverī!",
"renameLog": "Šī biļete tika pārdēvēta par {0} no {1}!",
"renameDm": "Jūsu biļete tika pārdēvēta par {0} mūsu serverī!",
"moveLog": "Šī biļete tika pārvietota uz {0} no {1}!",
"moveDm": "Jūsu biļete tika pārvietota uz {0} mūsu serverī!",
"addLog": "{0} tika pievienots šai biļetei no {1}!",
"addDm": "{0} tika pievienots jūsu biļetei mūsu serverī!",
"removeLog": "{0} tika noņemts no šīs biļetes no {1}!",
"removeDm": "{0} tika noņemts no jūsu biļetes mūsu serverī!",
"blacklistAddLog": "{0} tika pievienots melnajam sarakstam no {1}!",
"blacklistRemoveLog": "{0} tika noņemts no melnā saraksta no {1}!",
"blacklistAddDm": "Jūs esat pievienots melnajam sarakstam mūsu serverī!\nNo šī brīža jūs nevarat izveidot biļeti!",
"blacklistRemoveDm": "Jūs esat noņemts no melnā saraksta mūsu serverī!\nTagad jūs atkal varat izveidot biļetes!",
"clearLog": "{0} biļetes tika dzēstas no {1}!"
}
},
"transcripts": {
"success": {
"visit": "Apmeklēt transkriptu",
"ready": "Transkripts izveidots",
"textFileDescription": "Šis ir dzēstas biļetes teksta transkripts!",
"htmlProgress": "Lūdzu, uzgaidiet, kamēr šis HTML transkripts tiek apstrādāts...",
"createdChannel": "Jauns {0} transkripts tika izveidots serverī!",
"createdCreator": "Jauns {0} transkripts tika izveidots vienai no jūsu biļetēm!",
"createdParticipant": "Jauns {0} transkripts tika izveidots vienā no biļetēm, kurā jūs piedalījāties!",
"createdActiveAdmin": "Jauns {0} transkripts tika izveidots vienā no biļetēm, kurā jūs piedalījāties kā administrators!",
"createdEveryAdmin": "Jauns {0} transkripts tika izveidots vienā no biļetēm, kurā jūs bijāt administrators!",
"createdOther": "Jauns {0} transkripts tika izveidots!"
},
"errors": {
"retry": "Mēģināt vēlreiz",
"continue": "Dzēst bez transkripta",
"backup": "Izveidot rezerves transkriptu",
"error": "Kaut kas nogāja greizi, mēģinot izveidot transkriptu.\nKo jūs vēlaties darīt?\n\nŠī biļete netiks dzēsta, kamēr jūs nenoklikšķināsiet uz vienas no šīm pogām."
}
},
"errors": {
"titles": {
"internalError": "Iekšēja kļūda",
"optionMissing": "Trūkst komandas opcijas",
"optionInvalid": "Nederīga komandas opcija",
"unknownCommand": "Nezināma komanda",
"noPermissions": "Nav atļauju",
"unknownTicket": "Nezināma biļete",
"deprecatedTicket": "Novecojusi biļete",
"unknownOption": "Nezināma opcija",
"unknownPanel": "Nezināms panelis",
"notInGuild": "Nav serverī",
"channelRename": "Nevar pārdēvēt kanālu",
"busy": "Biļete ir aizņemta"
},
"descriptions": {
"askForInfo": "Sazinieties ar šī bota īpašnieku, lai iegūtu plašāku informāciju!",
"askForInfoResolve": "Sazinieties ar bota īpašnieku, ja šī problēma neatrisinās pēc dažiem mēģinājumiem.",
"internalError": "Neizdevās atbildēt uz šo {0} iekšējas kļūdas dēļ!",
"optionMissing": "Šai komandai trūkst obligāta parametra!",
"optionInvalid": "Šīs komandas parametrs ir nederīgs!",
"optionInvalidChoose": "Izvēlieties starp",
"unknownCommand": "Mēģiniet apmeklēt palīdzības izvēlni, lai iegūtu vairāk informācijas!",
"noPermissions": "Jums nav atļauts izmantot šo {0}!",
"noPermissionsList": "Nepieciešamās atļaujas: (viena no tām)",
"noPermissionsCooldown": "Jums nav atļauts izmantot šo {0}, jo jums ir atpūtas periods!",
"noPermissionsBlacklist": "Jums nav atļauts izmantot šo {0}, jo esat melnajā sarakstā!",
"noPermissionsLimitGlobal": "Jūs nevarat izveidot biļeti, jo serveris ir sasniedzis maksimālo biļešu skaitu!",
"noPermissionsLimitGlobalUser": "Jūs nevarat izveidot biļeti, jo esat sasniedzis maksimālo biļešu skaitu!",
"noPermissionsLimitOption": "Jūs nevarat izveidot biļeti, jo serveris ir sasniedzis maksimālo biļešu skaitu šai opcijai!",
"noPermissionsLimitOptionUser": "Jūs nevarat izveidot biļeti, jo esat sasniedzis maksimālo biļešu skaitu šai opcijai!",
"unknownTicket": "Mēģiniet vēlreiz izmantot šo komandu derīgā biļetē!",
"deprecatedTicket": "Pašreizējais kanāls nav derīga biļete! Tas varētu būt biļete no vecas Open Ticket versijas!",
"notInGuild": "Šis {0} nedarbojas DM! Lūdzu, mēģiniet vēlreiz serverī!",
"channelRename": "Discord ierobežojumu dēļ bots pašlaik nevar pārdēvēt kanālu. Kanāls tiks automātiski pārdēvēts 10 minūšu laikā, ja bots netiks restartēts.",
"channelRenameSource": "Šīs kļūdas avots ir: {0}",
"busy": "Nevar izmantot šo {0}!\nBiļete pašlaik tiek apstrādāta ar botu.\n\nLūdzu, mēģiniet vēlreiz pēc dažām sekundēm!"
},
"optionInvalidReasons": {
"stringRegex": "Vērtība neatbilst šablonam!",
"stringMinLength": "Vērtībai jābūt vismaz {0} rakstzīmēm!",
"stringMaxLength": "Vērtībai jābūt ne vairāk kā {0} rakstzīmēm!",
"numberInvalid": "Nederīgs skaitlis!",
"numberMin": "Skaitlim jābūt vismaz {0}!",
"numberMax": "Skaitlim jābūt ne vairāk kā {0}!",
"numberDecimal": "Skaitlis nedrīkst būt decimāldaļa!",
"numberNegative": "Skaitlis nedrīkst būt negatīvs!",
"numberPositive": "Skaitlis nedrīkst būt pozitīvs!",
"numberZero": "Skaitlis nedrīkst būt nulle!",
"channelNotFound": "Nevar atrast kanālu!",
"userNotFound": "Nevar atrast lietotāju!",
"roleNotFound": "Nevar atrast lomu!",
"memberNotFound": "Nevar atrast lietotāju!",
"mentionableNotFound": "Nevar atrast lietotāju vai lomu!",
"channelType": "Nederīgs kanāla tips!",
"notInGuild": "Šai opcijai jābūt serverī!"
},
"permissions": {
"developer": "Jums jābūt bota izstrādātājam.",
"owner": "Jums jābūt servera īpašniekam.",
"admin": "Jums jābūt servera administratoram.",
"moderator": "Jums jābūt moderatoram.",
"support": "Jums jābūt atbalsta komandā.",
"member": "Jums jābūt dalībniekam.",
"discord-administrator": "Jums jābūt `ADMINISTRATOR` atļaujai."
},
"actionInvalid": {
"close": "Biļete jau ir aizvērta!",
"reopen": "Biļete vēl nav aizvērta!",
"claim": "Biļete jau ir pieprasīta!",
"unclaim": "Biļete vēl nav pieprasīta!",
"pin": "Biļete jau ir piesprausta!",
"unpin": "Biļete nav piesprausta!",
"add": "Šis lietotājs jau var piekļūt biļetei!",
"remove": "Nevar noņemt šo lietotāju no biļetes!"
}
},
"params": {
"uppercase": {
"ticket": "Biļete",
"tickets": "Biļetes",
"reason": "Iemesls",
"creator": "Izveidotājs",
"remaining": "Atlikušais laiks",
"added": "Pievienots",
"removed": "Noņemts",
"filter": "Filtrs",
"claimedBy": "Pieprasījis {0}",
"method": "Metode",
"type": "Tips",
"blacklisted": "Melnajā sarakstā",
"panel": "Panelis",
"command": "Komanda",
"system": "Sistēma",
"true": "Patiess",
"false": "Nepatiess",
"syntax": "Sintakse",
"originalName": "Sākotnējais nosaukums",
"newName": "Jaunais nosaukums",
"until": "Līdz",
"validOptions": "Derīgas opcijas",
"validPanels": "Derīgi paneļi",
"autoclose": "Automātiskā aizvēršana",
"autodelete": "Automātiskā dzēšana",
"startupDate": "Startēšanas datums",
"version": "Versija",
"name": "Nosaukums",
"role": "Loma",
"status": "Statuss",
"claimed": "Pieprasīts",
"pinned": "Piesprausts",
"creationDate": "Izveidošanas datums"
},
"lowercase": {
"text": "teksts",
"html": "html",
"command": "komanda",
"modal": "modāls",
"button": "poga",
"dropdown": "izvēlne",
"method": "metode"
}
},
"commands": {
"reason": "Norādiet izvēles iemeslu, kas būs redzams žurnālos.",
"help": "Iegūstiet visu pieejamo komandu sarakstu.",
"panel": "Izveidojiet ziņojumu ar izvēlni vai pogām (biļešu izveidei).",
"panelId": "Paneļa identifikators, kuru vēlaties izveidot.",
"panelAutoUpdate": "Vai vēlaties, lai šis panelis automātiski atjauninātos, kad tas tiek rediģēts?",
"ticket": "Nekavējoties izveidojiet biļeti.",
"ticketId": "Biļetes identifikators, kuru vēlaties izveidot.",
"close": "Aizveriet biļeti.",
"delete": "Dzēsiet biļeti.",
"deleteNoTranscript": "Dzēsiet šo biļeti, neizveidojot transkriptu.",
"reopen": "Atveriet biļeti no jauna.",
"claim": "Pieprasiet biļeti.",
"claimUser": "Pieprasiet šo biļeti kādam citam, nevis sev.",
"unclaim": "Atceliet biļetes pieprasījumu.",
"pin": "Piespraudiet biļeti.",
"unpin": "Atspraudiet biļeti.",
"move": "Pārvietojiet biļeti.",
"moveId": "Opcijas identifikators, uz kuru vēlaties pārvietot.",
"rename": "Pārdēvējiet biļeti.",
"renameName": "Jaunais nosaukums šai biļetei.",
"add": "Pievienojiet lietotāju biļetei.",
"addUser": "Lietotājs, kuru pievienot.",
"remove": "Noņemiet lietotāju no biļetes.",
"removeUser": "Lietotājs, kuru noņemt.",
"blacklist": "Pārvaldiet biļešu melno sarakstu.",
"blacklistView": "Skatiet pašreizējā melnā saraksta sarakstu.",
"blacklistAdd": "Pievienojiet lietotāju melnajam sarakstam.",
"blacklistRemove": "Noņemiet lietotāju no melnā saraksta.",
"blacklistGet": "Iegūstiet informāciju par melnajā sarakstā esošu lietotāju.",
"blacklistGetUser": "Lietotājs, par kuru iegūt informāciju.",
"stats": "Skatiet statistiku no bota, dalībnieka vai biļetes.",
"statsReset": "Atiestatiet visu bota statistiku (un sāciet skaitīt no nulles).",
"statsGlobal": "Skatiet globālo statistiku.",
"statsUser": "Skatiet lietotāja statistiku serverī.",
"statsUserUser": "Lietotājs, kuru skatīt.",
"statsTicket": "Skatiet biļetes statistiku serverī.",
"statsTicketTicket": "Biļete, kuru skatīt.",
"clear": "Dzēsiet vairākas biļetes vienlaikus.",
"clearFilter": "Filtrs biļešu dzēšanai.",
"clearFilters": {
"all": "Visas",
"open": "Atvērtas",
"close": "Aizvērtas",
"claim": "Pieprasītas",
"unclaim": "Nepieprasītas",
"pin": "Piespraustas",
"unpin": "Atspraustas",
"autoclose": "Automātiski aizvērtas"
},
"autoclose": "Pārvaldiet automātisko aizvēršanu biļetē.",
"autocloseDisable": "Atspējojiet automātisko aizvēršanu šai biļetei.",
"autocloseEnable": "Ieslēdziet automātisko aizvēršanu šai biļetei.",
"autocloseEnableTime": "Stundu skaits, cik ilgi biļetei jābūt neaktīvai, lai to aizvērtu.",
"autodelete": "Pārvaldiet automātisko dzēšanu biļetē.",
"autodeleteDisable": "Atspējojiet automātisko dzēšanu šai biļetei.",
"autodeleteEnable": "Ieslēdziet automātisko dzēšanu šai biļetei.",
"autodeleteEnableTime": "Dienu skaits, cik ilgi biļetei jābūt neaktīvai, lai to dzēstu."
},
"helpMenu": {
"help": "Iegūstiet visu pieejamo komandu sarakstu.",
"ticket": "Nekavējoties izveidojiet biļeti.",
"close": "Aizveriet biļeti, tas atspējo rakstīšanu šajā kanālā.",
"delete": "Dzēsiet biļeti, tas izveido transkriptu, ja ir iespējots.",
"reopen": "Atveriet biļeti no jauna, tas atkal iespējo rakstīšanu šajā kanālā.",
"pin": "Piespraudiet biļeti. Tas pārvietos biļeti uz augšu un pievienos '📌' emocijzīmi nosaukumam.",
"unpin": "Atspraudiet biļeti. Biļete paliks savā pozīcijā, bet zaudēs '📌' emocijzīmi.",
"move": "Pārvietojiet biļeti. Tas mainīs šīs biļetes tipu.",
"rename": "Pārdēvējiet biļeti. Tas mainīs šīs biļetes kanāla nosaukumu.",
"claim": "Pieprasiet biļeti. Ar to jūs varat informēt savu komandu, ka jūs apstrādājat šo biļeti.",
"unclaim": "Atceliet biļetes pieprasījumu. Ar to jūs varat informēt savu komandu, ka šī biļete atkal ir brīva.",
"add": "Pievienojiet lietotāju biļetei. Tas ļaus lietotājam lasīt un rakstīt šajā biļetē.",
"remove": "Noņemiet lietotāju no biļetes. Tas atņems lietotājam iespēju lasīt un rakstīt šajā biļetē.",
"panel": "Izveidojiet ziņojumu ar izvēlni vai pogām (biļešu izveidei).",
"blacklistView": "Skatiet pašreizējā melnā saraksta sarakstu.",
"blacklistAdd": "Pievienojiet lietotāju melnajam sarakstam.",
"blacklistRemove": "Noņemiet lietotāju no melnā saraksta.",
"blacklistGet": "Iegūstiet informāciju par melnajā sarakstā esošu lietotāju.",
"statsGlobal": "Skatiet globālo statistiku.",
"statsTicket": "Skatiet biļetes statistiku serverī.",
"statsUser": "Skatiet lietotāja statistiku serverī.",
"statsReset": "Atiestatiet visu bota statistiku (un sāciet skaitīt no nulles).",
"autocloseDisable": "Atspējojiet automātisko aizvēršanu šai biļetei.",
"autocloseEnable": "Ieslēdziet automātisko aizvēršanu šai biļetei.",
"autodeleteDisable": "Atspējojiet automātisko dzēšanu šai biļetei.",
"autodeleteEnable": "Ieslēdziet automātisko dzēšanu šai biļetei."
},
"stats": {
"scopes": {
"global": "Globālā statistika",
"system": "Sistēmas statistika",
"user": "Lietotāja statistika",
"ticket": "Biļešu statistika",
"participants": "Dalībnieki"
},
"properties": {
"ticketsCreated": "Izveidotās biļetes",
"ticketsClosed": "Aizvērtās biļetes",
"ticketsDeleted": "Dzēstās biļetes",
"ticketsReopened": "Atkal atvērtās biļetes",
"ticketsAutoclosed": "Automātiski aizvērtās biļetes",
"ticketsClaimed": "Pieprasītās biļetes",
"ticketsPinned": "Piespraustās biļetes",
"ticketsMoved": "Pārvietotās biļetes",
"usersBlacklisted": "Melnajā sarakstā esošie lietotāji",
"transcriptsCreated": "Izveidotie transkripti"
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["TsgIndrius"], "translators":["TsgIndrius"],
"lastedited":"26/01/2025", "lastedited":"26/01/2025",
"language":"Lithuanian", "language":"Lithuanian",
+478
View File
@@ -0,0 +1,478 @@
{
"_TRANSLATION": {
"otversion": "v4.0.1",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Norwegian",
"automated": false
},
"checker": {
"system": {
"typeError": "[FEIL]",
"headerOpenTicket": "ÅPNE SAK",
"typeWarning": "[ADVARSEL]",
"typeInfo": "[INFO]",
"headerConfigChecker": "KONFIGURASJONSSJEKKER",
"headerDescription": "sjekk etter feil i konfigurasjonen din!",
"footerError": "boten starter ikke før alle {0} er fikset!",
"footerWarning": "det anbefales å fikse alle {0} før oppstart!",
"footerSupport": "STØTTE: {0} - DOKUMENTASJON: {1}",
"compactInformation": "bruk {0} for mer informasjon!",
"dataPath": "sti",
"dataDocs": "dokumentasjon",
"dataMessages": "melding"
},
"messages": {
"stringTooShort": "Denne strengen kan ikke være kortere enn {0} tegn!",
"stringTooLong": "Denne strengen kan ikke være lengre enn {0} tegn!",
"stringLengthInvalid": "Denne strengen skal være {0} tegn lang!",
"stringStartsWith": "Denne strengen skal starte med {0}!",
"stringEndsWith": "Denne strengen skal slutte med {0}!",
"stringContains": "Denne strengen skal inneholde {0}!",
"stringChoices": "Denne strengen kan kun være en av følgende verdier: {0}!",
"stringRegex": "Denne strengen er ugyldig!",
"numberTooShort": "Dette tallet kan ikke være kortere enn {0} tegn!",
"numberTooLong": "Dette tallet kan ikke være lengre enn {0} tegn!",
"numberLengthInvalid": "Dette tallet skal være {0} tegn langt!",
"numberTooSmall": "Dette tallet skal være minst {0}!",
"numberTooLarge": "Dette tallet skal være høyst {0}!",
"numberNotEqual": "Dette tallet skal være {0}!",
"numberStep": "Dette tallet skal være et multiplum av {0}!",
"numberStepOffset": "Dette tallet skal være et multiplum av {0}, startende med {1}!",
"numberStartsWith": "Dette tallet skal starte med {0}!",
"numberEndsWith": "Dette tallet skal slutte med {0}!",
"numberContains": "Dette tallet skal inneholde {0}!",
"numberChoices": "Dette tallet kan kun være en av følgende verdier: {0}!",
"numberFloat": "Dette tallet kan ikke være et desimaltall!",
"numberNegative": "Dette tallet kan ikke være negativt!",
"numberPositive": "Dette tallet kan ikke være positivt!",
"numberZero": "Dette tallet kan ikke være null!",
"booleanTrue": "Denne boolske verdien kan ikke være sann!",
"booleanFalse": "Denne boolske verdien kan ikke være usann!",
"arrayEmptyDisabled": "Denne listen kan ikke være tom!",
"arrayEmptyRequired": "Denne listen skal være tom!",
"arrayTooShort": "Denne listen skal ha en lengde på minst {0}!",
"arrayTooLong": "Denne listen skal ha en lengde på høyst {0}!",
"arrayLengthInvalid": "Denne listen skal ha en lengde på {0}!",
"arrayInvalidTypes": "Denne listen kan kun inneholde følgende typer: {0}!",
"arrayDouble": "Denne listen tillater ikke samme verdi to ganger!",
"discordInvalidId": "Dette er en ugyldig Discord {0} ID!",
"discordInvalidIdOptions": "Dette er en ugyldig Discord {0} ID! Du kan også bruke en av disse: {1}!",
"discordInvalidToken": "Dette er et ugyldig Discord-token (syntaktisk)!",
"colorInvalid": "Dette er en ugyldig heksadesimal farge!",
"emojiTooShort": "Denne strengen skal ha minst {0} emojier!",
"emojiTooLong": "Denne strengen skal ha høyst {0} emojier!",
"emojiCustom": "Denne emojien kan ikke være en tilpasset Discord-emoji!",
"emojiInvalid": "Dette er en ugyldig emoji!",
"urlInvalid": "Denne URL-en er ugyldig!",
"urlInvalidHttp": "Denne URL-en kan kun bruke https://-protokollen!",
"urlInvalidProtocol": "Denne URL-en kan kun bruke http://- og https://-protokollene!",
"urlInvalidHostname": "Denne URL-en har et ikke-tillatt vertsnavn!",
"urlInvalidExtension": "Denne URL-en har en ugyldig filtype! Velg mellom: {0}!",
"urlInvalidPath": "Denne URL-en har en ugyldig sti!",
"idNotUnique": "Denne ID-en er ikke unik, bruk en annen ID i stedet!",
"idNonExistent": "ID-en {0} finnes ikke!",
"invalidType": "Denne egenskapen skal være av typen: {0}!",
"propertyMissing": "Egenskapen {0} mangler i dette objektet!",
"propertyOptional": "Egenskapen {0} er valgfri i dette objektet!",
"objectDisabled": "Dette objektet er deaktivert, aktiver det ved å bruke {0}!",
"nullInvalid": "Denne egenskapen kan ikke være null!",
"switchInvalidType": "Dette skal være en av følgende typer: {0}!",
"objectSwitchInvalid": "Dette objektet skal være en av følgende typer: {0}!",
"invalidLanguage": "Dette er et ugyldig språk!",
"invalidButton": "Denne knappen skal ha minst en {0} eller {1}!",
"unusedOption": "Alternativet {0} brukes ikke noe sted!",
"unusedQuestion": "Spørsmålet {0} brukes ikke noe sted!",
"dropdownOption": "Et panel med nedtrekksmeny aktivert kan kun inneholde alternativer av typen 'sak'!"
}
},
"actions": {
"buttons": {
"create": "Opprett Sak",
"close": "Lukk Sak",
"delete": "Slett Sak",
"reopen": "Gjenåpne Sak",
"claim": "Ta Sak",
"unclaim": "Frigi Sak",
"pin": "Fest Sak",
"unpin": "Løsne Sak",
"clear": "Slett Saker",
"helpSwitchSlash": "Vis Skråstrekskommandoer",
"helpSwitchText": "Vis Tekstkommandoer",
"helpPage": "Side {0}",
"withReason": "Med Årsak",
"withoutTranscript": "Uten Utskrift"
},
"titles": {
"created": "Sak Opprettet",
"close": "Sak Lukket",
"delete": "Sak Slettet",
"reopen": "Sak Gjenåpnet",
"claim": "Sak Tatt",
"unclaim": "Sak Frigitt",
"pin": "Sak Festet",
"unpin": "Sak Løsnet",
"rename": "Sak Omdøpt",
"move": "Sak Flyttet",
"add": "Bruker Lagt Til Sak",
"remove": "Bruker Fjernet Fra Sak",
"help": "Tilgjengelige Kommandoer",
"statsReset": "Tilbakestill Statistikk",
"blacklistAdd": "Bruker Svartelistet",
"blacklistRemove": "Bruker Fjernet Fra Svarteliste",
"blacklistGet": "Svartelistet Bruker",
"blacklistView": "Gjeldende Svarteliste",
"blacklistAddDm": "Lagt Til Svarteliste",
"blacklistRemoveDm": "Fjernet Fra Svarteliste",
"clear": "Saker Slettet",
"roles": "Roller Oppdatert",
"autoclose": "Sak Autolukket",
"autocloseEnabled": "Autolukking Aktivert",
"autocloseDisabled": "Autolukking Deaktivert",
"autodelete": "Sak Autoslettet",
"autodeleteEnabled": "Autosletting Aktivert",
"autodeleteDisabled": "Autosletting Deaktivert"
},
"descriptions": {
"create": "Din sak er blitt opprettet. Klikk på knappen nedenfor for å få tilgang til den!",
"close": "Saken er blitt lukket vellykket!",
"delete": "Saken er blitt slettet vellykket!",
"reopen": "Saken er blitt gjenåpnet vellykket!",
"claim": "Saken er blitt tatt vellykket!",
"unclaim": "Saken er blitt frigitt vellykket!",
"pin": "Saken er blitt festet vellykket!",
"unpin": "Saken er blitt løsnet vellykket!",
"rename": "Saken er blitt omdøpt til {0} vellykket!",
"move": "Saken er blitt flyttet til {0} vellykket!",
"add": "{0} er blitt lagt til saken vellykket!",
"remove": "{0} er blitt fjernet fra saken vellykket!",
"helpExplanation": "`<navn>` => påkrevd parameter\n`[navn]` => valgfri parameter",
"statsReset": "Botens statistikk er blitt tilbakestilt vellykket!",
"statsError": "Kan ikke vise saksstatistikk!\n{0} er ikke en sak!",
"blacklistAdd": "{0} er blitt svartelistet vellykket!",
"blacklistRemove": "{0} er blitt fjernet fra svartelisten vellykket!",
"blacklistGetSuccess": "{0} er for øyeblikket svartelistet!",
"blacklistGetEmpty": "{0} er for øyeblikket ikke svartelistet!",
"blacklistViewEmpty": "Ingen er svartelistet ennå!",
"blacklistViewTip": "Bruk \"/blacklist add\" for å svarteliste en bruker!",
"clearVerify": "Er du sikker på at du vil slette flere saker?\nDenne handlingen kan ikke angres!",
"clearReady": "{0} saker er blitt slettet vellykket!",
"rolesEmpty": "Ingen roller er blitt oppdatert!",
"autocloseLeave": "Denne saken er blitt autolukket fordi oppretteren forlot serveren!",
"autocloseTimeout": "Denne saken er blitt autolukket fordi den har vært inaktiv i mer enn `{0}t`!",
"autodeleteLeave": "Denne saken er blitt autoslettet fordi oppretteren forlot serveren!",
"autodeleteTimeout": "Denne saken er blitt autoslettet fordi den har vært inaktiv i mer enn `{0} dager`!",
"autocloseEnabled": "Autolukking er blitt aktivert i denne saken!\nDen vil bli lukket når den er inaktiv i mer enn `{0}t`!",
"autocloseDisabled": "Autolukking er blitt deaktivert i denne saken!\nDen vil ikke lenger bli lukket automatisk!",
"autodeleteEnabled": "Autosletting er blitt aktivert i denne saken!\nDen vil bli slettet når den er inaktiv i mer enn `{0} dager`!",
"autodeleteDisabled": "Autosletting er blitt deaktivert i denne saken!\nDen vil ikke lenger bli slettet automatisk!",
"ticketMessageLimit": "Du kan kun opprette {0} sak(er) om gangen!",
"ticketMessageAutoclose": "Denne saken vil bli autolukket når den er inaktiv i {0}t!",
"ticketMessageAutodelete": "Denne saken vil bli autoslettet når den er inaktiv i {0} dager!",
"panelReady": "Du finner panelet nedenfor!\nDenne meldingen kan nå slettes!"
},
"modal": {
"closePlaceholder": "Hvorfor lukket du denne saken?",
"deletePlaceholder": "Hvorfor slettet du denne saken?",
"reopenPlaceholder": "Hvorfor gjenåpnet du denne saken?",
"claimPlaceholder": "Hvorfor tok du denne saken?",
"unclaimPlaceholder": "Hvorfor frigjorde du denne saken?",
"pinPlaceholder": "Hvorfor festet du denne saken?",
"unpinPlaceholder": "Hvorfor løsnet du denne saken?"
},
"logs": {
"createLog": "En ny sak er blitt opprettet av {0}!",
"closeLog": "Denne saken er blitt lukket av {0}!",
"closeDm": "Din sak er blitt lukket på vår server!",
"deleteLog": "Denne saken er blitt slettet av {0}!",
"deleteDm": "Din sak er blitt slettet på vår server!",
"reopenLog": "Denne saken er blitt gjenåpnet av {0}!",
"reopenDm": "Din sak er blitt gjenåpnet på vår server!",
"claimLog": "Denne saken er blitt tatt av {0}!",
"claimDm": "Din sak er blitt tatt på vår server!",
"unclaimLog": "Denne saken er blitt frigitt av {0}!",
"unclaimDm": "Din sak er blitt frigitt på vår server!",
"pinLog": "Denne saken er blitt festet av {0}!",
"pinDm": "Din sak er blitt festet på vår server!",
"unpinLog": "Denne saken er blitt løsnet av {0}!",
"unpinDm": "Din sak er blitt løsnet på vår server!",
"renameLog": "Denne saken er blitt omdøpt til {0} av {1}!",
"renameDm": "Din sak er blitt omdøpt til {0} på vår server!",
"moveLog": "Denne saken er blitt flyttet til {0} av {1}!",
"moveDm": "Din sak er blitt flyttet til {0} på vår server!",
"addLog": "{0} er blitt lagt til denne saken av {1}!",
"addDm": "{0} er blitt lagt til din sak på vår server!",
"removeLog": "{0} er blitt fjernet fra denne saken av {1}!",
"removeDm": "{0} er blitt fjernet fra din sak på vår server!",
"blacklistAddLog": "{0} er blitt svartelistet av {1}!",
"blacklistRemoveLog": "{0} er blitt fjernet fra svartelisten av {1}!",
"blacklistAddDm": "Du er blitt svartelistet på vår server!\nFra nå av kan du ikke opprette en sak!",
"blacklistRemoveDm": "Du er blitt fjernet fra svartelisten på vår server!\nNå kan du opprette saker igjen!",
"clearLog": "{0} saker er blitt slettet av {1}!"
}
},
"transcripts": {
"success": {
"visit": "Besøk Utskrift",
"ready": "Utskrift Opprettet",
"textFileDescription": "Dette er tekstutskriften av en slettet sak!",
"htmlProgress": "Vennligst vent mens denne HTML-utskriften blir behandlet...",
"createdChannel": "En ny {0} utskrift er blitt opprettet på serveren!",
"createdCreator": "En ny {0} utskrift er blitt opprettet for en av dine saker!",
"createdParticipant": "En ny {0} utskrift er blitt opprettet i en av sakene du deltok i!",
"createdActiveAdmin": "En ny {0} utskrift er blitt opprettet i en av sakene du deltok i som admin!",
"createdEveryAdmin": "En ny {0} utskrift er blitt opprettet i en av sakene du var admin i!",
"createdOther": "En ny {0} utskrift er blitt opprettet!"
},
"errors": {
"retry": "Prøv Igjen",
"continue": "Slett Uten Utskrift",
"backup": "Opprett Sikkerhetskopiutskrift",
"error": "Noe gikk galt under forsøket på å opprette utskriften.\nHva vil du gjøre?\n\nDenne saken vil ikke bli slettet før du klikker på en av disse knappene."
}
},
"errors": {
"titles": {
"internalError": "Intern Feil",
"optionMissing": "Kommandoalternativ Mangler",
"optionInvalid": "Ugyldig Kommandoalternativ",
"unknownCommand": "Ukjent Kommando",
"noPermissions": "Ingen Tillatelser",
"unknownTicket": "Ukjent Sak",
"deprecatedTicket": "Utdatert Sak",
"unknownOption": "Ukjent Alternativ",
"unknownPanel": "Ukjent Panel",
"notInGuild": "Ikke På Server",
"channelRename": "Kan Ikke Omdøpe Kanal",
"busy": "Saken Er Opptatt"
},
"descriptions": {
"askForInfo": "Kontakt eieren av denne boten for mer informasjon!",
"askForInfoResolve": "Kontakt eieren av denne boten hvis problemet ikke løser seg etter noen forsøk!",
"internalError": "Kunne ikke svare på denne {0} på grunn av en intern feil!",
"optionMissing": "En påkrevd parameter mangler i denne kommandoen!",
"optionInvalid": "En parameter i denne kommandoen er ugyldig!",
"optionInvalidChoose": "Velg mellom",
"unknownCommand": "Prøv å besøke hjelpmenyen for mer informasjon!",
"noPermissions": "Du har ikke tillatelse til å bruke denne {0}!",
"noPermissionsList": "Påkrevde tillatelser: (en av dem)",
"noPermissionsCooldown": "Du har ikke tillatelse til å bruke denne {0} fordi du har en nedkjølingsperiode!",
"noPermissionsBlacklist": "Du har ikke tillatelse til å bruke denne {0} fordi du er svartelistet!",
"noPermissionsLimitGlobal": "Du har ikke tillatelse til å opprette en sak fordi serveren har nådd maksgrensen for saker!",
"noPermissionsLimitGlobalUser": "Du har ikke tillatelse til å opprette en sak fordi du har nådd maksgrensen for saker!",
"noPermissionsLimitOption": "Du har ikke tillatelse til å opprette en sak fordi serveren har nådd maksgrensen for dette alternativet!",
"noPermissionsLimitOptionUser": "Du har ikke tillatelse til å opprette en sak fordi du har nådd maksgrensen for dette alternativet!",
"unknownTicket": "Prøv denne kommandoen igjen i en gyldig sak!",
"deprecatedTicket": "Den nåværende kanalen er ikke en gyldig sak! Den kan ha vært en sak fra en eldre versjon av Open Ticket!",
"notInGuild": "Denne {0} fungerer ikke i DM! Prøv igjen på en server!",
"channelRename": "På grunn av Discords hastighetsbegrensninger er det for øyeblikket umulig for boten å omdøpe kanalen. Kanalen vil automatisk bli omdøpt innen 10 minutter hvis boten ikke startes på nytt.",
"channelRenameSource": "Kilden til denne feilen er: {0}",
"busy": "Kan ikke bruke denne {0}!\nSaken behandles for øyeblikket av boten.\n\nPrøv igjen om noen sekunder!"
},
"optionInvalidReasons": {
"stringRegex": "Verdien samsvarer ikke med mønsteret!",
"stringMinLength": "Verdien skal være minst {0} tegn!",
"stringMaxLength": "Verdien skal være høyst {0} tegn!",
"numberInvalid": "Ugyldig tall!",
"numberMin": "Tallet skal være minst {0}!",
"numberMax": "Tallet skal være høyst {0}!",
"numberDecimal": "Tallet kan ikke være et desimaltall!",
"numberNegative": "Tallet kan ikke være negativt!",
"numberPositive": "Tallet kan ikke være positivt!",
"numberZero": "Tallet kan ikke være null!",
"channelNotFound": "Kan ikke finne kanalen!",
"userNotFound": "Kan ikke finne brukeren!",
"roleNotFound": "Kan ikke finne rollen!",
"memberNotFound": "Kan ikke finne brukeren!",
"mentionableNotFound": "Kan ikke finne brukeren eller rollen!",
"channelType": "Ugyldig kanaltype!",
"notInGuild": "Dette alternativet krever at du er på en server!"
},
"permissions": {
"developer": "Du må være utvikleren av boten.",
"owner": "Du må være servereieren.",
"admin": "Du må være serveradministrator.",
"moderator": "Du må være moderator.",
"support": "Du må være en del av støtteteamet.",
"member": "Du må være medlem.",
"discord-administrator": "Du må ha `ADMINISTRATOR`-tillatelsen."
},
"actionInvalid": {
"close": "Saken er allerede lukket!",
"reopen": "Saken er ikke lukket ennå!",
"claim": "Saken er allerede tatt!",
"unclaim": "Saken er ikke tatt ennå!",
"pin": "Saken er allerede festet!",
"unpin": "Saken er ikke festet ennå!",
"add": "Denne brukeren har allerede tilgang til saken!",
"remove": "Kan ikke fjerne denne brukeren fra saken!"
}
},
"params": {
"uppercase": {
"ticket": "Sak",
"tickets": "Saker",
"reason": "Årsak",
"creator": "Oppretter",
"remaining": "Tid Igjen",
"added": "Lagt Til",
"removed": "Fjernet",
"filter": "Filter",
"claimedBy": "Tatt Av {0}",
"method": "Metode",
"type": "Type",
"blacklisted": "Svartelistet",
"panel": "Panel",
"command": "Kommando",
"system": "System",
"true": "Sann",
"false": "Usann",
"syntax": "Syntaks",
"originalName": "Opprinnelig Navn",
"newName": "Nytt Navn",
"until": "Til",
"validOptions": "Gyldige Alternativer",
"validPanels": "Gyldige Paneler",
"autoclose": "Autolukking",
"autodelete": "Autosletting",
"startupDate": "Oppstartsdato",
"version": "Versjon",
"name": "Navn",
"role": "Rolle",
"status": "Status",
"claimed": "Tatt",
"pinned": "Festet",
"creationDate": "Opprettelsesdato"
},
"lowercase": {
"text": "tekst",
"html": "html",
"command": "kommando",
"modal": "modal",
"button": "knapp",
"dropdown": "nedtrekksmeny",
"method": "metode"
}
},
"commands": {
"reason": "Angi en valgfri årsak som vil være synlig i loggene.",
"help": "Få en liste over alle tilgjengelige kommandoer.",
"panel": "Opprett en melding med en nedtrekksmeny eller knapper (for sakopprettelse).",
"panelId": "Identifikatoren for panelet du vil opprette.",
"panelAutoUpdate": "Ønsker du at dette panelet skal oppdatere seg automatisk når det redigeres?",
"ticket": "Opprett en sak med det samme.",
"ticketId": "Identifikatoren for saken du vil opprette.",
"close": "Lukk en sak.",
"delete": "Slett en sak.",
"deleteNoTranscript": "Slett denne saken uten å opprette en utskrift.",
"reopen": "Gjenåpne en sak.",
"claim": "Ta en sak.",
"claimUser": "Ta denne saken for en annen bruker i stedet for deg selv.",
"unclaim": "Frigi en sak.",
"pin": "Fest en sak.",
"unpin": "Løsne en sak.",
"move": "Flytt en sak.",
"moveId": "Identifikatoren for alternativet du vil flytte til.",
"rename": "Omdøp en sak.",
"renameName": "Det nye navnet på denne saken.",
"add": "Legg til en bruker i en sak.",
"addUser": "Brukeren som skal legges til.",
"remove": "Fjern en bruker fra en sak.",
"removeUser": "Brukeren som skal fjernes.",
"blacklist": "Administrer svartelisten for saker.",
"blacklistView": "Vis en liste over gjeldende svarteliste.",
"blacklistAdd": "Legg til en bruker på svartelisten.",
"blacklistRemove": "Fjern en bruker fra svartelisten.",
"blacklistGet": "Hent detaljer om en svartelistet bruker.",
"blacklistGetUser": "Brukeren å hente detaljer fra.",
"stats": "Vis statistikk fra boten, en bruker eller en sak.",
"statsReset": "Tilbakestill all statistikk for boten (og start tellingen fra null).",
"statsGlobal": "Vis global statistikk.",
"statsUser": "Vis statistikk fra en bruker på serveren.",
"statsUserUser": "Brukeren som skal vises.",
"statsTicket": "Vis statistikk for en sak på serveren.",
"statsTicketTicket": "Saken som skal vises.",
"clear": "Slett flere saker samtidig.",
"clearFilter": "Filteret for å slette saker.",
"clearFilters": {
"all": "Alle",
"open": "Åpne",
"close": "Lukkede",
"claim": "Tatte",
"unclaim": "Frigitte",
"pin": "Festede",
"unpin": "Løsnede",
"autoclose": "Autolukkede"
},
"autoclose": "Administrer autolukking i en sak.",
"autocloseDisable": "Deaktiver autolukking i denne saken.",
"autocloseEnable": "Aktiver autolukking i denne saken.",
"autocloseEnableTime": "Antall timer denne saken må være inaktiv før den lukkes.",
"autodelete": "Administrer autosletting i en sak.",
"autodeleteDisable": "Deaktiver autosletting i denne saken.",
"autodeleteEnable": "Aktiver autosletting i denne saken.",
"autodeleteEnableTime": "Antall dager denne saken må være inaktiv før den slettes."
},
"helpMenu": {
"help": "Få en liste over alle tilgjengelige kommandoer.",
"ticket": "Opprett en sak med det samme.",
"close": "Lukk en sak, dette deaktiverer skriving i kanalen.",
"delete": "Slett en sak, dette oppretter en utskrift når det er aktivert.",
"reopen": "Gjenåpne en sak, dette aktiverer skriving i kanalen igjen.",
"pin": "Fest en sak. Dette flytter saken til toppen og legger til en '📌' emoji i navnet.",
"unpin": "Løsne en sak. Saken blir værende på plass, men mister '📌' emojien.",
"move": "Flytt en sak. Dette endrer typen på saken.",
"rename": "Omdøp en sak. Dette endrer kanalnavnet på saken.",
"claim": "Ta en sak. Dette lar teamet ditt vite at du håndterer saken.",
"unclaim": "Frigi en sak. Dette lar teamet ditt vite at saken er ledig igjen.",
"add": "Legg til en bruker i en sak. Dette gir brukeren tilgang til å lese og skrive i saken.",
"remove": "Fjern en bruker fra en sak. Dette fjerner brukerens tilgang til å lese og skrive i saken.",
"panel": "Opprett en melding med en nedtrekksmeny eller knapper (for sakopprettelse).",
"blacklistView": "Vis en liste over gjeldende svarteliste.",
"blacklistAdd": "Legg til en bruker på svartelisten.",
"blacklistRemove": "Fjern en bruker fra svartelisten.",
"blacklistGet": "Hent detaljer om en svartelistet bruker.",
"statsGlobal": "Vis global statistikk.",
"statsTicket": "Vis statistikk for en sak på serveren.",
"statsUser": "Vis statistikk fra en bruker på serveren.",
"statsReset": "Tilbakestill all statistikk for boten (og start tellingen fra null).",
"autocloseDisable": "Deaktiver autolukking i denne saken.",
"autocloseEnable": "Aktiver autolukking i denne saken.",
"autodeleteDisable": "Deaktiver autosletting i denne saken.",
"autodeleteEnable": "Aktiver autosletting i denne saken."
},
"stats": {
"scopes": {
"global": "Global Statistikk",
"system": "Systemstatistikk",
"user": "Brukerstatistikk",
"ticket": "Saksstatistikk",
"participants": "Deltakere"
},
"properties": {
"ticketsCreated": "Saker Opprettet",
"ticketsClosed": "Saker Lukket",
"ticketsDeleted": "Saker Slettet",
"ticketsReopened": "Saker Gjenåpnet",
"ticketsAutoclosed": "Saker Autolukket",
"ticketsClaimed": "Saker Tatt",
"ticketsPinned": "Saker Festet",
"ticketsMoved": "Saker Flyttet",
"usersBlacklisted": "Brukere Svartelistet",
"transcriptsCreated": "Utskrifter Opprettet"
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["DanoGlez"], "translators":["DanoGlez"],
"lastedited":"28/01/2025", "lastedited":"28/01/2025",
"language":"Polish", "language":"Polish",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["quiradon"], "translators":["quiradon"],
"lastedited":"20/08/2024", "lastedited":"20/08/2024",
"language":"Portuguese", "language":"Portuguese",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["SankeDev"], "translators":["SankeDev"],
"lastedited":"27/08/2024", "lastedited":"27/08/2024",
"language":"Romanian", "language":"Romanian",
+465
View File
@@ -0,0 +1,465 @@
{
"_TRANSLATION": {
"otversion": "v4.0.1",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Russian",
"automated": true
},
"checker": {
"system": {
"typeError": "[ОШИБКА]",
"headerOpenTicket": "ОТКРЫТЬ ТИКЕТ",
"typeWarning": "[ПРЕДУПРЕЖДЕНИЕ]",
"typeInfo": "[ИНФОРМАЦИЯ]",
"headerConfigChecker": "ПРОВЕРКА КОНФИГУРАЦИИ",
"headerDescription": "проверьте наличие ошибок в ваших конфигурационных файлах!",
"footerError": "бот не запустится, пока все {0} не будут исправлены!",
"footerWarning": "рекомендуется исправить все {0} перед запуском!",
"footerSupport": "ПОДДЕРЖКА: {0} - ДОКУМЕНТАЦИЯ: {1}",
"compactInformation": "используйте {0} для получения дополнительной информации!",
"dataPath": "путь",
"dataDocs": "документация",
"dataMessages": "сообщение"
},
"messages": {
"stringTooShort": "Эта строка не может быть короче {0} символов!",
"stringTooLong": "Эта строка не может быть длиннее {0} символов!",
"stringLengthInvalid": "Эта строка должна быть длиной {0} символов!",
"stringStartsWith": "Эта строка должна начинаться с {0}!",
"stringEndsWith": "Эта строка должна заканчиваться на {0}!",
"stringContains": "Эта строка должна содержать {0}!",
"stringChoices": "Эта строка может быть только одним из следующих значений: {0}!",
"stringRegex": "Эта строка недействительна!",
"numberTooShort": "Это число не может быть короче {0} символов!",
"numberTooLong": "Это число не может быть длиннее {0} символов!",
"numberLengthInvalid": "Это число должно быть длиной {0} символов!",
"numberTooSmall": "Это число должно быть не менее {0}!",
"numberTooLarge": "Это число должно быть не более {0}!",
"numberNotEqual": "Это число должно быть {0}!",
"numberStep": "Это число должно быть кратным {0}!",
"numberStepOffset": "Это число должно быть кратным {0}, начиная с {1}!",
"numberStartsWith": "Это число должно начинаться с {0}!",
"numberEndsWith": "Это число должно заканчиваться на {0}!",
"numberContains": "Это число должно содержать {0}!",
"numberChoices": "Это число может быть только одним из следующих значений: {0}!",
"numberFloat": "Это число не может быть десятичным!",
"numberNegative": "Это число не может быть отрицательным!",
"numberPositive": "Это число не может быть положительным!",
"numberZero": "Это число не может быть нулем!",
"booleanTrue": "Это булево значение не может быть истинным!",
"booleanFalse": "Это булево значение не может быть ложным!",
"arrayEmptyDisabled": "Этот массив не может быть пустым!",
"arrayEmptyRequired": "Этот массив должен быть пустым!",
"arrayTooShort": "Этот массив должен иметь длину не менее {0}!",
"arrayTooLong": "Этот массив должен иметь длину не более {0}!",
"arrayLengthInvalid": "Этот массив должен иметь длину {0}!",
"arrayInvalidTypes": "Этот массив может содержать только следующие типы: {0}!",
"arrayDouble": "Этот массив не допускает повторяющихся значений!",
"discordInvalidId": "Это недействительный идентификатор {0} в Discord!",
"discordInvalidIdOptions": "Это недействительный идентификатор {0} в Discord! Вы также можете использовать один из следующих: {1}!",
"discordInvalidToken": "Это недействительный токен Discord (синтаксически)!",
"colorInvalid": "Это недействительный шестнадцатеричный цвет!",
"emojiTooShort": "Эта строка должна содержать не менее {0} эмодзи!",
"emojiTooLong": "Эта строка должна содержать не более {0} эмодзи!",
"emojiCustom": "Этот эмодзи не может быть пользовательским эмодзи Discord!",
"emojiInvalid": "Это недействительный эмодзи!",
"urlInvalid": "Этот URL недействителен!",
"urlInvalidHttp": "Этот URL может использовать только протокол https://!",
"urlInvalidProtocol": "Этот URL может использовать только протоколы http:// и https://!",
"urlInvalidHostname": "Этот URL имеет недопустимое имя хоста!",
"urlInvalidExtension": "Этот URL имеет недействительное расширение! Выберите из: {0}!",
"urlInvalidPath": "Этот URL имеет недействительный путь!",
"idNotUnique": "Этот идентификатор не уникален, используйте другой идентификатор!",
"idNonExistent": "Идентификатор {0} не существует!",
"invalidType": "Это свойство должно быть типа: {0}!",
"propertyMissing": "Свойство {0} отсутствует в этом объекте!",
"propertyOptional": "Свойство {0} необязательно в этом объекте!",
"objectDisabled": "Этот объект отключен, включите его с помощью {0}!",
"nullInvalid": "Это свойство не может быть null!",
"switchInvalidType": "Это должно быть одним из следующих типов: {0}!",
"objectSwitchInvalid": "Этот объект должен быть одним из следующих типов: {0}!",
"invalidLanguage": "Это недействительный язык!",
"invalidButton": "Эта кнопка должна иметь хотя бы {0} или {1}!",
"unusedOption": "Опция {0} нигде не используется!",
"unusedQuestion": "Вопрос {0} нигде не используется!",
"dropdownOption": "Панель с включенным выпадающим списком может содержать только опции типа 'ticket'!"
}
},
"actions": {
"buttons": {
"create": "Посетить тикет",
"close": "Закрыть тикет",
"delete": "Удалить тикет",
"reopen": "Переоткрыть тикет",
"claim": "Забрать тикет",
"unclaim": "Отказаться от тикета",
"pin": "Закрепить тикет",
"unpin": "Открепить тикет",
"clear": "Удалить тикеты",
"helpSwitchSlash": "Просмотреть слэш-команды",
"helpSwitchText": "Просмотреть текстовые команды",
"helpPage": "Страница {0}",
"withReason": "С причиной",
"withoutTranscript": "Без стенограммы"
},
"titles": {
"created": "Тикет создан",
"close": "Тикет закрыт",
"delete": "Тикет удален",
"reopen": "Тикет переоткрыт",
"claim": "Тикет забран",
"unclaim": "Тикет освобожден",
"pin": "Тикет закреплен",
"unpin": "Тикет откреплен",
"rename": "Тикет переименован",
"move": "Тикет перемещен",
"add": "Пользователь добавлен в тикет",
"remove": "Пользователь удален из тикета",
"help": "Доступные команды",
"statsReset": "Сбросить статистику",
"blacklistAdd": "Пользователь в черном списке",
"blacklistRemove": "Пользователь освобожден",
"blacklistGet": "Пользователь в черном списке",
"blacklistView": "Текущий черный список",
"blacklistAddDm": "Добавлен в черный список",
"blacklistRemoveDm": "Удален из черного списка",
"clear": "Тикеты очищены",
"roles": "Роли обновлены",
"autoclose": "Тикет автоматически закрыт",
"autocloseEnabled": "Автозакрытие включено",
"autocloseDisabled": "Автозакрытие отключено",
"autodelete": "Тикет автоматически удален",
"autodeleteEnabled": "Автоудаление включено",
"autodeleteDisabled": "Автоудаление отключено"
},
"descriptions": {
"create": "Ваш тикет был создан. Нажмите кнопку ниже, чтобы получить к нему доступ!",
"close": "Тикет был успешно закрыт!",
"delete": "Тикет был успешно удален!",
"reopen": "Тикет был успешно переоткрыт!",
"claim": "Тикет был успешно забран!",
"unclaim": "Тикет был успешно освобожден!",
"pin": "Тикет был успешно закреплен!",
"unpin": "Тикет был успешно откреплен!",
"rename": "Тикет был успешно переименован в {0}!",
"move": "Тикет был успешно перемещен в {0}!",
"add": "{0} был успешно добавлен в тикет!",
"remove": "{0} был успешно удален из тикета!",
"helpExplanation": "`<name>` => обязательный параметр\n`[name]` => необязательный параметр",
"statsReset": "Статистика бота была успешно сброшена!",
"statsError": "Невозможно просмотреть статистику тикета!\n{0} не является тикетом!",
"blacklistAdd": "{0} был успешно добавлен в черный список!",
"blacklistRemove": "{0} был успешно удален из черного списка!",
"blacklistGetSuccess": "{0} в настоящее время в черном списке!",
"blacklistGetEmpty": "{0} в настоящее время не в черном списке!",
"blacklistViewEmpty": "Никто еще не был добавлен в черный список!",
"blacklistViewTip": "Используйте \"/blacklist add\", чтобы добавить пользователя в черный список!",
"clearVerify": "Вы уверены, что хотите удалить несколько тикетов?\nЭто действие не может быть отменено!",
"clearReady": "{0} тикетов были успешно удалены!",
"rolesEmpty": "Ни одна роль не была обновлена!",
"autocloseLeave": "Этот тикет был автоматически закрыт, потому что создатель покинул сервер!",
"autocloseTimeout": "Этот тикет был автоматически закрыт, потому что он был неактивен более `{0}ч`!",
"autodeleteLeave": "Этот тикет был автоматически удален, потому что создатель покинул сервер!",
"autodeleteTimeout": "Этот тикет был автоматически удален, потому что он был неактивен более `{0} дней`!",
"autocloseEnabled": "Автозакрытие было включено для этого тикета!\nОн будет закрыт, если будет неактивен более `{0}ч`!",
"autocloseDisabled": "Автозакрытие было отключено для этого тикета!\nОн больше не будет закрываться автоматически!",
"autodeleteEnabled": "Автоудаление было включено для этого тикета!\nОн будет удален, если будет неактивен более `{0} дней`!",
"autodeleteDisabled": "Автоудаление было отключено для этого тикета!\nОн больше не будет удаляться автоматически!",
"ticketMessageLimit": "Вы можете создать только {0} тикет(ов) одновременно!",
"ticketMessageAutoclose": "Этот тикет будет автоматически закрыт, если будет неактивен {0}ч!",
"ticketMessageAutodelete": "Этот тикет будет автоматически удален, если будет неактивен {0} дней!",
"panelReady": "Вы можете найти панель ниже!\nЭто сообщение теперь можно удалить!"
},
"modal": {
"closePlaceholder": "Почему вы закрыли этот тикет?",
"deletePlaceholder": "Почему вы удалили этот тикет?",
"reopenPlaceholder": "Почему вы переоткрыли этот тикет?",
"claimPlaceholder": "Почему вы забрали этот тикет?",
"unclaimPlaceholder": "Почему вы отказались от этого тикета?",
"pinPlaceholder": "Почему вы закрепили этот тикет?",
"unpinPlaceholder": "Почему вы открепили этот тикет?"
},
"logs": {
"createLog": "Новый тикет был создан {0}!",
"closeLog": "Этот тикет был закрыт {0}!",
"closeDm": "Ваш тикет был закрыт на нашем сервере!",
"deleteLog": "Этот тикет был удален {0}!",
"deleteDm": "Ваш тикет был удален на нашем сервере!",
"reopenLog": "Этот тикет был переоткрыт {0}!",
"reopenDm": "Ваш тикет был переоткрыт на нашем сервере!",
"claimLog": "Этот тикет был забран {0}!",
"claimDm": "Ваш тикет был забран на нашем сервере!",
"unclaimLog": "Этот тикет был освобожден {0}!",
"unclaimDm": "Ваш тикет был освобожден на нашем сервере!",
"pinLog": "Этот тикет был закреплен {0}!",
"pinDm": "Ваш тикет был закреплен на нашем сервере!",
"unpinLog": "Этот тикет был откреплен {0}!",
"unpinDm": "Ваш тикет был откреплен на нашем сервере!",
"renameLog": "Этот тикет был переименован в {0} пользователем {1}!",
"renameDm": "Ваш тикет был переименован в {0} на нашем сервере!",
"moveLog": "Этот тикет был перемещен в {0} пользователем {1}!",
"moveDm": "Ваш тикет был перемещен в {0} на нашем сервере!",
"addLog": "{0} был добавлен в этот тикет пользователем {1}!",
"addDm": "{0} был добавлен в ваш тикет на нашем сервере!",
"removeLog": "{0} был удален из этого тикета пользователем {1}!",
"removeDm": "{0} был удален из вашего тикета на нашем сервере!",
"blacklistAddLog": "{0} был добавлен в черный список {1}!",
"blacklistRemoveLog": "{0} был удален из черного списка {1}!",
"blacklistAddDm": "Вы были добавлены в черный список на нашем сервере!\nОтныне вы не можете создавать тикеты!",
"blacklistRemoveDm": "Вы были удалены из черного списка на нашем сервере!\nТеперь вы снова можете создавать тикеты!",
"clearLog": "{0} тикетов были удалены {1}!"
}
},
"transcripts": {
"success": {
"visit": "Посетить стенограмму",
"ready": "Стенограмма создана",
"textFileDescription": "Это текстовая стенограмма удаленного тикета!",
"htmlProgress": "Пожалуйста, подождите, пока эта html-стенограмма обрабатывается...",
"createdChannel": "Новая {0} стенограмма была создана на сервере!",
"createdCreator": "Новая {0} стенограмма была создана для одного из ваших тикетов!",
"createdParticipant": "Новая {0} стенограмма была создана в одном из тикетов, в котором вы участвовали!",
"createdActiveAdmin": "Новая {0} стенограмма была создана в одном из тикетов, в котором вы участвовали как администратор!",
"createdEveryAdmin": "Новая {0} стенограмма была создана в одном из тикетов, в котором вы были администратором!",
"createdOther": "Новая {0} стенограмма была создана!"
},
"errors": {
"retry": "Повторить",
"continue": "Удалить без стенограммы",
"backup": "Создать резервную стенограмму",
"error": "Что-то пошло не так при попытке создать стенограмму.\nЧто вы хотите сделать?\n\nЭтот тикет не будет удален, пока вы не нажмете одну из этих кнопок."
}
},
"errors": {
"titles": {
"internalError": "Внутренняя ошибка",
"optionMissing": "Отсутствует опция команды",
"optionInvalid": "Недействительная опция команды",
"unknownCommand": "Неизвестная команда",
"noPermissions": "Нет разрешений",
"unknownTicket": "Неизвестный тикет",
"deprecatedTicket": "Устаревший тикет",
"unknownOption": "Неизвестная опция",
"unknownPanel": "Неизвестная панель",
"notInGuild": "Не на сервере",
"channelRename": "Невозможно переименовать канал",
"busy": "Тикет занят"
},
"descriptions": {
"askForInfo": "Свяжитесь с владельцем этого бота для получения дополнительной информации!",
"askForInfoResolve": "Свяжитесь с владельцем бота, если эта проблема не решится после нескольких попыток.",
"internalError": "Не удалось ответить на это {0} из-за внутренней ошибки!",
"optionMissing": "В этой команде отсутствует обязательный параметр!",
"optionInvalid": "Параметр в этой команде недействителен!",
"optionInvalidChoose": "Выберите из",
"unknownCommand": "Попробуйте посетить меню помощи для получения дополнительной информации!",
"noPermissions": "Вам не разрешено использовать это {0}!",
"noPermissionsList": "Требуемые разрешения: (одно из них)",
"noPermissionsCooldown": "Вам не разрешено использовать это {0}, потому что у вас есть перезарядка!",
"noPermissionsBlacklist": "Вам не разрешено использовать это {0}, потому что вы были добавлены в черный список!",
"noPermissionsLimitGlobal": "Вам не разрешено создавать тикет, потому что сервер достиг максимального предела тикетов!",
"noPermissionsLimitGlobalUser": "Вам не разрешено создавать тикет, потому что вы достигли максимального предела тикетов!",
"noPermissionsLimitOption": "Вам не разрешено создавать тикет, потому что сервер достиг максимального предела тикетов для этой опции!",
"noPermissionsLimitOptionUser": "Вам не разрешено создавать тикет, потому что вы достигли максимального предела тикетов для этой опции!",
"unknownTicket": "Попробуйте эту команду еще раз в действительном тикете!",
"deprecatedTicket": "Текущий канал не является действительным тикетом! Возможно, это был тикет из старой версии Open Ticket!",
"notInGuild": "Это {0} не работает в ЛС! Пожалуйста, попробуйте еще раз на сервере!",
"channelRename": "Из-за ограничений Discord на частоту запросов, боту сейчас невозможно переименовать канал. Канал будет автоматически переименован через 10 минут, если бот не будет перезагружен.",
"channelRenameSource": "Источник этой ошибки: {0}",
"busy": "Невозможно использовать это {0}!\nТикет в настоящее время обрабатывается ботом.\n\nПожалуйста, попробуйте еще раз через несколько секунд!"
},
"optionInvalidReasons": {
"stringRegex": "Значение не соответствует шаблону!",
"stringMinLength": "Значение должно быть не менее {0} символов!",
"stringMaxLength": "Значение должно быть не более {0} символов!",
"numberInvalid": "Недействительное число!",
"numberMin": "Число должно быть не менее {0}!",
"numberMax": "Число должно быть не более {0}!",
"numberDecimal": "Число не может быть десятичным!",
"numberNegative": "Число не может быть отрицательным!",
"numberPositive": "Число не может быть положительным!",
"numberZero": "Число не может быть нулем!",
"channelNotFound": "Невозможно найти канал!",
"userNotFound": "Невозможно найти пользователя!",
"roleNotFound": "Невозможно найти роль!",
"memberNotFound": "Невозможно найти пользователя!",
"mentionableNotFound": "Невозможно найти пользователя или роль!",
"channelType": "Недействительный тип канала!",
"notInGuild": "Для этой опции вам нужно быть на сервере!"
},
"permissions": {
"developer": "Вы должны быть разработчиком бота.",
"owner": "Вы должны быть владельцем сервера.",
"admin": "Вы должны быть администратором сервера.",
"moderator": "Вы должны быть модератором.",
"support": "Вы должны быть в команде поддержки.",
"member": "Вы должны быть участником.",
"discord-administrator": "У вас должно быть разрешение `ADMINISTRATOR`."
},
"actionInvalid": {
"close": "Тикет уже закрыт!",
"reopen": "Тикет еще не закрыт!",
"claim": "Тикет уже забран!",
"unclaim": "Тикет еще не забран!",
"pin": "Тикет уже закреплен!",
"unpin": "Тикет еще не закреплен!",
"add": "Этот пользователь уже имеет доступ к тикету!",
"remove": "Невозможно удалить этого пользователя из тикета!"
}
},
"params": {
"uppercase": {
"ticket": "Тикет",
"tickets": "Тикеты",
"reason": "Причина",
"creator": "Создатель",
"remaining": "Оставшееся время",
"added": "Добавлен",
"removed": "Удален",
"filter": "Фильтр",
"claimedBy": "Забран {0}",
"method": "Метод",
"type": "Тип",
"blacklisted": "В черном списке",
"panel": "Панель",
"command": "Команда",
"system": "Система",
"true": "Истина",
"false": "Ложь",
"syntax": "Синтаксис",
"originalName": "Исходное имя",
"newName": "Новое имя",
"until": "До",
"validOptions": "Действительные опции",
"validPanels": "Действительные панели",
"autoclose": "Автозакрытие",
"autodelete": "Автоудаление",
"startupDate": "Дата запуска",
"version": "Версия",
"name": "Имя",
"role": "Роль",
"status": "Статус",
"claimed": "Забран",
"pinned": "Закреплен",
"creationDate": "Дата создания"
},
"lowercase": {
"text": "текст",
"html": "html",
"command": "команда",
"modal": "модальное окно",
"button": "кнопка",
"dropdown": "выпадающий список",
"method": "метод"
}
},
"commands": {
"reason": "Укажите необязательную причину, которая будет видна в журналах.",
"help": "Получите список всех доступных команд.",
"panel": "Создайте сообщение с выпадающим списком или кнопками (для создания тикета).",
"panelId": "Идентификатор панели, которую вы хотите создать.",
"panelAutoUpdate": "Хотите ли вы, чтобы эта панель автоматически обновлялась при редактировании?",
"ticket": "Мгновенно создать тикет.",
"ticketId": "Идентификатор тикета, который вы хотите создать.",
"close": "Закрыть тикет.",
"delete": "Удалить тикет.",
"deleteNoTranscript": "Удалить этот тикет без создания стенограммы.",
"reopen": "Переоткрыть тикет.",
"claim": "Забрать тикет.",
"claimUser": "Забрать этот тикет для кого-то другого, а не для себя.",
"unclaim": "Отказаться от тикета.",
"pin": "Закрепить тикет.",
"unpin": "Открепить тикет.",
"move": "Переместить тикет.",
"moveId": "Идентификатор опции, в которую вы хотите переместить.",
"rename": "Переименовать тикет.",
"renameName": "Новое имя для этого тикета.",
"add": "Добавить пользователя в тикет.",
"addUser": "Пользователь, которого нужно добавить.",
"remove": "Удалить пользователя из тикета.",
"removeUser": "Пользователь, которого нужно удалить.",
"blacklist": "Управление черным списком тикетов.",
"blacklistView": "Просмотреть список текущего черного списка.",
"blacklistAdd": "Добавить пользователя в черный список.",
"blacklistRemove": "Удалить пользователя из черного списка.",
"blacklistGet": "Получить подробности о пользователе в черном списке.",
"blacklistGetUser": "Пользователь, о котором нужно получить подробности.",
"stats": "Просмотреть статистику бота, участника или тикета.",
"statsReset": "Сбросить всю статистику бота (и начать отсчет с нуля).",
"statsGlobal": "Просмотреть глобальную статистику.",
"statsUser": "Просмотреть статистику пользователя на сервере.",
"statsUserUser": "Пользователь для просмотра.",
"statsTicket": "Просмотреть статистику тикета на сервере.",
"statsTicketTicket": "Тикет для просмотра.",
"clear": "Удалить несколько тикетов одновременно.",
"clearFilter": "Фильтр для очистки тикетов.",
"clearFilters": {
"all": "Все",
"open": "Открытые",
"close": "Закрытые",
"claim": "Забранные",
"unclaim": "Не забранные",
"pin": "Закрепленные",
"unpin": "Не закрепленные",
"autoclose": "Автоматически закрытые"
},
"autoclose": "Управление автозакрытием в тикете.",
"autocloseDisable": "Отключить автозакрытие в этом тикете.",
"autocloseEnable": "Включить автозакрытие в этом тикете.",
"autocloseEnableTime": "Количество часов, в течение которых тикет должен быть неактивен, чтобы закрыть его.",
"autodelete": "Управление автоудалением в тикете.",
"autodeleteDisable": "Отключить автоудаление в этом тикете.",
"autodeleteEnable": "Включить автоудаление в этом тикете.",
"autodeleteEnableTime": "Количество дней, в течение которых тикет должен быть неактивен, чтобы удалить его."
},
"helpMenu": {
"help": "Получите список всех доступных команд.",
"ticket": "Мгновенно создать тикет.",
"close": "Закрыть тикет, это отключает запись в этом канале.",
"delete": "Удалить тикет, это создает стенограмму, если включено.",
"reopen": "Переоткрыть тикет, это снова включает запись в этом канале.",
"pin": "Закрепить тикет. Это переместит тикет наверх и добавит к имени эмодзи '📌'.",
"unpin": "Открепить тикет. Тикет останется на своем месте, но потеряет эмодзи '📌'.",
"move": "Переместить тикет. Это изменит тип этого тикета.",
"rename": "Переименовать тикет. Это изменит имя канала этого тикета.",
"claim": "Забрать тикет. С помощью этого вы можете сообщить своей команде, что вы обрабатываете этот тикет.",
"unclaim": "Отказаться от тикета. С помощью этого вы можете сообщить своей команде, что этот тикет снова свободен.",
"add": "Добавить пользователя в тикет. Это позволит пользователю читать и писать в этом тикете.",
"remove": "Удалить пользователя из тикета. Это удалит возможность читать и писать для пользователя в этом тикете.",
"panel": "Создайте сообщение с выпадающим списком или кнопками (для создания тикета).",
"blacklistView": "Просмотреть список текущего черного списка.",
"blacklistAdd": "Добавить пользователя в черный список.",
"blacklistRemove": "Удалить пользователя из черного списка.",
"blacklistGet": "Получить подробности о пользователе в черном списке.",
"statsGlobal": "Просмотреть глобальную статистику.",
"statsTicket": "Просмотреть статистику тикета на сервере.",
"statsUser": "Просмотреть статистику пользователя на сервере.",
"statsReset": "Сбросить всю статистику бота (и начать отсчет с нуля).",
"autocloseDisable": "Отключить автозакрытие в этом тикете.",
"autocloseEnable": "Включить автозакрытие в этом тикете.",
"autodeleteDisable": "Отключить автоудаление в этом тикете.",
"autodeleteEnable": "Включить автоудаление в этом тикете."
},
"stats": {
"scopes": {
"global": "Глобальная статистика",
"system": "Статистика системы",
"user": "Статистика пользователя",
"ticket": "Статистика тикета",
"participants": "Участники"
},
"properties": {
"ticketsCreated": "Тикеты созданы",
"ticketsClosed": "Тикеты закрыты",
"ticketsDeleted": "Тикеты удалены",
"ticketsReopened": "Тикеты переоткрыты",
"ticketsAutoclosed": "Тикеты автоматически закрыты",
"ticketsClaimed": "Тикеты забраны",
"ticketsPinned": "Тикеты закреплены",
"ticketsMoved": "Тикеты перемещены",
"usersBlacklisted": "Пользователи в черном списке",
"transcriptsCreated": "Стенограммы созданы"
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["Redactado","Josuens"], "translators":["Redactado","Josuens"],
"lastedited":"22/08/2024", "lastedited":"22/08/2024",
"language":"Spanish", "language":"Spanish",
+478
View File
@@ -0,0 +1,478 @@
{
"_TRANSLATION": {
"otversion": "v4.0.1",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Svenska",
"automated": false
},
"checker": {
"system": {
"typeError": "[FEL]",
"headerOpenTicket":"OPEN TICKET",
"typeWarning": "[VARNING]",
"typeInfo": "[INFO]",
"headerConfigChecker": "KONFIGURATIONSKONTROLL",
"headerDescription": "kontrollera efter fel i din konfiguration!",
"footerError": "botten startar inte förrän alla {0} är fixade!",
"footerWarning": "det rekommenderas att fixa alla {0} före start!",
"footerSupport": "SUPPORT: {0} - DOKUMENTATION: {1}",
"compactInformation": "använd {0} för mer information!",
"dataPath": "sökväg",
"dataDocs": "dokumentation",
"dataMessages": "meddelande"
},
"messages": {
"stringTooShort": "Denna sträng kan inte vara kortare än {0} tecken!",
"stringTooLong": "Denna sträng kan inte vara längre än {0} tecken!",
"stringLengthInvalid": "Denna sträng ska vara {0} tecken lång!",
"stringStartsWith": "Denna sträng ska börja med {0}!",
"stringEndsWith": "Denna sträng ska sluta med {0}!",
"stringContains": "Denna sträng ska innehålla {0}!",
"stringChoices": "Denna sträng kan endast vara en av följande värden: {0}!",
"stringRegex": "Denna sträng är ogiltig!",
"numberTooShort": "Detta tal kan inte vara kortare än {0} tecken!",
"numberTooLong": "Detta tal kan inte vara längre än {0} tecken!",
"numberLengthInvalid": "Detta tal ska vara {0} tecken långt!",
"numberTooSmall": "Detta tal ska vara minst {0}!",
"numberTooLarge": "Detta tal ska vara högst {0}!",
"numberNotEqual": "Detta tal ska vara {0}!",
"numberStep": "Detta tal ska vara en multipel av {0}!",
"numberStepOffset": "Detta tal ska vara en multipel av {0}, med start från {1}!",
"numberStartsWith": "Detta tal ska börja med {0}!",
"numberEndsWith": "Detta tal ska sluta med {0}!",
"numberContains": "Detta tal ska innehålla {0}!",
"numberChoices": "Detta tal kan endast vara en av följande värden: {0}!",
"numberFloat": "Detta tal kan inte vara ett decimaltal!",
"numberNegative": "Detta tal kan inte vara negativt!",
"numberPositive": "Detta tal kan inte vara positivt!",
"numberZero": "Detta tal kan inte vara noll!",
"booleanTrue": "Detta booleska värde kan inte vara sant!",
"booleanFalse": "Detta booleska värde kan inte vara falskt!",
"arrayEmptyDisabled": "Denna lista kan inte vara tom!",
"arrayEmptyRequired": "Denna lista ska vara tom!",
"arrayTooShort": "Denna lista ska ha en längd på minst {0}!",
"arrayTooLong": "Denna lista ska ha en längd på högst {0}!",
"arrayLengthInvalid": "Denna lista ska ha en längd på {0}!",
"arrayInvalidTypes": "Denna lista kan endast innehålla följande typer: {0}!",
"arrayDouble": "Denna lista tillåter inte samma värde två gånger!",
"discordInvalidId": "Detta är en ogiltig Discord {0} ID!",
"discordInvalidIdOptions": "Detta är en ogiltig Discord {0} ID! Du kan också använda en av dessa: {1}!",
"discordInvalidToken": "Detta är en ogiltig Discord-token (syntaktiskt)!",
"colorInvalid": "Detta är en ogiltig hexadecimal färg!",
"emojiTooShort": "Denna sträng ska ha minst {0} emojis!",
"emojiTooLong": "Denna sträng ska ha högst {0} emojis!",
"emojiCustom": "Denna emoji kan inte vara en anpassad Discord-emoji!",
"emojiInvalid": "Detta är en ogiltig emoji!",
"urlInvalid": "Denna URL är ogiltig!",
"urlInvalidHttp": "Denna URL kan endast använda https://-protokollet!",
"urlInvalidProtocol": "Denna URL kan endast använda http://- och https://-protokollen!",
"urlInvalidHostname": "Denna URL har ett otillåtet värdnamn!",
"urlInvalidExtension": "Denna URL har en ogiltig filtyp! Välj mellan: {0}!",
"urlInvalidPath": "Denna URL har en ogiltig sökväg!",
"idNotUnique": "Detta ID är inte unikt, använd ett annat ID istället!",
"idNonExistent": "ID {0} existerar inte!",
"invalidType": "Denna egenskap ska vara av typen: {0}!",
"propertyMissing": "Egenskapen {0} saknas i detta objekt!",
"propertyOptional": "Egenskapen {0} är valfri i detta objekt!",
"objectDisabled": "Detta objekt är inaktiverat, aktivera det genom att använda {0}!",
"nullInvalid": "Denna egenskap kan inte vara null!",
"switchInvalidType": "Detta ska vara en av följande typer: {0}!",
"objectSwitchInvalid": "Detta objekt ska vara en av följande typer: {0}!",
"invalidLanguage": "Detta är ett ogiltigt språk!",
"invalidButton": "Denna knapp ska ha minst en {0} eller {1}!",
"unusedOption": "Alternativet {0} används inte någonstans!",
"unusedQuestion": "Frågan {0} används inte någonstans!",
"dropdownOption": "Ett panel med dropdown aktiverad kan endast innehålla alternativ av typen 'ärende'!"
}
},
"actions": {
"buttons": {
"create": "Skapa Ärende",
"close": "Stäng Ärende",
"delete": "Radera Ärende",
"reopen": "Återöppna Ärende",
"claim": "Ta Ärende",
"unclaim": "Frigör Ärende",
"pin": "Fäst Ärende",
"unpin": "Lossa Ärende",
"clear": "Radera Ärenden",
"helpSwitchSlash": "Visa Slash-kommandon",
"helpSwitchText": "Visa Textkommandon",
"helpPage": "Sida {0}",
"withReason": "Med Orsak",
"withoutTranscript": "Utan Utskrift"
},
"titles": {
"created": "Ärende Skapat",
"close": "Ärende Stängt",
"delete": "Ärende Raderat",
"reopen": "Ärende Återöppnat",
"claim": "Ärende Taget",
"unclaim": "Ärende Frigjort",
"pin": "Ärende Fäst",
"unpin": "Ärende Lossat",
"rename": "Ärende Omdöpt",
"move": "Ärende Flyttat",
"add": "Användare Tillagd i Ärende",
"remove": "Användare Borttagen Från Ärende",
"help": "Tillgängliga Kommandon",
"statsReset": "Återställ Statistik",
"blacklistAdd": "Användare Svartlistad",
"blacklistRemove": "Användare Borttagen Från Svartlista",
"blacklistGet": "Svartlistad Användare",
"blacklistView": "Nuvarande Svartlista",
"blacklistAddDm": "Tillagd i Svartlista",
"blacklistRemoveDm": "Borttagen Från Svartlista",
"clear": "Ärenden Raderade",
"roles": "Roller Uppdaterade",
"autoclose": "Ärende Autostängt",
"autocloseEnabled": "Autostängning Aktiverad",
"autocloseDisabled": "Autostängning Inaktiverad",
"autodelete": "Ärende Autoraderat",
"autodeleteEnabled": "Autoradering Aktiverad",
"autodeleteDisabled": "Autoradering Inaktiverad"
},
"descriptions": {
"create": "Ditt ärende har skapats. Klicka på knappen nedan för att få tillgång till det!",
"close": "Ärendet har stängts framgångsrikt!",
"delete": "Ärendet har raderats framgångsrikt!",
"reopen": "Ärendet har återöppnats framgångsrikt!",
"claim": "Ärendet har tagits framgångsrikt!",
"unclaim": "Ärendet har frigjorts framgångsrikt!",
"pin": "Ärendet har fästs framgångsrikt!",
"unpin": "Ärendet har lossats framgångsrikt!",
"rename": "Ärendet har döpts om till {0} framgångsrikt!",
"move": "Ärendet har flyttats till {0} framgångsrikt!",
"add": "{0} har lagts till i ärendet framgångsrikt!",
"remove": "{0} har tagits bort från ärendet framgångsrikt!",
"helpExplanation": "`<namn>` => obligatorisk parameter\n`[namn]` => valfri parameter",
"statsReset": "Bottens statistik har återställts framgångsrikt!",
"statsError": "Kan inte visa ärendestatistik!\n{0} är inte ett ärende!",
"blacklistAdd": "{0} har svartlistats framgångsrikt!",
"blacklistRemove": "{0} har tagits bort från svartlistan framgångsrikt!",
"blacklistGetSuccess": "{0} är för närvarande svartlistad!",
"blacklistGetEmpty": "{0} är för närvarande inte svartlistad!",
"blacklistViewEmpty": "Ingen är svartlistad ännu!",
"blacklistViewTip": "Använd \"/blacklist add\" för att svartlista en användare!",
"clearVerify": "Är du säker på att du vill radera flera ärenden?\nDenna åtgärd kan inte ångras!",
"clearReady": "{0} ärenden har raderats framgångsrikt!",
"rolesEmpty": "Inga roller har uppdaterats!",
"autocloseLeave": "Detta ärende har autostängts eftersom skaparen lämnade servern!",
"autocloseTimeout": "Detta ärende har autostängts eftersom det har varit inaktivt i mer än `{0}t`!",
"autodeleteLeave": "Detta ärende har autoraderats eftersom skaparen lämnade servern!",
"autodeleteTimeout": "Detta ärende har autoraderats eftersom det har varit inaktivt i mer än `{0} dagar`!",
"autocloseEnabled": "Autostängning har aktiverats i detta ärende!\nDet kommer att stängas när det är inaktivt i mer än `{0}t`!",
"autocloseDisabled": "Autostängning har inaktiverats i detta ärende!\nDet kommer inte längre att stängas automatiskt!",
"autodeleteEnabled": "Autoradering har aktiverats i detta ärende!\nDet kommer att raderas när det är inaktivt i mer än `{0} dagar`!",
"autodeleteDisabled": "Autoradering har inaktiverats i detta ärende!\nDet kommer inte längre att raderas automatiskt!",
"ticketMessageLimit": "Du kan endast skapa {0} ärende(n) åt gången!",
"ticketMessageAutoclose": "Detta ärende kommer att autostängas när det är inaktivt i {0}t!",
"ticketMessageAutodelete": "Detta ärende kommer att autoraderas när det är inaktivt i {0} dagar!",
"panelReady": "Du hittar panelen nedan!\nDetta meddelande kan nu raderas!"
},
"modal": {
"closePlaceholder": "Varför stängde du detta ärende?",
"deletePlaceholder": "Varför raderade du detta ärende?",
"reopenPlaceholder": "Varför återöppnade du detta ärende?",
"claimPlaceholder": "Varför tog du detta ärende?",
"unclaimPlaceholder": "Varför frigjorde du detta ärende?",
"pinPlaceholder": "Varför fäste du detta ärende?",
"unpinPlaceholder": "Varför lossade du detta ärende?"
},
"logs": {
"createLog": "Ett nytt ärende har skapats av {0}!",
"closeLog": "Detta ärende har stängts av {0}!",
"closeDm": "Ditt ärende har stängts på vår server!",
"deleteLog": "Detta ärende har raderats av {0}!",
"deleteDm": "Ditt ärende har raderats på vår server!",
"reopenLog": "Detta ärende har återöppnats av {0}!",
"reopenDm": "Ditt ärende har återöppnats på vår server!",
"claimLog": "Detta ärende har tagits av {0}!",
"claimDm": "Ditt ärende har tagits på vår server!",
"unclaimLog": "Detta ärende har frigjorts av {0}!",
"unclaimDm": "Ditt ärende har frigjorts på vår server!",
"pinLog": "Detta ärende har fästs av {0}!",
"pinDm": "Ditt ärende har fästs på vår server!",
"unpinLog": "Detta ärende har lossats av {0}!",
"unpinDm": "Ditt ärende har lossats på vår server!",
"renameLog": "Detta ärende har döpts om till {0} av {1}!",
"renameDm": "Ditt ärende har döpts om till {0} på vår server!",
"moveLog": "Detta ärende har flyttats till {0} av {1}!",
"moveDm": "Ditt ärende har flyttats till {0} på vår server!",
"addLog": "{0} har lagts till i detta ärende av {1}!",
"addDm": "{0} har lagts till i ditt ärende på vår server!",
"removeLog": "{0} har tagits bort från detta ärende av {1}!",
"removeDm": "{0} har tagits bort från ditt ärende på vår server!",
"blacklistAddLog": "{0} har svartlistats av {1}!",
"blacklistRemoveLog": "{0} har tagits bort från svartlistan av {1}!",
"blacklistAddDm": "Du har svartlistats på vår server!\nFrån och med nu kan du inte skapa ett ärende!",
"blacklistRemoveDm": "Du har tagits bort från svartlistan på vår server!\nNu kan du skapa ärenden igen!",
"clearLog": "{0} ärenden har raderats av {1}!"
}
},
"transcripts": {
"success": {
"visit": "Besök Utskrift",
"ready": "Utskrift Skapad",
"textFileDescription": "Detta är textutskriften av ett raderat ärende!",
"htmlProgress": "Vänligen vänta medan denna HTML-utskrift bearbetas...",
"createdChannel": "En ny {0} utskrift har skapats på servern!",
"createdCreator": "En ny {0} utskrift har skapats för ett av dina ärenden!",
"createdParticipant": "En ny {0} utskrift har skapats i ett av ärendena du deltog i!",
"createdActiveAdmin": "En ny {0} utskrift har skapats i ett av ärendena du deltog i som admin!",
"createdEveryAdmin": "En ny {0} utskrift har skapats i ett av ärendena du var admin i!",
"createdOther": "En ny {0} utskrift har skapats!"
},
"errors": {
"retry": "Försök Igen",
"continue": "Radera Utan Utskrift",
"backup": "Skapa Säkerhetskopieringsutskrift",
"error": "Något gick fel vid försöket att skapa utskriften.\nVad vill du göra?\n\nDetta ärende kommer inte att raderas förrän du klickar på en av dessa knappar."
}
},
"errors": {
"titles": {
"internalError": "Internt Fel",
"optionMissing": "Kommandoalternativ Saknas",
"optionInvalid": "Ogiltigt Kommandoalternativ",
"unknownCommand": "Okänt Kommando",
"noPermissions": "Inga Behörigheter",
"unknownTicket": "Okänt Ärende",
"deprecatedTicket": "Utgånget Ärende",
"unknownOption": "Okänt Alternativ",
"unknownPanel": "Okänt Panel",
"notInGuild": "Inte På Server",
"channelRename": "Kan Inte Döpa Om Kanal",
"busy": "Ärendet Är Upptaget"
},
"descriptions": {
"askForInfo": "Kontakta ägaren av denna bot för mer information!",
"askForInfoResolve": "Kontakta ägaren av denna bot om problemet inte löser sig efter några försök!",
"internalError": "Kunde inte svara på denna {0} på grund av ett internt fel!",
"optionMissing": "En obligatorisk parameter saknas i detta kommando!",
"optionInvalid": "En parameter i detta kommando är ogiltig!",
"optionInvalidChoose": "Välj mellan",
"unknownCommand": "Försök besöka hjälpmenyn för mer information!",
"noPermissions": "Du har inte behörighet att använda denna {0}!",
"noPermissionsList": "Nödvändiga behörigheter: (en av dem)",
"noPermissionsCooldown": "Du har inte behörighet att använda denna {0} eftersom du har en nedkylningsperiod!",
"noPermissionsBlacklist": "Du har inte behörighet att använda denna {0} eftersom du är svartlistad!",
"noPermissionsLimitGlobal": "Du har inte behörighet att skapa ett ärende eftersom servern har nått maxgränsen för ärenden!",
"noPermissionsLimitGlobalUser": "Du har inte behörighet att skapa ett ärende eftersom du har nått maxgränsen för ärenden!",
"noPermissionsLimitOption": "Du har inte behörighet att skapa ett ärende eftersom servern har nått maxgränsen för detta alternativ!",
"noPermissionsLimitOptionUser": "Du har inte behörighet att skapa ett ärende eftersom du har nått maxgränsen för detta alternativ!",
"unknownTicket": "Försök med detta kommando igen i ett giltigt ärende!",
"deprecatedTicket": "Den nuvarande kanalen är inte ett giltigt ärende! Det kan ha varit ett ärende från en äldre version av Open Ticket!",
"notInGuild": "Denna {0} fungerar inte i DM! Försök igen på en server!",
"channelRename": "På grund av Discords hastighetsbegränsningar är det för närvarande omöjligt för botten att döpa om kanalen. Kanalen kommer automatiskt att döpas om inom 10 minuter om botten inte startas om.",
"channelRenameSource": "Källan till detta fel är: {0}",
"busy": "Kan inte använda denna {0}!\nÄrendet behandlas för närvarande av botten.\n\nFörsök igen om några sekunder!"
},
"optionInvalidReasons": {
"stringRegex": "Värdet matchar inte mönstret!",
"stringMinLength": "Värdet ska vara minst {0} tecken!",
"stringMaxLength": "Värdet ska vara högst {0} tecken!",
"numberInvalid": "Ogiltigt tal!",
"numberMin": "Talet ska vara minst {0}!",
"numberMax": "Talet ska vara högst {0}!",
"numberDecimal": "Talet kan inte vara ett decimaltal!",
"numberNegative": "Talet kan inte vara negativt!",
"numberPositive": "Talet kan inte vara positivt!",
"numberZero": "Talet kan inte vara noll!",
"channelNotFound": "Kan inte hitta kanalen!",
"userNotFound": "Kan inte hitta användaren!",
"roleNotFound": "Kan inte hitta rollen!",
"memberNotFound": "Kan inte hitta användaren!",
"mentionableNotFound": "Kan inte hitta användaren eller rollen!",
"channelType": "Ogiltig kanaltyp!",
"notInGuild": "Detta alternativ kräver att du är på en server!"
},
"permissions": {
"developer": "Du måste vara utvecklaren av botten.",
"owner": "Du måste vara serverägaren.",
"admin": "Du måste vara serveradministratör.",
"moderator": "Du måste vara moderator.",
"support": "Du måste vara en del av supportteamet.",
"member": "Du måste vara medlem.",
"discord-administrator": "Du måste ha `ADMINISTRATOR`-behörigheten."
},
"actionInvalid": {
"close": "Ärendet är redan stängt!",
"reopen": "Ärendet är inte stängt ännu!",
"claim": "Ärendet är redan taget!",
"unclaim": "Ärendet är inte taget ännu!",
"pin": "Ärendet är redan fäst!",
"unpin": "Ärendet är inte fäst ännu!",
"add": "Denna användare har redan tillgång till ärendet!",
"remove": "Kan inte ta bort denna användare från ärendet!"
}
},
"params": {
"uppercase": {
"ticket": "Ärende",
"tickets": "Ärenden",
"reason": "Orsak",
"creator": "Skapare",
"remaining": "Tid Kvar",
"added": "Tillagd",
"removed": "Borttagen",
"filter": "Filter",
"claimedBy": "Taget Av {0}",
"method": "Metod",
"type": "Typ",
"blacklisted": "Svartlistad",
"panel": "Panel",
"command": "Kommando",
"system": "System",
"true": "Sant",
"false": "Falskt",
"syntax": "Syntax",
"originalName": "Ursprungligt Namn",
"newName": "Nytt Namn",
"until": "Till",
"validOptions": "Giltiga Alternativ",
"validPanels": "Giltiga Paneler",
"autoclose": "Autostängning",
"autodelete": "Autoradering",
"startupDate": "Startdatum",
"version": "Version",
"name": "Namn",
"role": "Roll",
"status": "Status",
"claimed": "Taget",
"pinned": "Fäst",
"creationDate": "Skapelsedatum"
},
"lowercase": {
"text": "text",
"html": "html",
"command": "kommando",
"modal": "modal",
"button": "knapp",
"dropdown": "rullgardinsmeny",
"method": "metod"
}
},
"commands": {
"reason": "Ange en valfri orsak som kommer att vara synlig i loggarna.",
"help": "Få en lista över alla tillgängliga kommandon.",
"panel": "Skapa ett meddelande med en rullgardinsmeny eller knappar (för ärendeskapande).",
"panelId": "Identifieraren för panelen du vill skapa.",
"panelAutoUpdate": "Vill du att denna panel ska uppdateras automatiskt när den redigeras?",
"ticket": "Skapa ett ärende direkt.",
"ticketId": "Identifieraren för ärendet du vill skapa.",
"close": "Stäng ett ärende.",
"delete": "Radera ett ärende.",
"deleteNoTranscript": "Radera detta ärende utan att skapa en utskrift.",
"reopen": "Återöppna ett ärende.",
"claim": "Ta ett ärende.",
"claimUser": "Ta detta ärende för en annan användare istället för dig själv.",
"unclaim": "Frigör ett ärende.",
"pin": "Fäst ett ärende.",
"unpin": "Lossa ett ärende.",
"move": "Flytta ett ärende.",
"moveId": "Identifieraren för alternativet du vill flytta till.",
"rename": "Döp om ett ärende.",
"renameName": "Det nya namnet på detta ärende.",
"add": "Lägg till en användare i ett ärende.",
"addUser": "Användaren som ska läggas till.",
"remove": "Ta bort en användare från ett ärende.",
"removeUser": "Användaren som ska tas bort.",
"blacklist": "Hantera svartlistan för ärenden.",
"blacklistView": "Visa en lista över nuvarande svartlista.",
"blacklistAdd": "Lägg till en användare på svartlistan.",
"blacklistRemove": "Ta bort en användare från svartlistan.",
"blacklistGet": "Hämta detaljer om en svartlistad användare.",
"blacklistGetUser": "Användaren att hämta detaljer från.",
"stats": "Visa statistik från botten, en användare eller ett ärende.",
"statsReset": "Återställ all statistik för botten (och börja räkna från noll).",
"statsGlobal": "Visa global statistik.",
"statsUser": "Visa statistik från en användare på servern.",
"statsUserUser": "Användaren som ska visas.",
"statsTicket": "Visa statistik för ett ärende på servern.",
"statsTicketTicket": "Ärendet som ska visas.",
"clear": "Radera flera ärenden samtidigt.",
"clearFilter": "Filtret för att radera ärenden.",
"clearFilters": {
"all": "Alla",
"open": "Öppna",
"close": "Stängda",
"claim": "Tagna",
"unclaim": "Frigjorda",
"pin": "Fästa",
"unpin": "Lossade",
"autoclose": "Autostängda"
},
"autoclose": "Hantera autostängning i ett ärende.",
"autocloseDisable": "Inaktivera autostängning i detta ärende.",
"autocloseEnable": "Aktivera autostängning i detta ärende.",
"autocloseEnableTime": "Antal timmar detta ärende måste vara inaktivt innan det stängs.",
"autodelete": "Hantera autoradering i ett ärende.",
"autodeleteDisable": "Inaktivera autoradering i detta ärende.",
"autodeleteEnable": "Aktivera autoradering i detta ärende.",
"autodeleteEnableTime": "Antal dagar detta ärende måste vara inaktivt innan det raderas."
},
"helpMenu": {
"help": "Få en lista över alla tillgängliga kommandon.",
"ticket": "Skapa ett ärende direkt.",
"close": "Stäng ett ärende, detta inaktiverar skrivning i kanalen.",
"delete": "Radera ett ärende, detta skapar en utskrift när det är aktiverat.",
"reopen": "Återöppna ett ärende, detta aktiverar skrivning i kanalen igen.",
"pin": "Fäst ett ärende. Detta flyttar ärendet till toppen och lägger till en '📌' emoji i namnet.",
"unpin": "Lossa ett ärende. Ärendet blir kvar på plats, men förlorar '📌' emojin.",
"move": "Flytta ett ärende. Detta ändrar typen på ärendet.",
"rename": "Döp om ett ärende. Detta ändrar kanalnamnet på ärendet.",
"claim": "Ta ett ärende. Detta låter ditt team veta att du hanterar ärendet.",
"unclaim": "Frigör ett ärende. Detta låter ditt team veta att ärendet är ledigt igen.",
"add": "Lägg till en användare i ett ärende. Detta ger användaren tillgång att läsa och skriva i ärendet.",
"remove": "Ta bort en användare från ett ärende. Detta tar bort användarens tillgång att läsa och skriva i ärendet.",
"panel": "Skapa ett meddelande med en rullgardinsmeny eller knappar (för ärendeskapande).",
"blacklistView": "Visa en lista över nuvarande svartlista.",
"blacklistAdd": "Lägg till en användare på svartlistan.",
"blacklistRemove": "Ta bort en användare från svartlistan.",
"blacklistGet": "Hämta detaljer om en svartlistad användare.",
"statsGlobal": "Visa global statistik.",
"statsTicket": "Visa statistik för ett ärende på servern.",
"statsUser": "Visa statistik från en användare på servern.",
"statsReset": "Återställ all statistik för botten (och börja räkna från noll).",
"autocloseDisable": "Inaktivera autostängning i detta ärende.",
"autocloseEnable": "Aktivera autostängning i detta ärende.",
"autodeleteDisable": "Inaktivera autoradering i detta ärende.",
"autodeleteEnable": "Aktivera autoradering i detta ärende."
},
"stats": {
"scopes": {
"global": "Global Statistik",
"system": "Systemstatistik",
"user": "Användarstatistik",
"ticket": "Ärendestatistik",
"participants": "Deltagare"
},
"properties": {
"ticketsCreated": "Ärenden Skapade",
"ticketsClosed": "Ärenden Stängda",
"ticketsDeleted": "Ärenden Raderade",
"ticketsReopened": "Ärenden Återöppnade",
"ticketsAutoclosed": "Ärenden Autostängda",
"ticketsClaimed": "Ärenden Tagna",
"ticketsPinned": "Ärenden Fästa",
"ticketsMoved": "Ärenden Flyttade",
"usersBlacklisted": "Användare Svartlistade",
"transcriptsCreated": "Utskrifter Skapade"
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["modshd"], "translators":["modshd"],
"lastedited":"13/11/2024", "lastedited":"13/11/2024",
"language":"Thai", "language":"Thai",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION": { "_TRANSLATION": {
"otversion": "v4.0.0", "otversion": "v4.0.1",
"translators": ["palestinian"], "translators": ["palestinian"],
"lastedited": "26/11/2024", "lastedited": "26/11/2024",
"language": "Turkish", "language": "Turkish",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"_TRANSLATION":{ "_TRANSLATION":{
"otversion":"v4.0.0", "otversion":"v4.0.1",
"translators":["Anderskiy"], "translators":["Anderskiy"],
"lastedited":"31/08/2024", "lastedited":"31/08/2024",
"language":"Ukrainian", "language":"Ukrainian",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "open-ticket", "name": "open-ticket",
"author": "DJdj Development", "author": "DJdj Development",
"version": "4.0.0", "version": "4.0.1",
"description": "The most advanced open-source discord ticket bot with HTML transcripts, plugins, questions, claiming, pinning & more! Using discord.js v14 & JSON database! ", "description": "The most advanced open-source discord ticket bot with HTML transcripts, plugins, questions, claiming, pinning & more! Using discord.js v14 & JSON database! ",
"keywords": [ "keywords": [
"ticket-bot", "ticket-bot",
+16 -14
View File
@@ -26,20 +26,22 @@ export const registerActions = async () => {
await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-claimed",user.id,1,"increase") await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-claimed",user.id,1,"increase")
//update category //update category
const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id) if (params.allowCategoryChange){
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id)
if (claimCategory){ const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
try { if (claimCategory){
channel.setParent(claimCategory,{lockPermissions:false}) try {
ticket.get("opendiscord:category-mode").value = "claimed" channel.setParent(claimCategory,{lockPermissions:false})
ticket.get("opendiscord:category").value = claimCategory ticket.get("opendiscord:category-mode").value = "claimed"
}catch(e){ ticket.get("opendiscord:category").value = claimCategory
opendiscord.log("Unable to move ticket to 'claimed category'!","error",[ }catch(e){
{key:"channel",value:"#"+channel.name}, opendiscord.log("Unable to move ticket to 'claimed category'!","error",[
{key:"channelid",value:channel.id,hidden:true}, {key:"channel",value:"#"+channel.name},
{key:"categoryid",value:claimCategory} {key:"channelid",value:channel.id,hidden:true},
]) {key:"categoryid",value:claimCategory}
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException")) ])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
} }
} }
+15 -13
View File
@@ -28,19 +28,21 @@ export const registerActions = async () => {
await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-closed",user.id,1,"increase") await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-closed",user.id,1,"increase")
//update category //update category
const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value if (params.allowCategoryChange){
if (closeCategory !== ""){ const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value
try { if (closeCategory !== ""){
channel.setParent(closeCategory,{lockPermissions:false}) try {
ticket.get("opendiscord:category-mode").value = "closed" channel.setParent(closeCategory,{lockPermissions:false})
ticket.get("opendiscord:category").value = closeCategory ticket.get("opendiscord:category-mode").value = "closed"
}catch(e){ ticket.get("opendiscord:category").value = closeCategory
opendiscord.log("Unable to move ticket to 'closed category'!","error",[ }catch(e){
{key:"channel",value:"#"+channel.name}, opendiscord.log("Unable to move ticket to 'closed category'!","error",[
{key:"channelid",value:channel.id,hidden:true}, {key:"channel",value:"#"+channel.name},
{key:"categoryid",value:closeCategory} {key:"channelid",value:channel.id,hidden:true},
]) {key:"categoryid",value:closeCategory}
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException")) ])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
} }
} }
+45 -43
View File
@@ -28,53 +28,55 @@ export const registerActions = async () => {
await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-reopened",user.id,1,"increase") await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-reopened",user.id,1,"increase")
//update category //update category
const channelCategory = ticket.option.get("opendiscord:channel-category").value if (params.allowCategoryChange){
const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value const channelCategory = ticket.option.get("opendiscord:channel-category").value
if (channelCategory !== ""){ const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value
//category enabled if (channelCategory !== ""){
try { //category enabled
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory) try {
if (!normalCategory){ const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
//default category was not found if (!normalCategory){
opendiscord.log("Ticket Reopening Error: Unable to find category! #1","error",[ //default category was not found
{key:"categoryid",value:channelCategory}, opendiscord.log("Ticket Reopening Error: Unable to find category! #1","error",[
{key:"backup",value:"false"} {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 opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
opendiscord.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("opendiscord:category-mode").value = "backup"
ticket.get("opendiscord:category").value = backupCategory.id
}
}else{ }else{
//use default category //default category was found
channel.setParent(normalCategory,{lockPermissions:false}) if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
ticket.get("opendiscord:category-mode").value = "normal" //use backup category
ticket.get("opendiscord:category").value = normalCategory.id const backupCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
opendiscord.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("opendiscord:category-mode").value = "backup"
ticket.get("opendiscord:category").value = backupCategory.id
}
}else{
//use default category
channel.setParent(normalCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "normal"
ticket.get("opendiscord:category").value = normalCategory.id
}
} }
}catch(e){
opendiscord.log("Unable to move ticket to 'reopened category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
} }
}catch(e){ }else{
opendiscord.log("Unable to move ticket to 'reopened category'!","error",[ channel.setParent(null,{lockPermissions:false})
{key:"channel",value:"#"+channel.name}, ticket.get("opendiscord:category-mode").value = null
{key:"channelid",value:channel.id,hidden:true}, ticket.get("opendiscord:category").value = null
])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
} }
}else{
channel.setParent(null,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = null
ticket.get("opendiscord:category").value = null
} }
//update permissions //update permissions
+46 -44
View File
@@ -22,54 +22,56 @@ export const registerActions = async () => {
ticket.get("opendiscord:busy").value = true ticket.get("opendiscord:busy").value = true
//update category //update category
const channelCategory = ticket.option.get("opendiscord:channel-category").value if (params.allowCategoryChange){
const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value const channelCategory = ticket.option.get("opendiscord:channel-category").value
if (channelCategory !== ""){ const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value
//category enabled if (channelCategory !== ""){
try { //category enabled
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory) try {
if (!normalCategory){ const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
//default category was not found if (!normalCategory){
opendiscord.log("Ticket Unclaiming Error: Unable to find category! #1","error",[ //default category was not found
{key:"categoryid",value:channelCategory}, opendiscord.log("Ticket Unclaiming Error: Unable to find category! #1","error",[
{key:"backup",value:"false"} {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 opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
opendiscord.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("opendiscord:category-mode").value = "backup"
ticket.get("opendiscord:category").value = backupCategory.id
}
}else{ }else{
//use default category //default category was found
channel.setParent(normalCategory,{lockPermissions:false}) if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
ticket.get("opendiscord:category-mode").value = "normal" //use backup category
ticket.get("opendiscord:category").value = normalCategory.id const backupCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelBackupCategory)
if (!backupCategory){
//default category was not found
opendiscord.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("opendiscord:category-mode").value = "backup"
ticket.get("opendiscord:category").value = backupCategory.id
}
}else{
//use default category
channel.setParent(normalCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "normal"
ticket.get("opendiscord:category").value = normalCategory.id
}
} }
}
}catch(e){ }catch(e){
opendiscord.log("Unable to move ticket to 'unclaimed category'!","error",[ opendiscord.log("Unable to move ticket to 'unclaimed category'!","error",[
{key:"channel",value:"#"+channel.name}, {key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true} {key:"channelid",value:channel.id,hidden:true}
]) ])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException")) opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}else{
channel.setParent(null,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = null
ticket.get("opendiscord:category").value = null
} }
}else{
channel.setParent(null,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = null
ticket.get("opendiscord:category").value = null
} }
//update ticket message //update ticket message
+5 -2
View File
@@ -64,9 +64,12 @@ export const registerCommandResponders = async () => {
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:panel-ready").build(source,{guild,channel,user,panel})) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:panel-ready").build(source,{guild,channel,user,panel}))
const panelMessage = await instance.channel.send((await opendiscord.builders.messages.getSafe("opendiscord:panel").build(source,{guild,channel,user,panel})).message) const panelMessage = await instance.channel.send((await opendiscord.builders.messages.getSafe("opendiscord:panel").build(source,{guild,channel,user,panel})).message)
//add panel to database on auto-update //add panel to database (this way, the bot knows where all panels are located)
const globalDatabase = opendiscord.databases.get("opendiscord:global")
await globalDatabase.set("opendiscord:panel-message",panelMessage.channel.id+"_"+panelMessage.id,panel.id.value)
//add panel to database for auto-update
if (instance.options.getBoolean("auto-update",false)){ if (instance.options.getBoolean("auto-update",false)){
const globalDatabase = opendiscord.databases.get("opendiscord:global")
await globalDatabase.set("opendiscord:panel-update",panelMessage.channel.id+"_"+panelMessage.id,panel.id.value) await globalDatabase.set("opendiscord:panel-update",panelMessage.channel.id+"_"+panelMessage.id,panel.id.value)
} }
}), }),
+8
View File
@@ -205,6 +205,14 @@ export const registerDropdownResponders = async () => {
} }
if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:ticket-created").build("panel-dropdown",{guild,channel:res.channel,user,ticket:res.ticket})) if (generalConfig.data.system.replyOnTicketCreation) await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:ticket-created").build("panel-dropdown",{guild,channel:res.channel,user,ticket:res.ticket}))
} }
//update panel after dropdown usage (reset panel choice)
const globalDatabase = opendiscord.databases.get("opendiscord:global")
const rawPanelId = await globalDatabase.get("opendiscord:panel-message",instance.message.channel.id+"_"+instance.message.id)
if (rawPanelId){
const panel = opendiscord.panels.get(rawPanelId)
if (panel) await instance.message.edit((await opendiscord.builders.messages.getSafe("opendiscord:panel").build("auto-update",{guild,channel,user,panel})).message)
}
}) })
) )
} }
+4 -4
View File
@@ -36,7 +36,7 @@ export interface ODActionManagerIds_Default {
}, },
"opendiscord:close-ticket":{ "opendiscord:close-ticket":{
source:"slash"|"text"|"ticket-message"|"reopen-message"|"autoclose"|"other", 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}, params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{}, result:{},
workers:"opendiscord:close-ticket"|"opendiscord:discord-logs"|"opendiscord:logs" workers:"opendiscord:close-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
}, },
@@ -48,19 +48,19 @@ export interface ODActionManagerIds_Default {
}, },
"opendiscord:reopen-ticket":{ "opendiscord:reopen-ticket":{
source:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other", 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}, params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{}, result:{},
workers:"opendiscord:reopen-ticket"|"opendiscord:discord-logs"|"opendiscord:logs" workers:"opendiscord:reopen-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
}, },
"opendiscord:claim-ticket":{ "opendiscord:claim-ticket":{
source:"slash"|"text"|"ticket-message"|"unclaim-message"|"other", 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}, params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{}, result:{},
workers:"opendiscord:claim-ticket"|"opendiscord:discord-logs"|"opendiscord:logs" workers:"opendiscord:claim-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
}, },
"opendiscord:unclaim-ticket":{ "opendiscord:unclaim-ticket":{
source:"slash"|"text"|"ticket-message"|"claim-message"|"other", 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}, params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{}, result:{},
workers:"opendiscord:unclaim-ticket"|"opendiscord:discord-logs"|"opendiscord:logs" workers:"opendiscord:unclaim-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
}, },
+141 -122
View File
@@ -325,6 +325,31 @@ export interface ODJsonConfig_DefaultOptionPingSettingsType {
custom:string[] custom:string[]
} }
/**## ODJsonConfig_DefaultOptionTicketChannelType `interface`
* All settings related to the ticket channel itself in a ticket option.
*/
export interface ODJsonConfig_DefaultOptionTicketChannelType {
/**The prefix used in the name of this ticket channel. */
prefix:string,
/**The type of suffix used in the name of this ticket channel. */
suffix:"user-name"|"user-id"|"random-number"|"random-hex"|"counter-dynamic"|"counter-fixed",
/**An optional discord category id to create this ticket in. */
category:string,
/**An optional discord category id to move this ticket to when closed. */
closedCategory:string,
/**An optional discord category id to create this ticket in when the primary one is full (max. 50 tickets). */
backupCategory:string,
/**A list of discord category ids to move this ticket to when claimed by a specific user. */
claimedCategory:{
/**The user which claimed the ticket. */
user:string,
/**The category to move the ticket to when claimed by this user. */
category:string
}[],
/**The channel description/topic shown at the top of the channel in discord. */
description:string
}
/**## ODJsonConfig_DefaultOptionTicketType `interface` /**## ODJsonConfig_DefaultOptionTicketType `interface`
* This interface is an object which has all ticket properties for options in the `options.json` config! * This interface is an object which has all ticket properties for options in the `options.json` config!
*/ */
@@ -340,27 +365,7 @@ export interface ODJsonConfig_DefaultOptionTicketType extends ODJsonConfig_Defau
/**A list of valid question ids from the `questions.json` config. */ /**A list of valid question ids from the `questions.json` config. */
questions:string[], questions:string[],
/**All settings related to the ticket channel itself. */ /**All settings related to the ticket channel itself. */
channel:{ channel:ODJsonConfig_DefaultOptionTicketChannelType,
/**The prefix used in the name of this ticket channel. */
prefix:string,
/**The type of suffix used in the name of this ticket channel. */
suffix:"user-name"|"user-id"|"random-number"|"random-hex"|"counter-dynamic"|"counter-fixed",
/**An optional discord category id to create this ticket in. */
category:string,
/**An optional discord category id to move this ticket to when closed. */
closedCategory:string,
/**An optional discord category id to create this ticket in when the primary one is full (max. 50 tickets). */
backupCategory:string,
/**A list of discord category ids to move this ticket to when claimed by a specific user. */
claimedCategory:{
/**The user which claimed the ticket. */
user:string,
/**The category to move the ticket to when claimed by this user. */
category:string
}[],
/**The channel description/topic shown at the top of the channel in discord. */
description:string
},
/**All settings related to the message sent in DM to the creator when the ticket is created. */ /**All settings related to the message sent in DM to the creator when the ticket is created. */
dmMessage:{ dmMessage:{
/**Enable this message. */ /**Enable this message. */
@@ -495,6 +500,30 @@ export interface ODJsonConfig_DefaultPanelEmbedSettingsType {
timestamp:boolean timestamp:boolean
} }
/**## ODJsonConfig_DefaultPanelSettingsType `interface`
* This interface is a collection of additional settings for extra customisation in a panel.
*/
export interface ODJsonConfig_DefaultPanelSettingsType {
/**The placeholder used in the dropdown when enabled. */
dropdownPlaceholder:string,
/**Enable a max tickets warning in the text contents. */
enableMaxTicketsWarningInText:boolean,
/**Enable a max tickets warning in the embed. */
enableMaxTicketsWarningInEmbed:boolean,
/**The layout/complexity of the describe options feature. */
describeOptionsLayout:"simple"|"normal"|"detailed",
/**A custom title for the describe options feature. */
describeOptionsCustomTitle:string,
/**Describe the options in the text contents. */
describeOptionsInText:boolean,
/**Describe the options in the embed fields. */
describeOptionsInEmbedFields:boolean,
/**Describe the options in the embed description. */
describeOptionsInEmbedDescription:boolean
}
/**## ODJsonConfig_DefaultPanelType `interface` /**## ODJsonConfig_DefaultPanelType `interface`
* This interface is an object which has all properties for panels in the `panels.json` config! * This interface is an object which has all properties for panels in the `panels.json` config!
*/ */
@@ -512,26 +541,8 @@ export interface ODJsonConfig_DefaultPanelType {
text:string, text:string,
/**The embed of this panel. */ /**The embed of this panel. */
embed:ODJsonConfig_DefaultPanelEmbedSettingsType, embed:ODJsonConfig_DefaultPanelEmbedSettingsType,
settings:{ /**A collection of additional settings for extra customisation in a panel. */
/**The placeholder used in the dropdown when enabled. */ settings:ODJsonConfig_DefaultPanelSettingsType
dropdownPlaceholder:string,
/**Enable a max tickets warning in the text contents. */
enableMaxTicketsWarningInText:boolean,
/**Enable a max tickets warning in the embed. */
enableMaxTicketsWarningInEmbed:boolean,
/**The layout/complexity of the describe options feature. */
describeOptionsLayout:"simple"|"normal"|"detailed",
/**A custom title for the describe options feature. */
describeOptionsCustomTitle:string,
/**Describe the options in the text contents. */
describeOptionsInText:boolean,
/**Describe the options in the embed fields. */
describeOptionsInEmbedFields:boolean,
/**Describe the options in the embed description. */
describeOptionsInEmbedDescription:boolean
}
} }
/**## ODJsonConfig_DefaultPanels `default_class` /**## ODJsonConfig_DefaultPanels `default_class`
@@ -544,6 +555,18 @@ export class ODJsonConfig_DefaultPanels extends ODJsonConfig {
declare data: ODJsonConfig_DefaultPanelType[] declare data: ODJsonConfig_DefaultPanelType[]
} }
/**## ODJSonConfig_DefaultQuestionLengthSettings `interface`
* This interface is a collection of settings related to length validation in a question.
*/
export interface ODJSonConfig_DefaultQuestionLengthSettings {
/**Enable text length verification. */
enabled:boolean,
/**The minimum text input length. */
min:number,
/**The maximum text input length. */
max:number
}
/**## ODJsonConfig_DefaultShortQuestionType `interface` /**## ODJsonConfig_DefaultShortQuestionType `interface`
* This interface is an object which has all properties for short questions in the `questions.json` config! * This interface is an object which has all properties for short questions in the `questions.json` config!
*/ */
@@ -559,15 +582,8 @@ export interface ODJsonConfig_DefaultShortQuestionType {
required:boolean, required:boolean,
/**A placeholder for the question. */ /**A placeholder for the question. */
placeholder:string, placeholder:string,
/**Settings related to the length of the input. */ /**A collection of settings related to length validation in a question. */
length:{ length:ODJSonConfig_DefaultQuestionLengthSettings
/**Enable text length verification. */
enabled:boolean,
/**The minimum text input length. */
min:number,
/**The maximum text input length. */
max:number
}
} }
/**## ODJsonConfig_DefaultParagraphQuestionType `interface` /**## ODJsonConfig_DefaultParagraphQuestionType `interface`
@@ -585,15 +601,8 @@ export interface ODJsonConfig_DefaultParagraphQuestionType {
required:boolean, required:boolean,
/**A placeholder for the question. */ /**A placeholder for the question. */
placeholder:string, placeholder:string,
/**Settings related to the length of the input. */ /**A collection of settings related to length validation in a question. */
length:{ length:ODJSonConfig_DefaultQuestionLengthSettings
/**Enable text length verification. */
enabled:boolean,
/**The minimum text input length. */
min:number,
/**The maximum text input length. */
max:number
}
} }
/**## ODJsonConfig_DefaultQuestions `default_class` /**## ODJsonConfig_DefaultQuestions `default_class`
@@ -609,6 +618,77 @@ export class ODJsonConfig_DefaultQuestions extends ODJsonConfig {
)[] )[]
} }
/**## ODJsonConfig_DefaultTranscriptsTextLayout `interface`
* This interface contains the layout of the text transcripts.
*/
export interface ODJsonConfig_DefaultTranscriptsTextLayout {
/**The layout/complexity of the text transcripts. */
layout:"simple"|"normal"|"detailed",
/**Include stats in the transcript. */
includeStats:boolean,
/**Include user & message ids in the transcript. */
includeIds:boolean,
/**Include embeds in the transcript. */
includeEmbeds:boolean,
/**Include files in the transcript. */
includeFiles:boolean,
/**Include bot messages in the transcript. */
includeBotMessages:boolean,
/**How to name the transcript file? */
fileMode:"custom"|"channel-name"|"channel-id"|"user-name"|"user-id",
/**A custom name for the transcript file (when using `"custom"`) */
customFileName:string
}
/**## ODJsonConfig_DefaultTranscriptsHtmlLayout `interface`
* This interface contains the layout of the HTML transcripts.
*/
export interface ODJsonConfig_DefaultTranscriptsHtmlLayout {
/**Settings related to the background. */
background:{
/**Enable a custom background. */
enableCustomBackground:boolean,
/**The background (hex) color. */
backgroundColor:string,
/**The background image url. */
backgroundImage:string
},
/**Settings related to the header. */
header:{
/**Enable a custom header. */
enableCustomHeader:boolean,
/**The background (hex) color of the header. */
backgroundColor:string,
/**The deco color (horizontal line) of the header. */
decoColor:string,
/**The text color of the header. */
textColor:string
},
/**Settings related to the stats section. */
stats:{
/**Enable a custom stats section. */
enableCustomStats:false,
/**The background color of the stats section. */
backgroundColor:string,
/**The key text color of the stats section. */
keyTextColor:string,
/**The value text color of the stats section. */
valueTextColor:string,
/**The background color of the hide button in the stats section. */
hideBackgroundColor:string,
/**The text color of the hide button in the stats section. */
hideTextColor:string
},
/**Settings related to the favicon. */
favicon:{
/**Enable a custom background. */
enableCustomFavicon:boolean,
/**A link to the custom favicon. */
imageUrl:string
}
}
/**## ODJsonConfig_DefaultTranscripts `default_class` /**## ODJsonConfig_DefaultTranscripts `default_class`
* This is a special class that adds type definitions & typescript to the ODJsonConfig class. * This is a special class that adds type definitions & typescript to the ODJsonConfig class.
* It doesn't add any extra features! * It doesn't add any extra features!
@@ -648,69 +728,8 @@ export class ODJsonConfig_DefaultTranscripts extends ODJsonConfig {
includeTicketStats:boolean includeTicketStats:boolean
}, },
/**The layout of the text transcripts. */ /**The layout of the text transcripts. */
textTranscriptStyle:{ textTranscriptStyle:ODJsonConfig_DefaultTranscriptsTextLayout,
/**The layout/complexity of the text transcripts. */
layout:"simple"|"normal"|"detailed",
/**Include stats in the transcript. */
includeStats:boolean,
/**Include user & message ids in the transcript. */
includeIds:boolean,
/**Include embeds in the transcript. */
includeEmbeds:boolean,
/**Include files in the transcript. */
includeFiles:boolean,
/**Include bot messages in the transcript. */
includeBotMessages:boolean,
/**How to name the transcript file? */
fileMode:"custom"|"channel-name"|"channel-id"|"user-name"|"user-id",
/**A custom name for the transcript file (when using `"custom"`) */
customFileName:string
},
/**The layout of the HTML transcripts. */ /**The layout of the HTML transcripts. */
htmlTranscriptStyle:{ htmlTranscriptStyle:ODJsonConfig_DefaultTranscriptsHtmlLayout
/**Settings related to the background. */
background:{
/**Enable a custom background. */
enableCustomBackground:boolean,
/**The background (hex) color. */
backgroundColor:string,
/**The background image url. */
backgroundImage:string
},
/**Settings related to the header. */
header:{
/**Enable a custom header. */
enableCustomHeader:boolean,
/**The background (hex) color of the header. */
backgroundColor:string,
/**The deco color (horizontal line) of the header. */
decoColor:string,
/**The text color of the header. */
textColor:string
},
/**Settings related to the stats section. */
stats:{
/**Enable a custom stats section. */
enableCustomStats:false,
/**The background color of the stats section. */
backgroundColor:string,
/**The key text color of the stats section. */
keyTextColor:string,
/**The value text color of the stats section. */
valueTextColor:string,
/**The background color of the hide button in the stats section. */
hideBackgroundColor:string,
/**The text color of the hide button in the stats section. */
hideTextColor:string
},
/**Settings related to the favicon. */
favicon:{
/**Enable a custom background. */
enableCustomFavicon:boolean,
/**A link to the custom favicon. */
imageUrl:string
}
}
} }
} }
+1
View File
@@ -52,6 +52,7 @@ export class ODDatabaseManager_Default extends ODDatabaseManager {
* It's used to generate typescript declarations for this class. * It's used to generate typescript declarations for this class.
*/ */
export interface ODFormattedJsonDatabaseIds_DefaultGlobal { export interface ODFormattedJsonDatabaseIds_DefaultGlobal {
"opendiscord:panel-message":string,
"opendiscord:panel-update":string, "opendiscord:panel-update":string,
"opendiscord:option-suffix-counter":number, "opendiscord:option-suffix-counter":number,
"opendiscord:option-suffix-history":string[], "opendiscord:option-suffix-history":string[],
+4
View File
@@ -467,6 +467,10 @@ export interface ODLanguageManagerIds_Default {
"opendiscord:hindi":ODLanguage, "opendiscord:hindi":ODLanguage,
"opendiscord:lithuanian":ODLanguage, "opendiscord:lithuanian":ODLanguage,
"opendiscord:polish":ODLanguage, "opendiscord:polish":ODLanguage,
"opendiscord:latvian":ODLanguage,
"opendiscord:norwegian":ODLanguage,
"opendiscord:russian":ODLanguage,
"opendiscord:swedish":ODLanguage,
//ADD NEW LANGUAGES HERE!!! //ADD NEW LANGUAGES HERE!!!
} }
+1 -1
View File
@@ -130,7 +130,7 @@ export class ODMain {
constructor(){ constructor(){
this.versions = new ODVersionManager_Default() this.versions = new ODVersionManager_Default()
this.versions.add(ODVersion.fromString("opendiscord:version","v4.0.0")) this.versions.add(ODVersion.fromString("opendiscord:version","v4.0.1"))
this.versions.add(ODVersion.fromString("opendiscord:api","v1.0.0")) this.versions.add(ODVersion.fromString("opendiscord:api","v1.0.0"))
this.versions.add(ODVersion.fromString("opendiscord:transcripts","v2.0.0")) this.versions.add(ODVersion.fromString("opendiscord:transcripts","v2.0.0"))
this.versions.add(ODVersion.fromString("opendiscord:livestatus","v2.0.0")) this.versions.add(ODVersion.fromString("opendiscord:livestatus","v2.0.0"))
+174 -88
View File
@@ -54,11 +54,27 @@ export type ODDiscordIdType = "role"|"server"|"channel"|"category"|"user"|"membe
*/ */
export class ODId { export class ODId {
/**The full value of this `ODId` as a `string`. */ /**The full value of this `ODId` as a `string`. */
value: string #value: string
/**The source of the id (text before `:`). (e.g. `openticket` for all built-in ids) */ /**The full value of this `ODId` as a `string`. */
set value(id:string){
this._change(this.#value,id)
this.#value = id
}
get value(){
return this.#value
}
/**The source of the id (text before `:`). (e.g. `openticket` for all built-in ids)
*
* @deprecated Replaced with `getNamespace()` and will be removed in `v4.1.0`.
*/
source: string source: string
/**The identifier of the id (text after `:`). */ /**The identifier of the id (text after `:`).
*
* @deprecated Replaced with `getIdentifier()` and will be removed in `v4.1.0`.
*/
identifier: string identifier: string
/**The change listener for the parent `ODManager` of this `ODId`. */
#change: ((oldId:string,newId:string) => void)|null = null
constructor(id:ODValidId){ constructor(id:ODValidId){
if (typeof id != "string" && !(id instanceof ODId)) throw new ODSystemError("Invalid constructor parameter => id:ODValidId") if (typeof id != "string" && !(id instanceof ODId)) throw new ODSystemError("Invalid constructor parameter => id:ODValidId")
@@ -74,10 +90,10 @@ export class ODId {
} }
}) })
if (result.length > 0) this.value = result.join("") if (result.length > 0) this.#value = result.join("")
else throw new ODSystemError("invalid ID at 'new ODID(id: "+id+")'") else throw new ODSystemError("invalid ID at 'new ODID(id: "+id+")'")
const splitted = this.value.split(":") const splitted = this.#value.split(":")
if (splitted.length > 1){ if (splitted.length > 1){
this.source = splitted[0] this.source = splitted[0]
splitted.shift() splitted.shift()
@@ -88,7 +104,7 @@ export class ODId {
} }
}else{ }else{
//id is ODId //id is ODId
this.value = id.value this.#value = id.#value
this.source = id.source this.source = id.source
this.identifier = id.identifier this.identifier = id.identifier
} }
@@ -96,7 +112,36 @@ export class ODId {
/**Returns a string representation of this id. (same as `this.value`) */ /**Returns a string representation of this id. (same as `this.value`) */
toString(){ toString(){
return this.value return this.#value
}
/**The namespace of the id before `:`. (e.g. `openticket` for `openticket:autoclose-enabled`) */
getNamespace(){
const splitted = this.#value.split(":")
if (splitted.length > 1) return splitted[0]
else return ""
}
/**The identifier of the id after `:`. (e.g. `autoclose-enabled` for `openticket:autoclose-enabled`) */
getIdentifier(){
const splitted = this.#value.split(":")
if (splitted.length > 1){
splitted.shift()
return splitted.join(":")
}else return this.#value
}
/**Trigger an `onChange()` event in the parent `ODManager` of this class. */
protected _change(oldId:string,newId:string){
if (this.#change){
try{
this.#change(oldId,newId)
}catch(err){
process.emit("uncaughtException",err)
throw new ODSystemError("Failed to execute _change() callback!")
}
}
}
/****(❌ SYSTEM ONLY!!)** Set the callback executed when a value inside this class changes. */
changed(callback:((oldId:string,newId:string) => void)|null){
this.#change = callback
} }
} }
@@ -127,6 +172,8 @@ export class ODManagerChangeHelper {
} }
/**## ODManagerRedirectHelper `class` /**## ODManagerRedirectHelper `class`
* @deprecated ### Will be removed in Open Ticket `v4.1.0`!
*
* This is Open Ticket ticket manager redirect helper. * This is Open Ticket ticket manager redirect helper.
* *
* It is used to redirect a source to another source when the id isn't found. * It is used to redirect a source to another source when the id isn't found.
@@ -206,8 +253,8 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
#debug?: ODDebugger #debug?: ODDebugger
/**The message to send when debugging this manager. */ /**The message to send when debugging this manager. */
#debugname?: string #debugname?: string
/**An array storing all data classes ❌ **(don't edit unless really needed!)***/ /**The map storing all data classes in this manager. */
#data: DataType[] = [] #data: Map<string,DataType> = new Map()
/**An array storing all listeners when data is added. */ /**An array storing all listeners when data is added. */
#addListeners: ODManagerAddCallback<DataType>[] = [] #addListeners: ODManagerAddCallback<DataType>[] = []
/**An array storing all listeners when data has changed. */ /**An array storing all listeners when data has changed. */
@@ -223,7 +270,7 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
this.#debugname = debugname this.#debugname = debugname
} }
/**Add data to the manager. The id will be fetched from the data class! You can optionally select to overwrite existing data!*/ /**Add data to the manager. The `ODId` in the data class will be used as identifier! You can optionally select to overwrite existing data!*/
add(data:DataType|DataType[], overwrite?:boolean): boolean { add(data:DataType|DataType[], overwrite?:boolean): boolean {
//repeat same command when data is an array //repeat same command when data is an array
if (Array.isArray(data)){ if (Array.isArray(data)){
@@ -233,106 +280,94 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
return false return false
} }
//add listener for data id change => transfer data within manager
data.id.changed((oldId,newId) => {
this.#data.delete(oldId)
this.#data.set(newId,data)
})
//add data //add data
const existIndex = this.#data.findIndex((d) => d.id.value === data.id.value) let didOverwrite: boolean
if (existIndex < 0){ if (this.#data.has(data.id.value)){
this.#data.push(data)
if (this.#debug) this.#debug.debug("Added new "+this.#debugname+" to manager",[{key:"id",value:data.id.value},{key:"overwrite",value:"false"}])
//change listeners
data.changed(() => {
//notify change in upper-manager (because data in this manager changed)
this._change()
this.#changeListeners.forEach((cb) => {
try{
cb(data)
}catch(err){
throw new ODSystemError("Failed to run manager onChange() listener.\n"+err)
}
})
})
//add listeners
this.#addListeners.forEach((cb) => {
try{
cb(data,false)
}catch(err){
throw new ODSystemError("Failed to run manager onAdd() listener.\n"+err)
}
})
//notify change in upper-manager (because data added)
this._change()
return false
}else{
if (!overwrite) throw new ODSystemError("Id '"+data.id.value+"' already exists in "+this.#debugname+" manager. Use 'overwrite:true' to allow overwriting!") if (!overwrite) throw new ODSystemError("Id '"+data.id.value+"' already exists in "+this.#debugname+" manager. Use 'overwrite:true' to allow overwriting!")
this.#data[existIndex] = data this.#data.set(data.id.value,data)
didOverwrite = true
if (this.#debug) this.#debug.debug("Added new "+this.#debugname+" to manager",[{key:"id",value:data.id.value},{key:"overwrite",value:"true"}]) if (this.#debug) this.#debug.debug("Added new "+this.#debugname+" to manager",[{key:"id",value:data.id.value},{key:"overwrite",value:"true"}])
//change listeners }else{
data.changed(() => { this.#data.set(data.id.value,data)
//notify change in upper-manager (because data in this manager changed) didOverwrite = false
this._change() if (this.#debug) this.#debug.debug("Added new "+this.#debugname+" to manager",[{key:"id",value:data.id.value},{key:"overwrite",value:"false"}])
this.#changeListeners.forEach((cb) => {
try{
cb(data)
}catch(err){
throw new ODSystemError("Failed to run manager onChange() listener.\n"+err)
}
})
})
//add listeners }
this.#addListeners.forEach((cb) => {
//emit change listeners
data.changed(() => {
//notify change in upper-manager (because data in this manager changed)
this._change()
this.#changeListeners.forEach((cb) => {
try{ try{
cb(data,true) cb(data)
}catch(err){ }catch(err){
throw new ODSystemError("Failed to run manager onAdd() listener.\n"+err) throw new ODSystemError("Failed to run manager onChange() listener.\n"+err)
} }
}) })
})
//notify change in upper-manager (because data added) //emit add listeners
this._change() this.#addListeners.forEach((cb) => {
try{
cb(data,didOverwrite)
}catch(err){
throw new ODSystemError("Failed to run manager onAdd() listener.\n"+err)
}
})
return true //notify change in upper-manager (because data added)
} this._change()
return didOverwrite
} }
/**Get data that matches the `ODId`. Returns the found data.*/ /**Get data that matches the `ODId`. Returns the found data.*/
get(id:ODValidId): DataType|null { get(id:ODValidId): DataType|null {
const newId = new ODId(id) const newId = new ODId(id)
const d = this.#data.find((a) => a.id.value == newId.value) const data = this.#data.get(newId.value)
if (d) return d if (data) return data
else{ else{
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.source) //DEPRECATED!!!
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.getNamespace())
if (!redirect) return null if (!redirect) return null
else{ else{
const redirectId = new ODId(redirect.toSource+":"+newId.identifier) const redirectId = new ODId(redirect.toSource+":"+newId.getIdentifier())
return this.get(redirectId) return this.get(redirectId)
} }
} }
} }
/**Remove data that matches the `ODId`. Returns the removed data.*/ /**Remove data that matches the `ODId`. Returns the removed data. */
remove(id:ODValidId): DataType|null { remove(id:ODValidId): DataType|null {
const newId = new ODId(id) const newId = new ODId(id)
const index = this.#data.findIndex((a) => a.id.value == newId.value) const data = this.#data.get(newId.value)
if (index < 0){
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.source) if (!data){
//DEPRECATED!!!
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.getNamespace())
if (!redirect){ if (!redirect){
if (this.#debug) this.#debug.debug("Removed "+this.#debugname+" from manager",[{key:"id",value:newId.value},{key:"found",value:"false"}]) if (this.#debug) this.#debug.debug("Removed "+this.#debugname+" from manager",[{key:"id",value:newId.value},{key:"found",value:"false"}])
return null return null
}else{ }else{
const redirectId = new ODId(redirect.toSource+":"+newId.identifier) const redirectId = new ODId(redirect.toSource+":"+newId.getIdentifier())
return this.remove(redirectId) return this.remove(redirectId)
} }
}else{
this.#data.delete(newId.value)
if (this.#debug) this.#debug.debug("Removed "+this.#debugname+" from manager",[{key:"id",value:newId.value},{key:"found",value:"true"}])
} }
if (this.#debug) this.#debug.debug("Removed "+this.#debugname+" from manager",[{key:"id",value:newId.value},{key:"found",value:"true"}])
const data = this.#data.splice(index,1)[0]
//change listeners //remove all listeners
data.id.changed(null)
data.changed(null) data.changed(null)
//remove listeners //emit remove listeners
this.#removeListeners.forEach((cb) => { this.#removeListeners.forEach((cb) => {
try{ try{
cb(data) cb(data)
@@ -346,39 +381,40 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
return data return data
} }
/**Check if data that matches the `ODId` exists. Returns a boolean.*/ /**Check if data that matches the `ODId` exists. Returns a boolean. */
exists(id:ODValidId): boolean { exists(id:ODValidId): boolean {
const newId = new ODId(id) const newId = new ODId(id)
const d = this.#data.find((a) => a.id.value == newId.value) if (this.#data.has(newId.value)) return true
if (d) return true
else{ else{
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.source) //DEPRECATED!!!
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.getNamespace())
if (!redirect) return false if (!redirect) return false
else{ else{
const redirectId = new ODId(redirect.toSource+":"+newId.identifier) const redirectId = new ODId(redirect.toSource+":"+newId.getIdentifier())
return this.exists(redirectId) return this.exists(redirectId)
} }
} }
} }
/**Get all data inside this manager*/ /**Get all data inside this manager*/
getAll(): DataType[] { getAll(): DataType[] {
return [...this.#data] return Array.from(this.#data.values())
} }
/**Get all data that matches inside the filter function*/ /**Get all data that matches inside the filter function*/
getFiltered(predicate:(value:DataType, index:number, array:DataType[]) => unknown): DataType[] { getFiltered(predicate:(value:DataType, index:number, array:DataType[]) => unknown): DataType[] {
return this.#data.filter(predicate) return Array.from(this.#data.values()).filter(predicate)
} }
/**Get all data that matches the regex*/ /**Get all data where the `ODId` matches the provided RegExp. */
getRegex(regex:RegExp): DataType[] { getRegex(regex:RegExp): DataType[] {
return this.#data.filter((data) => regex.test(data.id.value)) return Array.from(this.#data.values()).filter((data) => regex.test(data.id.value))
} }
/**Get the length of the data inside this manager*/ /**Get the length/size/amount of the data inside this manager. */
getLength(){ getLength(){
return this.#data.length return this.#data.size
} }
/**Get a list of all the ids inside this manager*/ /**Get a list of all the ids inside this manager*/
getIds(): ODId[] { getIds(): ODId[] {
return this.#data.map((d) => d.id) const ids = Array.from(this.#data.keys())
return ids.map((id) => new ODId(id))
} }
/**Run an iterator over all data in this manager. This method also supports async-await behaviour!*/ /**Run an iterator over all data in this manager. This method also supports async-await behaviour!*/
async loopAll(cb:(data:DataType,id:ODId) => ODPromiseVoid): Promise<void> { async loopAll(cb:(data:DataType,id:ODId) => ODPromiseVoid): Promise<void> {
@@ -535,6 +571,52 @@ export class ODVersion extends ODManagerData {
return (v.toString() === this.toString()) return (v.toString() === this.toString())
}) })
} }
/**Check if this version is higher or equal to the provided `requirement`. */
min(requirement:string|ODVersion){
if (typeof requirement == "string") requirement = ODVersion.fromString("temp",requirement)
//skip when primary version is higher or lower than current one.
if (this.primary < requirement.primary) return false
else if (this.primary > requirement.primary) return true
//skip when secondary version is higher or lower than current one.
if (this.secondary < requirement.secondary) return false
else if (this.secondary > requirement.secondary) return true
//skip when tertiary version is higher or lower than current one.
if (this.tertiary < requirement.tertiary) return false
else if (this.tertiary > requirement.tertiary) return true
return true
}
/**Check if this version is lower or equal to the provided `requirement`. */
max(requirement:string|ODVersion){
if (typeof requirement == "string") requirement = ODVersion.fromString("temp",requirement)
//skip when primary version is higher or lower than current one.
if (this.primary < requirement.primary) return true
else if (this.primary > requirement.primary) return false
//skip when secondary version is higher or lower than current one.
if (this.secondary < requirement.secondary) return true
else if (this.secondary > requirement.secondary) return false
//skip when tertiary version is higher or lower than current one.
if (this.tertiary < requirement.tertiary) return true
else if (this.tertiary > requirement.tertiary) return false
return true
}
/**Check if this version is matches the major version (`vX.X`) of the provided `requirement`. */
major(requirement:string|ODVersion){
if (typeof requirement == "string") requirement = ODVersion.fromString("temp",requirement)
return (this.primary == requirement.primary && this.secondary == requirement.secondary)
}
/**Check if this version is matches the minor version (`vX.X.X`) of the provided `requirement`. */
minor(requirement:string|ODVersion){
if (typeof requirement == "string") requirement = ODVersion.fromString("temp",requirement)
return (this.primary == requirement.primary && this.secondary == requirement.secondary && this.tertiary == requirement.tertiary)
}
} }
/**## ODHTTPGetRequest `class` /**## ODHTTPGetRequest `class`
@@ -566,6 +648,8 @@ export class ODHTTPGetRequest {
this.throwOnError = throwOnError this.throwOnError = throwOnError
const newConfig = config ?? {} const newConfig = config ?? {}
newConfig.method = "GET" newConfig.method = "GET"
if (newConfig.headers) Object.assign(newConfig.headers,{"User-Agent":"OpenDiscordBots-OpenTicket/4.0.1"})
else newConfig.headers = {"User-Agent":"OpenDiscordBots-OpenTicket/4.0.1"}
this.config = newConfig this.config = newConfig
} }
@@ -619,6 +703,8 @@ export class ODHTTPPostRequest {
this.throwOnError = throwOnError this.throwOnError = throwOnError
const newConfig = config ?? {} const newConfig = config ?? {}
newConfig.method = "POST" newConfig.method = "POST"
if (newConfig.headers) Object.assign(newConfig.headers,{"User-Agent":"OpenDiscordBots-OpenTicket/4.0.1"})
else newConfig.headers = {"User-Agent":"OpenDiscordBots-OpenTicket/4.0.1"}
this.config = newConfig this.config = newConfig
} }
+276 -4
View File
@@ -210,7 +210,7 @@ export class ODButtonInstance {
*/ */
export class ODButton<Source extends string,Params> extends ODBuilderImplementation<ODButtonInstance,Source,Params,ODComponentBuildResult> { export class ODButton<Source extends string,Params> extends ODBuilderImplementation<ODButtonInstance,Source,Params,ODComponentBuildResult> {
/**Build this button & compile it for discord.js */ /**Build this button & compile it for discord.js */
async build(source:Source, params:Params){ async build(source:Source, params:Params): Promise<ODComponentBuildResult> {
if (this.didCache && this.cache && this.allowCache) return this.cache if (this.didCache && this.cache && this.allowCache) return this.cache
try { try {
@@ -245,6 +245,59 @@ export class ODButton<Source extends string,Params> extends ODBuilderImplementat
} }
} }
/**## ODQuickButton `class`
* This is an Open Ticket quick button builder.
*
* With this class, you can quickly create a button to use in a message.
* This quick button can be used by Open Ticket plugins instead of the normal builders to speed up the process!
*
* Because of the quick functionality, these buttons are less customisable by other plugins.
*/
export class ODQuickButton {
/**The id of this button. */
id: ODId
/**The current data of this button */
data: ODButtonData = {
customId:"",
mode:"button",
url:null,
color:null,
label:null,
emoji:null,
disabled:false
}
constructor(id:ODValidId,data:ODButtonData){
this.id = new ODId(id)
this.data = data
}
/**Build this button & compile it for discord.js */
async build(): Promise<ODComponentBuildResult> {
try {
//create the discord.js button
const button = new discord.ButtonBuilder()
if (this.data.mode == "button") button.setCustomId(this.data.customId)
if (this.data.mode == "url") button.setStyle(discord.ButtonStyle.Link)
else if (this.data.color == "gray") button.setStyle(discord.ButtonStyle.Secondary)
else if (this.data.color == "blue") button.setStyle(discord.ButtonStyle.Primary)
else if (this.data.color == "green") button.setStyle(discord.ButtonStyle.Success)
else if (this.data.color == "red") button.setStyle(discord.ButtonStyle.Danger)
if (this.data.url) button.setURL(this.data.url)
if (this.data.label) button.setLabel(this.data.label)
if (this.data.emoji) button.setEmoji(this.data.emoji)
if (this.data.disabled) button.setDisabled(this.data.disabled)
if (!this.data.emoji && !this.data.label) button.setLabel(this.data.customId)
return {id:this.id,component:button}
}catch(err){
process.emit("uncaughtException",new ODSystemError("ODQuickButton:build(\""+this.id.value+"\") => Major Error (see next error)"))
process.emit("uncaughtException",err)
return {id:this.id,component:null}
}
}
}
/**## ODDropdownManager `class` /**## ODDropdownManager `class`
* This is an Open Ticket dropdown manager. * This is an Open Ticket dropdown manager.
* *
@@ -403,7 +456,7 @@ export class ODDropdownInstance {
*/ */
export class ODDropdown<Source extends string,Params> extends ODBuilderImplementation<ODDropdownInstance,Source,Params,ODComponentBuildResult> { export class ODDropdown<Source extends string,Params> extends ODBuilderImplementation<ODDropdownInstance,Source,Params,ODComponentBuildResult> {
/**Build this dropdown & compile it for discord.js */ /**Build this dropdown & compile it for discord.js */
async build(source:Source, params:Params){ async build(source:Source, params:Params): Promise<ODComponentBuildResult> {
if (this.didCache && this.cache && this.allowCache) return this.cache if (this.didCache && this.cache && this.allowCache) return this.cache
try{ try{
@@ -499,6 +552,118 @@ export class ODDropdown<Source extends string,Params> extends ODBuilderImplement
} }
} }
/**## ODQuickDropdown `class`
* This is an Open Ticket quick dropdown builder.
*
* With this class, you can quickly create a dropdown to use in a message.
* This quick dropdown can be used by Open Ticket plugins instead of the normal builders to speed up the process!
*
* Because of the quick functionality, these dropdowns are less customisable by other plugins.
*/
export class ODQuickDropdown {
/**The id of this dropdown. */
id: ODId
/**The current data of this dropdown */
data: ODDropdownData = {
customId:"",
type:"string",
placeholder:null,
minValues:null,
maxValues:null,
disabled:false,
channelTypes:[],
options:[],
users:[],
roles:[],
channels:[],
mentionables:[]
}
constructor(id:ODValidId,data:ODDropdownData){
this.id = new ODId(id)
this.data = data
}
/**Build this dropdown & compile it for discord.js */
async build(): Promise<ODComponentBuildResult> {
try{
//create the discord.js dropdown
if (this.data.type == "string"){
const dropdown = new discord.StringSelectMenuBuilder()
dropdown.setCustomId(this.data.customId)
dropdown.setOptions(...this.data.options)
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
if (this.data.maxValues) dropdown.setMaxValues(this.data.maxValues)
if (this.data.disabled) dropdown.setDisabled(this.data.disabled)
return {id:this.id,component:dropdown}
}else if (this.data.type == "user"){
const dropdown = new discord.UserSelectMenuBuilder()
dropdown.setCustomId(this.data.customId)
if (this.data.users.length > 0) dropdown.setDefaultUsers(...this.data.users.map((u) => u.id))
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
if (this.data.maxValues) dropdown.setMaxValues(this.data.maxValues)
if (this.data.disabled) dropdown.setDisabled(this.data.disabled)
return {id:this.id,component:dropdown}
}else if (this.data.type == "role"){
const dropdown = new discord.RoleSelectMenuBuilder()
dropdown.setCustomId(this.data.customId)
if (this.data.roles.length > 0) dropdown.setDefaultRoles(...this.data.roles.map((r) => r.id))
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
if (this.data.maxValues) dropdown.setMaxValues(this.data.maxValues)
if (this.data.disabled) dropdown.setDisabled(this.data.disabled)
return {id:this.id,component:dropdown}
}else if (this.data.type == "channel"){
const dropdown = new discord.ChannelSelectMenuBuilder()
dropdown.setCustomId(this.data.customId)
if (this.data.channels.length > 0) dropdown.setDefaultChannels(...this.data.channels.map((c) => c.id))
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
if (this.data.maxValues) dropdown.setMaxValues(this.data.maxValues)
if (this.data.disabled) dropdown.setDisabled(this.data.disabled)
return {id:this.id,component:dropdown}
}else if (this.data.type == "mentionable"){
const dropdown = new discord.MentionableSelectMenuBuilder()
const values: ({type:discord.SelectMenuDefaultValueType.User,id:string}|{type:discord.SelectMenuDefaultValueType.Role,id:string})[] = []
this.data.mentionables.forEach((m) => {
if (m instanceof discord.User){
values.push({type:discord.SelectMenuDefaultValueType.User,id:m.id})
}else{
values.push({type:discord.SelectMenuDefaultValueType.Role,id:m.id})
}
})
dropdown.setCustomId(this.data.customId)
if (this.data.mentionables.length > 0) dropdown.setDefaultValues(...values)
if (this.data.placeholder) dropdown.setPlaceholder(this.data.placeholder)
if (this.data.minValues) dropdown.setMinValues(this.data.minValues)
if (this.data.maxValues) dropdown.setMaxValues(this.data.maxValues)
if (this.data.disabled) dropdown.setDisabled(this.data.disabled)
return {id:this.id,component:dropdown}
}else{
throw new Error("Tried to build an ODQuickDropdown with unknown type!")
}
}catch(err){
process.emit("uncaughtException",new ODSystemError("ODQuickDropdown:build(\""+this.id.value+"\") => Major Error (see next error)"))
process.emit("uncaughtException",err)
return {id:this.id,component:null}
}
}
}
/**## ODFileManager `class` /**## ODFileManager `class`
* This is an Open Ticket file manager. * This is an Open Ticket file manager.
* *
@@ -594,7 +759,7 @@ export class ODFileInstance {
*/ */
export class ODFile<Source extends string,Params> extends ODBuilderImplementation<ODFileInstance,Source,Params,ODFileBuildResult> { export class ODFile<Source extends string,Params> extends ODBuilderImplementation<ODFileInstance,Source,Params,ODFileBuildResult> {
/**Build this attachment & compile it for discord.js */ /**Build this attachment & compile it for discord.js */
async build(source:Source, params:Params){ async build(source:Source, params:Params): Promise<ODFileBuildResult> {
if (this.didCache && this.cache && this.allowCache) return this.cache if (this.didCache && this.cache && this.allowCache) return this.cache
try{ try{
@@ -622,6 +787,48 @@ export class ODFile<Source extends string,Params> extends ODBuilderImplementatio
} }
} }
/**## ODQuickFile `class`
* This is an Open Ticket quick file builder.
*
* With this class, you can quickly create a file to use in a message.
* This quick file can be used by Open Ticket plugins instead of the normal builders to speed up the process!
*
* Because of the quick functionality, these files are less customisable by other plugins.
*/
export class ODQuickFile {
/**The id of this file. */
id: ODId
/**The current data of this file */
data: ODFileData = {
file:"",
name:"file.txt",
description:null,
spoiler:false
}
constructor(id:ODValidId,data:ODFileData){
this.id = new ODId(id)
this.data = data
}
/**Build this attachment & compile it for discord.js */
async build(): Promise<ODFileBuildResult> {
try{
//create the discord.js attachment
const file = new discord.AttachmentBuilder(this.data.file)
file.setName(this.data.name ? this.data.name : "file.txt")
if (this.data.description) file.setDescription(this.data.description)
if (this.data.spoiler) file.setSpoiler(this.data.spoiler)
return {id:this.id,file}
}catch(err){
process.emit("uncaughtException",new ODSystemError("ODQuickFile:build(\""+this.id.value+"\") => Major Error (see next error)"))
process.emit("uncaughtException",err)
return {id:this.id,file:null}
}
}
}
/**## ODEmbedManager `class` /**## ODEmbedManager `class`
* This is an Open Ticket embed manager. * This is an Open Ticket embed manager.
* *
@@ -795,7 +1002,7 @@ export class ODEmbedInstance {
*/ */
export class ODEmbed<Source extends string,Params> extends ODBuilderImplementation<ODEmbedInstance,Source,Params,ODEmbedBuildResult> { export class ODEmbed<Source extends string,Params> extends ODBuilderImplementation<ODEmbedInstance,Source,Params,ODEmbedBuildResult> {
/**Build this embed & compile it for discord.js */ /**Build this embed & compile it for discord.js */
async build(source:Source, params:Params){ async build(source:Source, params:Params): Promise<ODEmbedBuildResult> {
if (this.didCache && this.cache && this.allowCache) return this.cache if (this.didCache && this.cache && this.allowCache) return this.cache
try{ try{
@@ -836,6 +1043,71 @@ export class ODEmbed<Source extends string,Params> extends ODBuilderImplementati
} }
} }
/**## ODQuickEmbed `class`
* This is an Open Ticket quick embed builder.
*
* With this class, you can quickly create a embed to use in a message.
* This quick embed can be used by Open Ticket plugins instead of the normal builders to speed up the process!
*
* Because of the quick functionality, these embeds are less customisable by other plugins.
*/
export class ODQuickEmbed {
/**The id of this embed. */
id: ODId
/**The current data of this embed */
data: ODEmbedData = {
title:null,
color:null,
url:null,
description:null,
authorText:null,
authorImage:null,
authorUrl:null,
footerText:null,
footerImage:null,
image:null,
thumbnail:null,
fields:[],
timestamp:null
}
constructor(id:ODValidId,data:ODEmbedData){
this.id = new ODId(id)
this.data = data
}
/**Build this embed & compile it for discord.js */
async build(): Promise<ODEmbedBuildResult> {
try{
//create the discord.js embed
const embed = new discord.EmbedBuilder()
if (this.data.title) embed.setTitle(this.data.title)
if (this.data.color) embed.setColor(this.data.color)
if (this.data.url) embed.setURL(this.data.url)
if (this.data.description) embed.setDescription(this.data.description)
if (this.data.authorText) embed.setAuthor({
name:this.data.authorText,
iconURL:this.data.authorImage ?? undefined,
url:this.data.authorUrl ?? undefined
})
if (this.data.footerText) embed.setFooter({
text:this.data.footerText,
iconURL:this.data.footerImage ?? undefined,
})
if (this.data.image) embed.setImage(this.data.image)
if (this.data.thumbnail) embed.setThumbnail(this.data.thumbnail)
if (this.data.timestamp) embed.setTimestamp(this.data.timestamp)
if (this.data.fields.length > 0) embed.setFields(this.data.fields)
return {id:this.id,embed}
}catch(err){
process.emit("uncaughtException",new ODSystemError("ODQuickEmbed:build(\""+this.id.value+"\") => Major Error (see next error)"))
process.emit("uncaughtException",err)
return {id:this.id,embed:null}
}
}
}
/**## ODMessageManager `class` /**## ODMessageManager `class`
* This is an Open Ticket message manager. * This is an Open Ticket message manager.
* *
+1 -1
View File
@@ -155,7 +155,7 @@ export class ODVersionMigration {
export const utilities: ODUtilities = { export const utilities: ODUtilities = {
project:"openticket", project:"openticket",
isBeta:true, isBeta:false,
moduleInstalled:(id:string) => { moduleInstalled:(id:string) => {
return moduleInstalled(id,false) return moduleInstalled(id,false)
}, },
+3
View File
@@ -5,7 +5,10 @@ export const loadVersionMigrationSystem = async () => {
await preloadMigrationContext() await preloadMigrationContext()
const lastVersion = await isMigrationRequired() const lastVersion = await isMigrationRequired()
//save last version to database (OR set to current version if no migration is required)
opendiscord.versions.add(lastVersion ? lastVersion : api.ODVersion.fromString("opendiscord:last-version",opendiscord.versions.get("opendiscord:version").toString())) opendiscord.versions.add(lastVersion ? lastVersion : api.ODVersion.fromString("opendiscord:last-version",opendiscord.versions.get("opendiscord:version").toString()))
if (lastVersion && !opendiscord.flags.get("opendiscord:no-migration").value){ if (lastVersion && !opendiscord.flags.get("opendiscord:no-migration").value){
//MIGRATION IS REQUIRED //MIGRATION IS REQUIRED
opendiscord.log("Detected old data!","info") opendiscord.log("Detected old data!","info")
+9 -6
View File
@@ -2,13 +2,16 @@ import {opendiscord, api, utilities} from "../../index"
export const migrations = [ export const migrations = [
//MIGRATE TO v4.0.0 //MIGRATE TO v4.0.0
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.0"),async () => { new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.0"),async () => {},async () => {}),
//MIGRATE BEFORE STARTUP
//nothing needs to be transferred :) //MIGRATE TO v4.0.1
},() => { new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.1"),async () => {},async () => {
//MIGRATE AFTER INITIAL STARTUP (plugins, flags, config, database, language, ... => loaded) //AFTER INIT MIGRATION
//nothing needs to be transferred :) //add opendiscord:panel-message properties for all existing panels.
const globalDatabase = opendiscord.databases.get("opendiscord:global")
for (const panel of (await globalDatabase.getCategory("opendiscord:panel-update") ?? [])){
globalDatabase.set("opendiscord:panel-message",panel.key,panel.value)
}
}) })
] ]
+2 -1
View File
@@ -14,8 +14,9 @@ export const loadAllPlugins = async () => {
const plugins = fs.readdirSync("./plugins") const plugins = fs.readdirSync("./plugins")
//check & validate //check & validate
plugins.forEach(async (p) => { plugins.forEach((p) => {
//prechecks //prechecks
if (p === ".DS_Store") return //ignore MacOS DS_Store file
if (!fs.statSync("./plugins/"+p).isDirectory()) return opendiscord.log("Plugin is not a directory, canceling plugin execution...","plugin",[ if (!fs.statSync("./plugins/"+p).isDirectory()) return opendiscord.log("Plugin is not a directory, canceling plugin execution...","plugin",[
{key:"plugin",value:"./plugins/"+p} {key:"plugin",value:"./plugins/"+p}
]) ])
+6 -4
View File
@@ -73,7 +73,7 @@ export const loadDatabaseCleanersCode = async () => {
const validPanels: string[] = [] const validPanels: string[] = []
//check global database for valid panel embeds //check global database for valid panel embeds
for (const panel of (await globalDatabase.getCategory("opendiscord:panel-update") ?? [])){ for (const panel of (await globalDatabase.getCategory("opendiscord:panel-message") ?? [])){
if (!validPanels.includes(panel.key)){ if (!validPanels.includes(panel.key)){
try{ try{
const splittedId = panel.key.split("_") const splittedId = panel.key.split("_")
@@ -84,15 +84,17 @@ export const loadDatabaseCleanersCode = async () => {
} }
//remove all unused panels //remove all unused panels
for (const panel of (await globalDatabase.getCategory("opendiscord:panel-update") ?? [])){ for (const panel of (await globalDatabase.getCategory("opendiscord:panel-message") ?? [])){
if (!validPanels.includes(panel.key)){ if (!validPanels.includes(panel.key)){
await globalDatabase.delete("opendiscord:panel-message",panel.key)
await globalDatabase.delete("opendiscord:panel-update",panel.key) await globalDatabase.delete("opendiscord:panel-update",panel.key)
} }
} }
//delete panel from database on delete //delete panel from database on delete
opendiscord.client.client.on("messageDelete",async (msg) => { opendiscord.client.client.on("messageDelete",async (msg) => {
if (await globalDatabase.exists("opendiscord:panel-update",msg.channel.id+"_"+msg.id)){ if (await globalDatabase.exists("opendiscord:panel-message",msg.channel.id+"_"+msg.id)){
await globalDatabase.delete("opendiscord:panel-message",msg.channel.id+"_"+msg.id)
await globalDatabase.delete("opendiscord:panel-update",msg.channel.id+"_"+msg.id) await globalDatabase.delete("opendiscord:panel-update",msg.channel.id+"_"+msg.id)
} }
}) })
@@ -484,7 +486,7 @@ const loadAutoCode = () => {
}) })
})) }))
//TICKET ANTI BUSY //TICKET ANTI BUSY (+ sync version of tickets with latest OT version in database)
opendiscord.code.add(new api.ODCode("opendiscord:ticket-anti-busy",-1,() => { opendiscord.code.add(new api.ODCode("opendiscord:ticket-anti-busy",-1,() => {
for (const ticket of opendiscord.tickets.getAll()){ for (const ticket of opendiscord.tickets.getAll()){
//free tickets from corruption due to opendiscord:busy variable //free tickets from corruption due to opendiscord:busy variable
+4
View File
@@ -25,6 +25,10 @@ export const loadAllLanguages = async () => {
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:hindi","hindi.json")) opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:hindi","hindi.json"))
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:lithuanian","lithuanian.json")) opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:lithuanian","lithuanian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:polish","polish.json")) opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:polish","polish.json"))
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:latvian","latvian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:norwegian","norwegian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:russian","russian.json"))
opendiscord.languages.add(new api.ODJsonLanguage("opendiscord:swedish","swedish.json"))
/** How to add more languages? /** How to add more languages?
* - Register the language to the manager (see above) * - Register the language to the manager (see above)
+1 -1
View File
@@ -25,7 +25,7 @@ export const loadTicket = async (ticket:api.ODTicketJson) => {
//check if option is of type "ticket" //check if option is of type "ticket"
if (configOption && !(configOption instanceof api.ODTicketOption)) throw new api.ODSystemError("Unable to load ticket because option is not of 'ticket' type!") if (configOption && !(configOption instanceof api.ODTicketOption)) throw new api.ODSystemError("Unable to load ticket because option is not of 'ticket' type!")
//manage backup option //manage backup option (+ sync version of options with latest OT version in database)
if (configOption) await optionDatabase.set("opendiscord:used-option",configOption.id.value,configOption.toJson(opendiscord.versions.get("opendiscord:version"))) if (configOption) await optionDatabase.set("opendiscord:used-option",configOption.id.value,configOption.toJson(opendiscord.versions.get("opendiscord:version")))
else if (backupOption) opendiscord.options.add(backupOption) else if (backupOption) opendiscord.options.add(backupOption)
else throw new api.ODSystemError("Unable to use backup option! Normal option not found in config!") else throw new api.ODSystemError("Unable to use backup option! Normal option not found in config!")
+1 -1
View File
@@ -20,7 +20,7 @@
INFORMATION: INFORMATION:
============ ============
Open Ticket v4.0.0 - © DJdj Development Open Ticket v4.0.1 - © DJdj Development
support us: https://github.com/sponsors/DJj123dj support us: https://github.com/sponsors/DJj123dj
discord: https://discord.dj-dj.be discord: https://discord.dj-dj.be
+5 -5
View File
@@ -1,13 +1,13 @@
[ [
{ {
"message":{ "message":{
"title":"Open Ticket Beta", "title":"Open Ticket v4.0",
"titleColor":"red", "titleColor":"red",
"description":"Hi there! You're using a beta version of the bot! Please report all bugs and errors to our discord server!", "description":"Open Ticket v4.0 has officially been released! Please give our project a star to help us grow!",
"descriptionColor":"normal" "descriptionColor":"normal"
}, },
"active":{ "active":{
"versions":["4.0.0"], "versions":["4.0.0","4.0.1","4.0.2","4.0.3","4.0.4"],
"languages":[], "languages":[],
"allLanguages":true, "allLanguages":true,
"usingPlugins":true, "usingPlugins":true,
@@ -23,11 +23,11 @@
"message":{ "message":{
"title":"Documentation", "title":"Documentation",
"titleColor":"blue", "titleColor":"blue",
"description":"There is currently no documentation available yet for OT v4 beta!", "description":"The official documentation for Open Ticket v4 is available at https://otdocs.dj-dj.be!",
"descriptionColor":"normal" "descriptionColor":"normal"
}, },
"active":{ "active":{
"versions":["4.0.0"], "versions":["4.0.0","4.0.1","4.0.2","4.0.3","4.0.4"],
"languages":[], "languages":[],
"allLanguages":true, "allLanguages":true,
"usingPlugins":true, "usingPlugins":true,