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
<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>
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)
- 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)
- 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.
### 📄 Requirements
- 📌 At least 2k subscribers!
- 📌 A little bit of channel activity! *(minimum 2 uploads/month)*
- 📌 Video length of at least 3 minutes!
- 📌 Provide a clear link to the Open Ticket repository!
- 📌 Recommended language is English!
- 📌 Recommended platform is YouTube!
- 📌 Must be for the latest version of Open Ticket!
- 📌 **(OPTIONAL)** Speech in the video *(AI is allowed)*
- 📌 Video length of at least 2 minutes.
- 📌 Provide a link to the Open Ticket repository in the description of the video.
- 📌 Please use the latest version of Open Ticket available at the time of making the video.
- 📌 **(Optional)** Recommended language is English.
- 📌 **(Optional)** Recommended platform is YouTube!
- 📌 **(Optional)** Speech in the video *(AI is allowed)*
### 🎁 Rewards
+1 -1
View File
@@ -1,7 +1,7 @@
# Contributing Guidelines
<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>
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
<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>
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>
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)**
- 🚧 Maintenance **(support, docs, html transcripts)**
- 🟧 Deprecated **(docs)**
@@ -19,12 +19,12 @@ This list will be updated on every release.
| Version | Supported | Notes |
|------------|-----------|--------------------------------|
| 4.0.0-beta | 🟦 | For v4.0.0 Full Release |
| 3.5.8 | ✅ | Supported until October 2024 |
| 3.5.7 | ✅ | Supported until September 2024 |
| 3.5.6 | 🟧 | Documentation Only |
| < 3.5.6 | 🟧 | Documentation Only |
| < 3.5.0 | ❌ | |
| 4.1.0 | 🟦 | |
| 4.0.1 | ✅ | |
| 4.0.0 | ✅ | |
| 3.5.9 | 🚧 | Supported until May 2025 (LTS) |
| 3.5.8 | 🟧 | Documentation Only |
| < 3.5.8 | ❌ | |
### 🕷️ Reporting Vulnerabilities
You can report vulnerabilities, errors & bugs using one of the following methods:
+19 -16
View File
@@ -8,16 +8,19 @@
<br>Powered By<br>
<img src="https://apis.dj-dj.be/cdn/opendiscord/logo.png" alt="Open Ticket" width="170px"><br>
<a href="https://discord.com/invite/26vT9wt3n3"><img alt="Discord Invite Link" src="https://img.shields.io/badge/discord-support%20server-5865F2.svg?style=flat-square&logo=discord"></img></a>
<a href="https://github.com/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://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>
<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://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 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!
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 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
- **🦇 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!
- **🔒 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**)
- **📄 HTML transcripts** - Make use of the most customisable, beautiful and easy-to-use HTML Transcripts!
- **✅ ticket actions** - Close, Reopen, Delete, Rename & Move all your tickets!
- **🇬🇧 translation** - Open Ticket has been translated in more than **22 languages** by our community!
- **✅ ticket actions** - Close, Reopen, Delete, Claim, Pin, Rename & Move all your tickets!
- **🇬🇧 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!
- **🖥️ interactions** - The bot has full support for Buttons, Dropdowns, Slash Commands and Modals!
- **∞ 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 might not be accurate yet! *(because v4 is still in beta)*<br>
> <a href="https://www.youtube.com/watch?v=2jK9kAf6ASU"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-tutorial.png" alt="Open Ticket Tutorial" width="180px"></a>
> <a href="https:/otdocs.dj-dj.be"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-docs.png" alt="Open Ticket Docs" width="180px"></a>
> <a href="https://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>
### ❤️ 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. |
|[`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-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. |
|[`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-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. |
|[`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-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-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-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-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-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. |
@@ -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 |
|🇱🇹 Lithuanian |tsgindrius |🟢 Up To Date |
|🇵🇱 Polish |danoglez |🟢 Up To Date |
|🇪🇪 Estonian |iamnotmega |🔵 Up To Date (ChatGPT) |
|🇫🇮 Finnish |iamnotmega |🔵 Up To Date (ChatGPT) |
|🇷🇺 Russian |/ |🔴 Missing |
|🇳🇴 Norwegian |/ |🔴 Missing |
|🇱🇻 Latvian |/ |🔴 Missing |
|🇳🇴 Norwegian |NoOneNook |🟢 Up To Date |
|🇸🇪 Swedish |NoOneNook |🟢 Up To Date |
|🇪🇪 Estonian |iamnotmega |🔵 Up To Date (AI) |
|🇫🇮 Finnish |iamnotmega |🔵 Up To Date (AI) |
|🇷🇺 Russian |NoOneNook |🔵 Up To Date (AI) |
|🇱🇻 Latvian |NoOneNook |🔵 Up To Date (AI) |
|🇯🇵 Japanese |/ |🔴 Missing |
|🇰🇷 Korean |/ |🔴 Missing |
|🇨🇳 Simplified Chinese |/ |🔴 Missing |
|🇨🇳 Traditional Chinese|/ |🔴 Missing |
|🇸🇪 Swedish |/ |🔴 Missing |
|🇻🇳 Vietnamese |/ |🔴 Missing |
|🇸🇮 Slovenian |/ |🔴 Missing |
|🇬🇷 Greek |/ |🔴 Missing |
+1 -1
View File
@@ -2,7 +2,7 @@
"_INFO":{
"support":"https://otdocs.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')",
+1 -1
View File
@@ -17,7 +17,7 @@
"image":"https://www.example.com/image.png (or leave empty)",
"thumbnail":"https://www.example.com/image.png (or leave empty)",
"footer":"Open Ticket v4.0.0 (or leave empty)",
"footer":"Open Ticket v4.0.1 (or leave empty)",
"fields":[
{"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
Docs: https://otdocs.dj-dj.be
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.0",
"otversion": "v4.0.1",
"translators": ["palestinian"],
"lastedited": "06/12/2024",
"language": "Arabic",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["guillee3"],
"lastedited":"21/08/2024",
"language":"Catalan",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["DJj123dj"],
"lastedited":"21/08/2024",
"language":"Custom",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["spyeye_"],
"lastedited":"21/08/2024",
"language":"Czech",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["the_gamer"],
"lastedited":"26/09/2024",
"language":"Danish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["DJj123dj"],
"lastedited":"21/08/2024",
"language":"Dutch",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["DJj123dj"],
"lastedited":"21/08/2024",
"language":"English",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["iamnotmega","ChatGPT"],
"lastedited":"21/10/2024",
"language":"Estonian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["iamnotmega","ChatGPT"],
"lastedited":"21/10/2024",
"language":"Finnish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["guillee3"],
"lastedited":"04/12/2024",
"language":"French",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["benzorich"],
"lastedited":"06/10/2024",
"language":"German",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["an_developer"],
"lastedited":"14/12/2024",
"language":"Hindi",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["Kornel0706"],
"lastedited":"22/08/2024",
"language":"Hungarian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["erxg"],
"lastedited":"25/08/2024",
"language":"Indonesian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["fraden1mvp."],
"lastedited":"08/10/2024",
"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":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["TsgIndrius"],
"lastedited":"26/01/2025",
"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":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["DanoGlez"],
"lastedited":"28/01/2025",
"language":"Polish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["quiradon"],
"lastedited":"20/08/2024",
"language":"Portuguese",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["SankeDev"],
"lastedited":"27/08/2024",
"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":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["Redactado","Josuens"],
"lastedited":"22/08/2024",
"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":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["modshd"],
"lastedited":"13/11/2024",
"language":"Thai",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.0",
"otversion": "v4.0.1",
"translators": ["palestinian"],
"lastedited": "26/11/2024",
"language": "Turkish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.0",
"otversion":"v4.0.1",
"translators":["Anderskiy"],
"lastedited":"31/08/2024",
"language":"Ukrainian",
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "open-ticket",
"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! ",
"keywords": [
"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")
//update category
const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id)
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
if (claimCategory){
try {
channel.setParent(claimCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "claimed"
ticket.get("opendiscord:category").value = claimCategory
}catch(e){
opendiscord.log("Unable to move ticket to 'claimed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:claimCategory}
])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
if (params.allowCategoryChange){
const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id)
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
if (claimCategory){
try {
channel.setParent(claimCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "claimed"
ticket.get("opendiscord:category").value = claimCategory
}catch(e){
opendiscord.log("Unable to move ticket to 'claimed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:claimCategory}
])
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")
//update category
const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value
if (closeCategory !== ""){
try {
channel.setParent(closeCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "closed"
ticket.get("opendiscord:category").value = closeCategory
}catch(e){
opendiscord.log("Unable to move ticket to 'closed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:closeCategory}
])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
if (params.allowCategoryChange){
const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value
if (closeCategory !== ""){
try {
channel.setParent(closeCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "closed"
ticket.get("opendiscord:category").value = closeCategory
}catch(e){
opendiscord.log("Unable to move ticket to 'closed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"categoryid",value:closeCategory}
])
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")
//update category
const channelCategory = ticket.option.get("opendiscord:channel-category").value
const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value
if (channelCategory !== ""){
//category enabled
try {
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
opendiscord.log("Ticket Reopening Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
}else{
//default category was found
if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
//use backup category
const backupCategory = await 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
}
if (params.allowCategoryChange){
const channelCategory = ticket.option.get("opendiscord:channel-category").value
const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value
if (channelCategory !== ""){
//category enabled
try {
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
opendiscord.log("Ticket Reopening Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
}else{
//use default category
channel.setParent(normalCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "normal"
ticket.get("opendiscord:category").value = normalCategory.id
//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{
//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){
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"))
}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 permissions
+46 -44
View File
@@ -22,54 +22,56 @@ export const registerActions = async () => {
ticket.get("opendiscord:busy").value = true
//update category
const channelCategory = ticket.option.get("opendiscord:channel-category").value
const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value
if (channelCategory !== ""){
//category enabled
try {
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
opendiscord.log("Ticket Unclaiming Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
}else{
//default category was found
if (normalCategory.children.cache.size >= 49 && channelBackupCategory != ""){
//use backup category
const backupCategory = await 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
}
if (params.allowCategoryChange){
const channelCategory = ticket.option.get("opendiscord:channel-category").value
const channelBackupCategory = ticket.option.get("opendiscord:channel-category-backup").value
if (channelCategory !== ""){
//category enabled
try {
const normalCategory = await opendiscord.client.fetchGuildCategoryChannel(guild,channelCategory)
if (!normalCategory){
//default category was not found
opendiscord.log("Ticket Unclaiming Error: Unable to find category! #1","error",[
{key:"categoryid",value:channelCategory},
{key:"backup",value:"false"}
])
}else{
//use default category
channel.setParent(normalCategory,{lockPermissions:false})
ticket.get("opendiscord:category-mode").value = "normal"
ticket.get("opendiscord:category").value = normalCategory.id
//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{
//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 'unclaimed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true}
])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}catch(e){
opendiscord.log("Unable to move ticket to 'unclaimed category'!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true}
])
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
+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}))
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)){
const globalDatabase = opendiscord.databases.get("opendiscord:global")
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}))
}
//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":{
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:{},
workers:"opendiscord:close-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
},
@@ -48,19 +48,19 @@ export interface ODActionManagerIds_Default {
},
"opendiscord:reopen-ticket":{
source:"slash"|"text"|"ticket-message"|"close-message"|"autoclose-message"|"other",
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{},
workers:"opendiscord:reopen-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
},
"opendiscord:claim-ticket":{
source:"slash"|"text"|"ticket-message"|"unclaim-message"|"other",
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{},
workers:"opendiscord:claim-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
},
"opendiscord:unclaim-ticket":{
source:"slash"|"text"|"ticket-message"|"claim-message"|"other",
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean},
params:{guild:discord.Guild,channel:discord.GuildTextBasedChannel,user:discord.User,ticket:ODTicket,reason:string|null,sendMessage:boolean,allowCategoryChange?:boolean},
result:{},
workers:"opendiscord:unclaim-ticket"|"opendiscord:discord-logs"|"opendiscord:logs"
},
+141 -122
View File
@@ -325,6 +325,31 @@ export interface ODJsonConfig_DefaultOptionPingSettingsType {
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`
* 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. */
questions:string[],
/**All settings related to the ticket channel itself. */
channel:{
/**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
},
channel:ODJsonConfig_DefaultOptionTicketChannelType,
/**All settings related to the message sent in DM to the creator when the ticket is created. */
dmMessage:{
/**Enable this message. */
@@ -495,6 +500,30 @@ export interface ODJsonConfig_DefaultPanelEmbedSettingsType {
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`
* 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,
/**The embed of this panel. */
embed:ODJsonConfig_DefaultPanelEmbedSettingsType,
settings:{
/**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
}
/**A collection of additional settings for extra customisation in a panel. */
settings:ODJsonConfig_DefaultPanelSettingsType
}
/**## ODJsonConfig_DefaultPanels `default_class`
@@ -544,6 +555,18 @@ export class ODJsonConfig_DefaultPanels extends ODJsonConfig {
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`
* 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,
/**A placeholder for the question. */
placeholder:string,
/**Settings related to the length of the input. */
length:{
/**Enable text length verification. */
enabled:boolean,
/**The minimum text input length. */
min:number,
/**The maximum text input length. */
max:number
}
/**A collection of settings related to length validation in a question. */
length:ODJSonConfig_DefaultQuestionLengthSettings
}
/**## ODJsonConfig_DefaultParagraphQuestionType `interface`
@@ -585,15 +601,8 @@ export interface ODJsonConfig_DefaultParagraphQuestionType {
required:boolean,
/**A placeholder for the question. */
placeholder:string,
/**Settings related to the length of the input. */
length:{
/**Enable text length verification. */
enabled:boolean,
/**The minimum text input length. */
min:number,
/**The maximum text input length. */
max:number
}
/**A collection of settings related to length validation in a question. */
length:ODJSonConfig_DefaultQuestionLengthSettings
}
/**## 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`
* This is a special class that adds type definitions & typescript to the ODJsonConfig class.
* It doesn't add any extra features!
@@ -648,69 +728,8 @@ export class ODJsonConfig_DefaultTranscripts extends ODJsonConfig {
includeTicketStats:boolean
},
/**The layout of the text transcripts. */
textTranscriptStyle:{
/**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
},
textTranscriptStyle:ODJsonConfig_DefaultTranscriptsTextLayout,
/**The layout of the HTML transcripts. */
htmlTranscriptStyle:{
/**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
}
}
htmlTranscriptStyle:ODJsonConfig_DefaultTranscriptsHtmlLayout
}
}
+1
View File
@@ -52,6 +52,7 @@ export class ODDatabaseManager_Default extends ODDatabaseManager {
* It's used to generate typescript declarations for this class.
*/
export interface ODFormattedJsonDatabaseIds_DefaultGlobal {
"opendiscord:panel-message":string,
"opendiscord:panel-update":string,
"opendiscord:option-suffix-counter":number,
"opendiscord:option-suffix-history":string[],
+4
View File
@@ -467,6 +467,10 @@ export interface ODLanguageManagerIds_Default {
"opendiscord:hindi":ODLanguage,
"opendiscord:lithuanian":ODLanguage,
"opendiscord:polish":ODLanguage,
"opendiscord:latvian":ODLanguage,
"opendiscord:norwegian":ODLanguage,
"opendiscord:russian":ODLanguage,
"opendiscord:swedish":ODLanguage,
//ADD NEW LANGUAGES HERE!!!
}
+1 -1
View File
@@ -130,7 +130,7 @@ export class ODMain {
constructor(){
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:transcripts","v2.0.0"))
this.versions.add(ODVersion.fromString("opendiscord:livestatus","v2.0.0"))
+176 -90
View File
@@ -54,11 +54,27 @@ export type ODDiscordIdType = "role"|"server"|"channel"|"category"|"user"|"membe
*/
export class ODId {
/**The full value of this `ODId` as a `string`. */
value: string
/**The source of the id (text before `:`). (e.g. `openticket` for all built-in ids) */
#value: string
/**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
/**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
/**The change listener for the parent `ODManager` of this `ODId`. */
#change: ((oldId:string,newId:string) => void)|null = null
constructor(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+")'")
const splitted = this.value.split(":")
const splitted = this.#value.split(":")
if (splitted.length > 1){
this.source = splitted[0]
splitted.shift()
@@ -88,7 +104,7 @@ export class ODId {
}
}else{
//id is ODId
this.value = id.value
this.#value = id.#value
this.source = id.source
this.identifier = id.identifier
}
@@ -96,7 +112,36 @@ export class ODId {
/**Returns a string representation of this id. (same as `this.value`) */
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`
* @deprecated ### Will be removed in Open Ticket `v4.1.0`!
*
* This is Open Ticket ticket manager redirect helper.
*
* 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
/**The message to send when debugging this manager. */
#debugname?: string
/**An array storing all data classes ❌ **(don't edit unless really needed!)***/
#data: DataType[] = []
/**The map storing all data classes in this manager. */
#data: Map<string,DataType> = new Map()
/**An array storing all listeners when data is added. */
#addListeners: ODManagerAddCallback<DataType>[] = []
/**An array storing all listeners when data has changed. */
@@ -223,7 +270,7 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
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 {
//repeat same command when data is an array
if (Array.isArray(data)){
@@ -233,106 +280,94 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
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
const existIndex = this.#data.findIndex((d) => d.id.value === data.id.value)
if (existIndex < 0){
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{
let didOverwrite: boolean
if (this.#data.has(data.id.value)){
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"}])
//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)
}
})
})
}else{
this.#data.set(data.id.value,data)
didOverwrite = false
if (this.#debug) this.#debug.debug("Added new "+this.#debugname+" to manager",[{key:"id",value:data.id.value},{key:"overwrite",value:"false"}])
}
//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{
cb(data,true)
cb(data)
}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)
this._change()
return true
}
//emit add listeners
this.#addListeners.forEach((cb) => {
try{
cb(data,didOverwrite)
}catch(err){
throw new ODSystemError("Failed to run manager onAdd() listener.\n"+err)
}
})
//notify change in upper-manager (because data added)
this._change()
return didOverwrite
}
/**Get data that matches the `ODId`. Returns the found data.*/
get(id:ODValidId): DataType|null {
const newId = new ODId(id)
const d = this.#data.find((a) => a.id.value == newId.value)
if (d) return d
const data = this.#data.get(newId.value)
if (data) return data
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
else{
const redirectId = new ODId(redirect.toSource+":"+newId.identifier)
const redirectId = new ODId(redirect.toSource+":"+newId.getIdentifier())
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 {
const newId = new ODId(id)
const index = this.#data.findIndex((a) => a.id.value == newId.value)
if (index < 0){
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.source)
const data = this.#data.get(newId.value)
if (!data){
//DEPRECATED!!!
const redirect = this.redirects.list().find((redirect) => redirect.fromSource === newId.getNamespace())
if (!redirect){
if (this.#debug) this.#debug.debug("Removed "+this.#debugname+" from manager",[{key:"id",value:newId.value},{key:"found",value:"false"}])
return null
}else{
const redirectId = new ODId(redirect.toSource+":"+newId.identifier)
const redirectId = new ODId(redirect.toSource+":"+newId.getIdentifier())
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)
//remove listeners
//emit remove listeners
this.#removeListeners.forEach((cb) => {
try{
cb(data)
@@ -346,39 +381,40 @@ export class ODManager<DataType extends ODManagerData> extends ODManagerChangeHe
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 {
const newId = new ODId(id)
const d = this.#data.find((a) => a.id.value == newId.value)
if (d) return true
if (this.#data.has(newId.value)) return true
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
else{
const redirectId = new ODId(redirect.toSource+":"+newId.identifier)
const redirectId = new ODId(redirect.toSource+":"+newId.getIdentifier())
return this.exists(redirectId)
}
}
}
/**Get all data inside this manager*/
getAll(): DataType[] {
return [...this.#data]
return Array.from(this.#data.values())
}
/**Get all data that matches inside the filter function*/
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[] {
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(){
return this.#data.length
return this.#data.size
}
/**Get a list of all the ids inside this manager*/
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!*/
async loopAll(cb:(data:DataType,id:ODId) => ODPromiseVoid): Promise<void> {
@@ -535,6 +571,52 @@ export class ODVersion extends ODManagerData {
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`
@@ -566,6 +648,8 @@ export class ODHTTPGetRequest {
this.throwOnError = throwOnError
const newConfig = config ?? {}
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
}
@@ -619,6 +703,8 @@ export class ODHTTPPostRequest {
this.throwOnError = throwOnError
const newConfig = config ?? {}
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
}
+276 -4
View File
@@ -210,7 +210,7 @@ export class ODButtonInstance {
*/
export class ODButton<Source extends string,Params> extends ODBuilderImplementation<ODButtonInstance,Source,Params,ODComponentBuildResult> {
/**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
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`
* 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> {
/**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
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`
* 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> {
/**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
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`
* 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> {
/**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
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`
* This is an Open Ticket message manager.
*
+1 -1
View File
@@ -155,7 +155,7 @@ export class ODVersionMigration {
export const utilities: ODUtilities = {
project:"openticket",
isBeta:true,
isBeta:false,
moduleInstalled:(id:string) => {
return moduleInstalled(id,false)
},
+3
View File
@@ -5,7 +5,10 @@ export const loadVersionMigrationSystem = async () => {
await preloadMigrationContext()
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()))
if (lastVersion && !opendiscord.flags.get("opendiscord:no-migration").value){
//MIGRATION IS REQUIRED
opendiscord.log("Detected old data!","info")
+10 -7
View File
@@ -2,13 +2,16 @@ import {opendiscord, api, utilities} from "../../index"
export const migrations = [
//MIGRATE TO v4.0.0
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.0"),async () => {
//MIGRATE BEFORE STARTUP
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.0"),async () => {},async () => {}),
//MIGRATE TO v4.0.1
new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.1"),async () => {},async () => {
//AFTER INIT MIGRATION
//nothing needs to be transferred :)
},() => {
//MIGRATE AFTER INITIAL STARTUP (plugins, flags, config, database, language, ... => loaded)
//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")
//check & validate
plugins.forEach(async (p) => {
plugins.forEach((p) => {
//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",[
{key:"plugin",value:"./plugins/"+p}
])
+6 -4
View File
@@ -73,7 +73,7 @@ export const loadDatabaseCleanersCode = async () => {
const validPanels: string[] = []
//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)){
try{
const splittedId = panel.key.split("_")
@@ -84,15 +84,17 @@ export const loadDatabaseCleanersCode = async () => {
}
//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)){
await globalDatabase.delete("opendiscord:panel-message",panel.key)
await globalDatabase.delete("opendiscord:panel-update",panel.key)
}
}
//delete panel from database on delete
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)
}
})
@@ -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,() => {
for (const ticket of opendiscord.tickets.getAll()){
//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:lithuanian","lithuanian.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?
* - 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"
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")))
else if (backupOption) opendiscord.options.add(backupOption)
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:
============
Open Ticket v4.0.0 - © DJdj Development
Open Ticket v4.0.1 - © DJdj Development
support us: https://github.com/sponsors/DJj123dj
discord: https://discord.dj-dj.be
+5 -5
View File
@@ -1,13 +1,13 @@
[
{
"message":{
"title":"Open Ticket Beta",
"title":"Open Ticket v4.0",
"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"
},
"active":{
"versions":["4.0.0"],
"versions":["4.0.0","4.0.1","4.0.2","4.0.3","4.0.4"],
"languages":[],
"allLanguages":true,
"usingPlugins":true,
@@ -23,11 +23,11 @@
"message":{
"title":"Documentation",
"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"
},
"active":{
"versions":["4.0.0"],
"versions":["4.0.0","4.0.1","4.0.2","4.0.3","4.0.4"],
"languages":[],
"allLanguages":true,
"usingPlugins":true,