Compare commits

..
107 Commits
Author SHA1 Message Date
Jasper 90851f881d Open Ticket v4.1.2
Open Ticket v4.1.2
2026-02-06 21:25:32 +01:00
DJj123dj b972c97871 Fixed: Unknown interaction when on cooldown 2026-02-06 21:16:30 +01:00
DJj123dj db94f226fb Fixed: Panel embed was replaced with cooldown error 2026-02-06 20:59:36 +01:00
DJj123dj 6a4f40d862 (v4.1.2) Readme updates & general improvements 2026-02-06 20:48:21 +01:00
DJj123dj 1f402a848e (v4.1.2) Massive permission system cleanup 2026-02-06 20:08:55 +01:00
DJj123dj 24d98aeaeb (v4.1.2) Fixed autocomplete bug with many options 2026-02-06 17:45:31 +01:00
DJj123dj b95b8f239e Fixed typescript compilation error 2026-01-01 23:00:29 +01:00
DJj123dj 488b5fce53 Fixed fetch() errors of unknown guild members 2025-12-27 10:42:10 +01:00
DJj123dj c2117a67ed Updated German translation for v4.1 2025-12-03 16:20:17 +01:00
Jasper d31be1bb57 Open Ticket v4.1.1
Open Ticket v4.1.1
2025-11-16 11:44:45 +01:00
DJj123dj 76095bea30 Update README.md 2025-11-16 11:33:16 +01:00
DJj123dj da962c6c2e Major bugfixes & improvements for v4.1 2025-11-16 11:23:15 +01:00
DJj123dj a89d5c2149 Added 7 updated translations for v4.1 2025-11-16 10:43:46 +01:00
DJj123dj 7d5313c77e Open Ticket v4.1.1 2025-11-16 10:11:56 +01:00
Jasper 16f1be32a3 Open Ticket v4.1.0
Open Ticket v4.1.0
2025-11-09 19:11:57 +01:00
DJj123dj e1a6feea6e Updated README.md language list 2025-11-09 19:05:53 +01:00
DJj123dj 9668851a82 Added 9 updated translations for v4.1 2025-11-09 13:04:51 +01:00
DJj123dj 68d6a2df3f Added language merge utility tool 2025-11-09 12:51:18 +01:00
DJj123dj f835850b3f Translated code strings using language manager 2025-11-09 12:50:57 +01:00
Jasper f7fa0998b6 v4.1 Minor Bugfixes
v4.1 Minor Bugfixes
2025-11-05 14:55:05 +01:00
JasperAtSchool 4416736947 Merge branch 'open-discord-bots:dev-v4.1.0' into dev-v4.1.0 2025-11-05 14:53:43 +01:00
JasperAtSchool 5494c1ad8f (v4.1) Minor Bugfixes 2025-11-05 14:53:05 +01:00
DJj123dj 4147658575 README Updates 2025-11-05 14:42:26 +01:00
DJj123dj f7cda48ed6 Improved LICENSE Terminology 2025-11-04 20:07:18 +01:00
DJj123dj 4b485adf82 (v4.1) Additional autoclose/autodelete features 2025-11-04 19:53:40 +01:00
DJj123dj e55438cc67 (v4.1) Added +/-10 Minor Features & Improvements 2025-11-04 19:39:52 +01:00
DJj123dj c7b44232c4 Added transfer command (/transfer) + new stats
With this command you're able to transfer the ticket ownership to another person in the server.
2025-11-02 20:09:38 +01:00
DJj123dj 68a8170570 Minor bugfixes & improvements (priority & topic) 2025-11-02 20:08:57 +01:00
DJj123dj 34ed4edede Added priority commands (/priority get,set) 2025-11-02 18:41:46 +01:00
DJj123dj a40a9b8be8 Added channel topic command (/topic set) 2025-11-02 18:40:49 +01:00
DJj123dj e8f96ef84f Finished channel topic feature 2025-10-28 13:24:08 +01:00
DJj123dj 8413d3c2b7 Started with channel topic auto-update action 2025-10-27 21:19:59 +01:00
DJj123dj 30b6ab4df6 Finished channel topic on ticket creation 2025-10-27 11:41:56 +01:00
DJj123dj 2aef855902 Started working on channel topic again 2025-10-12 22:18:38 +02:00
DJj123dj 4aacdd1607 fix: #122 improved windows OT plugin support
Open Ticket instances with plugins are now also able to exist outside of the default C:\\ drive on windows. This has been fixed by searching for the plugins relative to the bot instead of using an absolute path.
2025-09-21 20:31:47 +02:00
Jasper d66925a450 Added user-nickname channel suffix option 2025-09-14 22:23:42 +02:00
DJj123dj d2cd6be513 Small nickname suffix fixes & discord.js try-catch 2025-09-14 22:22:09 +02:00
DJj123dj 30a0a6c503 (API) Renamed ODPriority --> ODPriorityLevel 2025-09-14 22:09:09 +02:00
DJj123dj 72f84b2566 (API) Class & comment readability improvements 2025-09-14 22:05:30 +02:00
DJj123dj 6ce017b407 Added /topic set command (Part 1, Incomplete) 2025-09-14 22:04:42 +02:00
DJj123dj 415330be21 Added priority system (Part 1, Incomplete) 2025-09-14 22:04:11 +02:00
Steven DUBOIS 21ce2921a1 Add user-nickname option for channel suffixe 2025-09-10 18:38:57 +02:00
DJj123dj b07252151b #181 : Fixed async permission registration issues 2025-08-28 12:46:37 +02:00
DJj123dj 02d37dd177 (API) Implemented opendiscord:reopened in database 2025-08-28 11:25:18 +02:00
DJj123dj 706006e319 Added 9 new statistics in the /stats command
Ticket volume, Average tickets/user, System uptime, Current tickets, Ticket age, Message/Embed/File/Component amount.
2025-08-28 11:20:02 +02:00
DJj123dj 82f2aeaa90 Added autocomplete to panel, ticket & move cmds
Ticket/panel options are now autocompleted instead of being a choice in the slash commands. This also results in the max amount of tickets limit to be increased to infinity.
2025-08-28 09:00:07 +02:00
DJj123dj 793c6f0603 Added: Slow Mode & Updated discord.js 2025-08-28 08:59:16 +02:00
DJj123dj 1ef74f0b6b Custom reason for create-ticket-permissions action
Added support for custom reasons in the opendiscord:create-ticket-permissions action. Now it's easier for plugins to add a custom message when the validation fails.
2025-08-27 14:10:58 +02:00
DJj123dj 337dc3827e Refactor config checker children options
Made the "priority" and "optional" fields in ODCheckerObjectStructure children optional. This improves readability and code simplicity
2025-08-27 11:57:28 +02:00
DJj123dj 810db76e91 Finished adding 10 new config checker validators 2025-08-27 11:46:42 +02:00
DJj123dj f4f6f30fa2 Added: Show global admins in panel message 2025-08-12 14:19:18 +02:00
DJj123dj 8436b19cbf Updated bot versions to v4.1.0 2025-08-05 10:42:35 +02:00
DJj123dj 549c161830 Added all the new config variables for v4.1.0! 2025-08-05 10:42:15 +02:00
DJj123dj adc2433216 Merge branch 'dev' into dev-v4.1.0 2025-06-24 11:05:59 +02:00
DJj123dj 6df3498cb5 Finished autocomplete & context menu interactions
Autocomplete & context menu interactions have been fully implemented in the Open Discord framework. They have not yet been implemented in the Open Ticket bot code though.
2025-06-24 08:43:57 +02:00
DJj123dj 8116d4d8dd Startscreen plugin list rendering improvements 2025-06-21 22:17:31 +02:00
DJj123dj e987c176b7 Add autocomplete manager + context menu bugfixes 2025-06-21 22:16:50 +02:00
DJj123dj 2ea38cd7a5 (Open Discord) Added support for context menu's 2025-06-20 18:20:27 +02:00
DJj123dj b2f2ef3405 Update quickSetup.ts 2025-06-20 15:59:52 +02:00
DJj123dj c2e6f781b9 Finished Quick Setup CLI 2025-06-19 22:43:38 +02:00
DJj123dj 160f89c7cf Improved inline contributor guides
Improved the inline contributor guides for registering new languages, config variables & commands.
2025-06-16 20:11:00 +02:00
DJj123dj 51c4ae0229 Finished Interactive Update CLI Questions
Added all remaining questions including panel configuration, ticket message layout, ticket limits, emoji style & more. Also fixed some smaller bugs.
2025-06-16 20:10:09 +02:00
DJj123dj 2cc2ccc68e Added ODQuickMessage builders 2025-06-16 17:45:28 +02:00
DJj123dj 0a29e13640 Added new questions to quick setup CLI + fixes
Added question 12, 13 & 14 (autoclose, cooldown, close participants policy. Also fixed backFn-bugs and rewrote a few sentences for better spelling. Also added some UI improvements to string-inputs
2025-06-16 15:37:57 +02:00
DJj123dj 31b94718f1 Repositioned + Tested Reaction Role Logs 2025-06-16 14:47:09 +02:00
Jasper 6ac993617e Merge pull #176 from sdehaarte (Reaction Role Logs)
Added Reaction Role Logs
2025-06-16 14:44:08 +02:00
sdehaarte 9f4999b89b Feature Reaction Role Logs. Adds logging functionality for reaction roles. This helps track when users add or remove reaction roles. 2025-06-11 20:06:43 -04:00
DJj123dj dd3c159413 Added new questions to quick setup CLI
Added: channel logs, ticket category, ticket creation count, ticket option configuration (name, descr, button, prefix & suffix)
2025-06-11 21:12:20 +02:00
DJj123dj 72627a7058 Added new config checker utility function
createTemporaryCheckerEnvironment() is able to help you with using `ODCheckerStructure` validators without officially registering them in opendiscord.checkers.
2025-06-11 21:10:29 +02:00
Jasper b683365126 Merge pull request #175 from JasperAtSchool/dev-v4.1.0
(v4.1) Added new string config checker validators (part 1)
2025-06-11 18:51:01 +02:00
JasperAtSchool 03b3495eb2 (v4.1) Added new string config checker validators 2025-06-06 11:14:21 +02:00
DJj123dj af0dc879c6 Merge branch 'dev' into dev-v4.1.0 2025-05-31 11:07:36 +02:00
DJj123dj c243d03216 Merge branch 'dev' into dev-v4.1.0 2025-05-03 21:15:03 +02:00
DJj123dj f117943e00 Added 6th, 7th & 8th questions to quick setup CLI 2025-05-02 17:51:52 +02:00
DJj123dj 951aff093a Added 4th & 5th questions to quick setup 2025-05-01 22:01:04 +02:00
DJj123dj 2acd185d6f Merge branch 'dev' into dev-v4.1.0 2025-05-01 14:26:41 +02:00
DJj123dj 2fbef46a53 Merge branch 'dev' of https://github.com/open-discord-bots/open-ticket into dev 2025-05-01 14:14:39 +02:00
Jasper 8df13b0d36 Open Ticket v4.1.0 Improvements + Minor Additions
Open Ticket v4.1.0 Improvements + Minor Additions
2025-05-01 13:52:45 +02:00
DJj123dj b5dd7158df Update README.md 2025-04-29 17:56:54 +02:00
DJj123dj 05919bb57e Update README.md 2025-04-29 17:51:39 +02:00
DJj123dj 1d6572aa36 Merge branch 'dev' of https://github.com/open-discord-bots/open-ticket into dev 2025-04-29 17:50:51 +02:00
JasperAtSchool 83080a6e4d Removed openticket -> opendiscord migration utils 2025-04-29 09:58:36 +02:00
JasperAtSchool 35fdafb21d Removed deprecated API classes + properties 2025-04-29 09:54:48 +02:00
JasperAtSchool a0e03be103 Added ordinal numbers to config checker. 2025-04-29 09:47:29 +02:00
Jasper d404f343e0 Sync Dev Branches
* Fixed bug due to discord.js new components

* Updated all versions to v4.0.3

* #155 : Fixed reply on creation when disabled.

Fixed a bug that caused the bot to send a partial ephemeral message while "replyOnTicketCreation" was disabled.
2025-04-28 18:30:43 +02:00
Jasper adf4acd443 Merge branch 'dev-v4.1.0' into dev 2025-04-28 18:30:21 +02:00
DJj123dj fd739054fd Added 3th & 4th question to Quick Setup CLI 2025-04-20 12:08:52 +02:00
DJj123dj 2d1724893e Update README.md 2025-04-20 11:14:19 +02:00
DJj123dj 7696202dec Updated Dutch Translations 2025-04-19 21:05:08 +02:00
DJj123dj e36c1992de Added 2nd question in the CLI quick setup 2025-04-17 18:38:54 +02:00
DJj123dj e73c8e9b3b Started with CLI "Quick Setup" feature. 2025-04-16 21:44:23 +02:00
DJj123dj ad623f9650 Finished display names + descriptions (Part 4) 2025-04-16 13:20:07 +02:00
DJj123dj 515b7e1ffc Added more display names + descriptions (Part 3) 2025-04-16 09:18:13 +02:00
DJj123dj 605173e788 Added more display names + descriptions (Part 2) 2025-04-15 22:36:58 +02:00
DJj123dj e129724c12 Added display values for all general.json settings 2025-04-14 14:53:31 +02:00
DJj123dj 49504bc3de Added formatters to all built-in config files.
Added formatters to all built-in JSON config files for the Open Ticket interactive CLI. The new save() feature from the ODJsonConfig class will be using this formatter to save the config to the filesystem.
2025-04-14 14:22:09 +02:00
Jasper f414fd77fc Synced Dev Branches
Sync Dev Branches
2025-04-13 21:11:40 +02:00
DJj123dj 5dcbcbfabc More CLI improvements + layout changes 2025-04-13 21:03:55 +02:00
DJj123dj 6ec228df53 Added 'save()' feature to configs + improvements 2025-04-13 21:03:45 +02:00
DJj123dj 1f3894141a Finished the 'edit config' module from the CLI 2025-04-13 10:33:01 +02:00
DJj123dj 9253377766 CLI improvements 2025-04-12 21:05:52 +02:00
DJj123dj 30352b570a Updated Interactive Setup CLI (Unfinished Part 2) 2025-04-08 13:51:01 +02:00
DJj123dj 1fddad1e96 Improved TS interfaces for the config checker 2025-04-08 13:49:59 +02:00
DJj123dj d545d21bb1 Update cli.ts 2025-04-07 16:47:57 +02:00
DJj123dj 5f79ae909b Added Interactive Setup CLI (Unfinished)
Added the first part of the interactive setup CLI. You can explore the interface but some parts will not work yet. It will also not save to the config file yet.

The "Quick Setup" & "Manage Plugins" parts of the CLI will arrive later this week.
2025-04-06 19:04:09 +02:00
DJj123dj 831e120093 Finished --silent flag 2025-04-05 22:18:45 +02:00
DJj123dj 376fa23288 Started working on --silent flag 2025-04-04 22:40:15 +02:00
158 changed files with 14273 additions and 5763 deletions
+649
View File
@@ -0,0 +1,649 @@
//@ts-check
const fjs = require("formatted-json-stringify")
const fs = require("fs")
const formatter = new fjs.ObjectFormatter(null,true,[
new fjs.ObjectFormatter("_TRANSLATION",true,[
new fjs.PropertyFormatter("otversion"),
new fjs.ArrayFormatter("translators",false,new fjs.PropertyFormatter(null)),
new fjs.PropertyFormatter("lastedited"),
new fjs.PropertyFormatter("language"),
new fjs.PropertyFormatter("automated"),
]),
new fjs.ObjectFormatter("checker",true,[
new fjs.ObjectFormatter("system",true,[
new fjs.PropertyFormatter("typeError"),
new fjs.PropertyFormatter("headerOpenTicket"),
new fjs.PropertyFormatter("typeWarning"),
new fjs.PropertyFormatter("typeInfo"),
new fjs.PropertyFormatter("headerConfigChecker"),
new fjs.PropertyFormatter("headerDescription"),
new fjs.PropertyFormatter("footerError"),
new fjs.PropertyFormatter("footerWarning"),
new fjs.PropertyFormatter("footerSupport"),
new fjs.PropertyFormatter("compactInformation"),
new fjs.PropertyFormatter("dataPath"),
new fjs.PropertyFormatter("dataDocs"),
new fjs.PropertyFormatter("dataMessages"),
]),
new fjs.ObjectFormatter("messages",true,[
new fjs.PropertyFormatter("stringTooShort"),
new fjs.PropertyFormatter("stringTooLong"),
new fjs.PropertyFormatter("stringLengthInvalid"),
new fjs.PropertyFormatter("stringStartsWith"),
new fjs.PropertyFormatter("stringEndsWith"),
new fjs.PropertyFormatter("stringContains"),
new fjs.PropertyFormatter("stringChoices"),
new fjs.PropertyFormatter("stringRegex"),
new fjs.PropertyFormatter("stringInvertedContains"),
new fjs.PropertyFormatter("stringLowercase"),
new fjs.PropertyFormatter("stringUppercase"),
new fjs.PropertyFormatter("stringSpecialCharacters"),
new fjs.PropertyFormatter("stringNoSpaces"),
new fjs.PropertyFormatter("stringCapitalWord"),
new fjs.PropertyFormatter("stringCapitalSentence"),
new fjs.PropertyFormatter("stringPunctuation"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("numberTooShort"),
new fjs.PropertyFormatter("numberTooLong"),
new fjs.PropertyFormatter("numberLengthInvalid"),
new fjs.PropertyFormatter("numberTooSmall"),
new fjs.PropertyFormatter("numberTooLarge"),
new fjs.PropertyFormatter("numberNotEqual"),
new fjs.PropertyFormatter("numberStep"),
new fjs.PropertyFormatter("numberStepOffset"),
new fjs.PropertyFormatter("numberStartsWith"),
new fjs.PropertyFormatter("numberEndsWith"),
new fjs.PropertyFormatter("numberContains"),
new fjs.PropertyFormatter("numberChoices"),
new fjs.PropertyFormatter("numberFloat"),
new fjs.PropertyFormatter("numberNegative"),
new fjs.PropertyFormatter("numberPositive"),
new fjs.PropertyFormatter("numberZero"),
new fjs.PropertyFormatter("numberNan"),
new fjs.PropertyFormatter("numberInvertedContains"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("booleanTrue"),
new fjs.PropertyFormatter("booleanFalse"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("arrayEmptyDisabled"),
new fjs.PropertyFormatter("arrayEmptyRequired"),
new fjs.PropertyFormatter("arrayTooShort"),
new fjs.PropertyFormatter("arrayTooLong"),
new fjs.PropertyFormatter("arrayLengthInvalid"),
new fjs.PropertyFormatter("arrayInvalidTypes"),
new fjs.PropertyFormatter("arrayDouble"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("discordInvalidId"),
new fjs.PropertyFormatter("discordInvalidIdOptions"),
new fjs.PropertyFormatter("discordInvalidToken"),
new fjs.PropertyFormatter("colorInvalid"),
new fjs.PropertyFormatter("emojiTooShort"),
new fjs.PropertyFormatter("emojiTooLong"),
new fjs.PropertyFormatter("emojiCustom"),
new fjs.PropertyFormatter("emojiInvalid"),
new fjs.PropertyFormatter("urlInvalid"),
new fjs.PropertyFormatter("urlInvalidHttp"),
new fjs.PropertyFormatter("urlInvalidProtocol"),
new fjs.PropertyFormatter("urlInvalidHostname"),
new fjs.PropertyFormatter("urlInvalidExtension"),
new fjs.PropertyFormatter("urlInvalidPath"),
new fjs.PropertyFormatter("idNotUnique"),
new fjs.PropertyFormatter("idNonExistent"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("invalidType"),
new fjs.PropertyFormatter("propertyMissing"),
new fjs.PropertyFormatter("propertyOptional"),
new fjs.PropertyFormatter("objectDisabled"),
new fjs.PropertyFormatter("nullInvalid"),
new fjs.PropertyFormatter("switchInvalidType"),
new fjs.PropertyFormatter("objectSwitchInvalid"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("invalidLanguage"),
new fjs.PropertyFormatter("invalidButton"),
new fjs.PropertyFormatter("unusedOption"),
new fjs.PropertyFormatter("unusedQuestion"),
new fjs.PropertyFormatter("dropdownOption"),
new fjs.PropertyFormatter("customInvalidVersion"),
]),
]),
new fjs.ObjectFormatter("actions",true,[
new fjs.ObjectFormatter("buttons",true,[
new fjs.PropertyFormatter("create"),
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("delete"),
new fjs.PropertyFormatter("reopen"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.PropertyFormatter("clear"),
new fjs.PropertyFormatter("helpSwitchSlash"),
new fjs.PropertyFormatter("helpSwitchText"),
new fjs.PropertyFormatter("helpPage"),
new fjs.PropertyFormatter("withReason"),
new fjs.PropertyFormatter("withoutTranscript"),
]),
new fjs.ObjectFormatter("titles",true,[
new fjs.PropertyFormatter("created"),
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("delete"),
new fjs.PropertyFormatter("reopen"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.PropertyFormatter("rename"),
new fjs.PropertyFormatter("move"),
new fjs.PropertyFormatter("add"),
new fjs.PropertyFormatter("remove"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("help"),
new fjs.PropertyFormatter("statsReset"),
new fjs.PropertyFormatter("blacklistAdd"),
new fjs.PropertyFormatter("blacklistRemove"),
new fjs.PropertyFormatter("blacklistGet"),
new fjs.PropertyFormatter("blacklistView"),
new fjs.PropertyFormatter("blacklistAddDm"),
new fjs.PropertyFormatter("blacklistRemoveDm"),
new fjs.PropertyFormatter("clear"),
new fjs.PropertyFormatter("clearTickets"),
new fjs.PropertyFormatter("roles"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("autoclose"),
new fjs.PropertyFormatter("autocloseEnabled"),
new fjs.PropertyFormatter("autocloseDisabled"),
new fjs.PropertyFormatter("autodelete"),
new fjs.PropertyFormatter("autodeleteEnabled"),
new fjs.PropertyFormatter("autodeleteDisabled"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("topicSet"),
new fjs.PropertyFormatter("prioritySet"),
new fjs.PropertyFormatter("priorityGet"),
new fjs.PropertyFormatter("transfer"),
]),
new fjs.ObjectFormatter("descriptions",true,[
new fjs.PropertyFormatter("create"),
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("delete"),
new fjs.PropertyFormatter("reopen"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.PropertyFormatter("rename"),
new fjs.PropertyFormatter("move"),
new fjs.PropertyFormatter("add"),
new fjs.PropertyFormatter("remove"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("helpExplanation"),
new fjs.PropertyFormatter("statsReset"),
new fjs.PropertyFormatter("statsError"),
new fjs.PropertyFormatter("blacklistAdd"),
new fjs.PropertyFormatter("blacklistRemove"),
new fjs.PropertyFormatter("blacklistGetSuccess"),
new fjs.PropertyFormatter("blacklistGetEmpty"),
new fjs.PropertyFormatter("blacklistViewEmpty"),
new fjs.PropertyFormatter("blacklistViewTip"),
new fjs.PropertyFormatter("clearVerify"),
new fjs.PropertyFormatter("clearReady"),
new fjs.PropertyFormatter("rolesEmpty"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("autocloseLeave"),
new fjs.PropertyFormatter("autocloseTimeout"),
new fjs.PropertyFormatter("autodeleteLeave"),
new fjs.PropertyFormatter("autodeleteTimeout"),
new fjs.PropertyFormatter("autocloseEnabled"),
new fjs.PropertyFormatter("autocloseDisabled"),
new fjs.PropertyFormatter("autodeleteEnabled"),
new fjs.PropertyFormatter("autodeleteDisabled"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("ticketMessageLimit"),
new fjs.PropertyFormatter("ticketMessageAutoclose"),
new fjs.PropertyFormatter("ticketMessageAutodelete"),
new fjs.PropertyFormatter("panelReady"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("topicSet"),
new fjs.PropertyFormatter("prioritySet"),
new fjs.PropertyFormatter("priorityGet"),
new fjs.PropertyFormatter("transfer"),
]),
new fjs.ObjectFormatter("modal",true,[
new fjs.PropertyFormatter("closePlaceholder"),
new fjs.PropertyFormatter("deletePlaceholder"),
new fjs.PropertyFormatter("reopenPlaceholder"),
new fjs.PropertyFormatter("claimPlaceholder"),
new fjs.PropertyFormatter("unclaimPlaceholder"),
new fjs.PropertyFormatter("pinPlaceholder"),
new fjs.PropertyFormatter("unpinPlaceholder"),
]),
new fjs.ObjectFormatter("logs",true,[
new fjs.PropertyFormatter("createLog"),
new fjs.PropertyFormatter("closeLog"),
new fjs.PropertyFormatter("closeDm"),
new fjs.PropertyFormatter("deleteLog"),
new fjs.PropertyFormatter("deleteDm"),
new fjs.PropertyFormatter("reopenLog"),
new fjs.PropertyFormatter("reopenDm"),
new fjs.PropertyFormatter("claimLog"),
new fjs.PropertyFormatter("claimDm"),
new fjs.PropertyFormatter("unclaimLog"),
new fjs.PropertyFormatter("unclaimDm"),
new fjs.PropertyFormatter("pinLog"),
new fjs.PropertyFormatter("pinDm"),
new fjs.PropertyFormatter("unpinLog"),
new fjs.PropertyFormatter("unpinDm"),
new fjs.PropertyFormatter("renameLog"),
new fjs.PropertyFormatter("renameDm"),
new fjs.PropertyFormatter("moveLog"),
new fjs.PropertyFormatter("moveDm"),
new fjs.PropertyFormatter("addLog"),
new fjs.PropertyFormatter("addDm"),
new fjs.PropertyFormatter("removeLog"),
new fjs.PropertyFormatter("removeDm"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("blacklistAddLog"),
new fjs.PropertyFormatter("blacklistRemoveLog"),
new fjs.PropertyFormatter("blacklistAddDm"),
new fjs.PropertyFormatter("blacklistRemoveDm"),
new fjs.PropertyFormatter("clearLog"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("transferLog"),
new fjs.PropertyFormatter("transferDm"),
new fjs.PropertyFormatter("prioritySetLog"),
new fjs.PropertyFormatter("prioritySetDm"),
new fjs.PropertyFormatter("roleUpdateLog"),
new fjs.PropertyFormatter("roleUpdateDm"),
]),
]),
new fjs.ObjectFormatter("transcripts",true,[
new fjs.ObjectFormatter("success",true,[
new fjs.PropertyFormatter("visit"),
new fjs.PropertyFormatter("ready"),
new fjs.PropertyFormatter("textFileDescription"),
new fjs.PropertyFormatter("htmlProgress"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("createdChannel"),
new fjs.PropertyFormatter("createdCreator"),
new fjs.PropertyFormatter("createdParticipant"),
new fjs.PropertyFormatter("createdActiveAdmin"),
new fjs.PropertyFormatter("createdEveryAdmin"),
new fjs.PropertyFormatter("createdOther"),
]),
new fjs.ObjectFormatter("errors",true,[
new fjs.PropertyFormatter("retry"),
new fjs.PropertyFormatter("continue"),
new fjs.PropertyFormatter("backup"),
new fjs.PropertyFormatter("error"),
new fjs.PropertyFormatter("title"),
]),
new fjs.ObjectFormatter("text",true,[
new fjs.PropertyFormatter("messagesTitle"),
new fjs.PropertyFormatter("embedTitle"),
new fjs.PropertyFormatter("fileTitle"),
new fjs.PropertyFormatter("fieldsTitle"),
new fjs.PropertyFormatter("reactionsTitle"),
new fjs.PropertyFormatter("statsTitle"),
new fjs.PropertyFormatter("emptyContent"),
new fjs.PropertyFormatter("noTitle"),
new fjs.PropertyFormatter("noDesc"),
]),
]),
new fjs.ObjectFormatter("errors",true,[
new fjs.ObjectFormatter("titles",true,[
new fjs.PropertyFormatter("internalError"),
new fjs.PropertyFormatter("optionMissing"),
new fjs.PropertyFormatter("optionInvalid"),
new fjs.PropertyFormatter("unknownCommand"),
new fjs.PropertyFormatter("noPermissions"),
new fjs.PropertyFormatter("unknownTicket"),
new fjs.PropertyFormatter("deprecatedTicket"),
new fjs.PropertyFormatter("unknownOption"),
new fjs.PropertyFormatter("unknownPanel"),
new fjs.PropertyFormatter("notInGuild"),
new fjs.PropertyFormatter("channelRename"),
new fjs.PropertyFormatter("busy"),
new fjs.PropertyFormatter("permissionError"),
]),
new fjs.ObjectFormatter("descriptions",true,[
new fjs.PropertyFormatter("askForInfo"),
new fjs.PropertyFormatter("askForInfoResolve"),
new fjs.PropertyFormatter("internalError"),
new fjs.PropertyFormatter("optionMissing"),
new fjs.PropertyFormatter("optionInvalid"),
new fjs.PropertyFormatter("optionInvalidChoose"),
new fjs.PropertyFormatter("unknownCommand"),
new fjs.PropertyFormatter("noPermissions"),
new fjs.PropertyFormatter("noPermissionsList"),
new fjs.PropertyFormatter("noPermissionsCooldown"),
new fjs.PropertyFormatter("noPermissionsBlacklist"),
new fjs.PropertyFormatter("noPermissionsLimitGlobal"),
new fjs.PropertyFormatter("noPermissionsLimitGlobalUser"),
new fjs.PropertyFormatter("noPermissionsLimitOption"),
new fjs.PropertyFormatter("noPermissionsLimitOptionUser"),
new fjs.PropertyFormatter("unknownTicket"),
new fjs.PropertyFormatter("deprecatedTicket"),
new fjs.PropertyFormatter("notInGuild"),
new fjs.PropertyFormatter("channelRename"),
new fjs.PropertyFormatter("channelRenameSource"),
new fjs.PropertyFormatter("busy"),
new fjs.PropertyFormatter("closeBeforeMessage"),
new fjs.PropertyFormatter("closeBeforeAdminMessage"),
new fjs.PropertyFormatter("unableToCreateTicket"),
]),
new fjs.ObjectFormatter("optionInvalidReasons",true,[
new fjs.PropertyFormatter("stringRegex"),
new fjs.PropertyFormatter("stringMinLength"),
new fjs.PropertyFormatter("stringMaxLength"),
new fjs.PropertyFormatter("numberInvalid"),
new fjs.PropertyFormatter("numberMin"),
new fjs.PropertyFormatter("numberMax"),
new fjs.PropertyFormatter("numberDecimal"),
new fjs.PropertyFormatter("numberNegative"),
new fjs.PropertyFormatter("numberPositive"),
new fjs.PropertyFormatter("numberZero"),
new fjs.PropertyFormatter("channelNotFound"),
new fjs.PropertyFormatter("userNotFound"),
new fjs.PropertyFormatter("roleNotFound"),
new fjs.PropertyFormatter("memberNotFound"),
new fjs.PropertyFormatter("mentionableNotFound"),
new fjs.PropertyFormatter("channelType"),
new fjs.PropertyFormatter("notInGuild"),
]),
new fjs.ObjectFormatter("permissions",true,[
new fjs.PropertyFormatter("developer"),
new fjs.PropertyFormatter("owner"),
new fjs.PropertyFormatter("admin"),
new fjs.PropertyFormatter("moderator"),
new fjs.PropertyFormatter("support"),
new fjs.PropertyFormatter("member"),
new fjs.PropertyFormatter("discord-administrator"),
]),
new fjs.ObjectFormatter("actionInvalid",true,[
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("reopen"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.PropertyFormatter("add"),
new fjs.PropertyFormatter("remove"),
]),
]),
new fjs.ObjectFormatter("params",true,[
new fjs.ObjectFormatter("uppercase",true,[
new fjs.PropertyFormatter("ticket"),
new fjs.PropertyFormatter("tickets"),
new fjs.PropertyFormatter("reason"),
new fjs.PropertyFormatter("creator"),
new fjs.PropertyFormatter("remaining"),
new fjs.PropertyFormatter("added"),
new fjs.PropertyFormatter("removed"),
new fjs.PropertyFormatter("filter"),
new fjs.PropertyFormatter("method"),
new fjs.PropertyFormatter("type"),
new fjs.PropertyFormatter("blacklisted"),
new fjs.PropertyFormatter("panel"),
new fjs.PropertyFormatter("command"),
new fjs.PropertyFormatter("system"),
new fjs.PropertyFormatter("true"),
new fjs.PropertyFormatter("false"),
new fjs.PropertyFormatter("syntax"),
new fjs.PropertyFormatter("originalName"),
new fjs.PropertyFormatter("newName"),
new fjs.PropertyFormatter("until"),
new fjs.PropertyFormatter("validOptions"),
new fjs.PropertyFormatter("validPanels"),
new fjs.PropertyFormatter("autoclose"),
new fjs.PropertyFormatter("autodelete"),
new fjs.PropertyFormatter("startupDate"),
new fjs.PropertyFormatter("version"),
new fjs.PropertyFormatter("name"),
new fjs.PropertyFormatter("role"),
new fjs.PropertyFormatter("status"),
new fjs.PropertyFormatter("claimed"),
new fjs.PropertyFormatter("pinned"),
new fjs.PropertyFormatter("creationDate"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("noone"),
new fjs.PropertyFormatter("open"),
new fjs.PropertyFormatter("closed"),
new fjs.PropertyFormatter("priority"),
new fjs.PropertyFormatter("participants"),
new fjs.PropertyFormatter("yes"),
new fjs.PropertyFormatter("no"),
new fjs.PropertyFormatter("option"),
new fjs.PropertyFormatter("topic"),
new fjs.PropertyFormatter("uptime"),
new fjs.PropertyFormatter("messages"),
new fjs.PropertyFormatter("embeds"),
new fjs.PropertyFormatter("files"),
new fjs.PropertyFormatter("components"),
new fjs.PropertyFormatter("cooldown"),
new fjs.PropertyFormatter("maxTickets"),
new fjs.PropertyFormatter("admins"),
new fjs.PropertyFormatter("roles"),
new fjs.PropertyFormatter("size"),
]),
new fjs.ObjectFormatter("lowercase",true,[
new fjs.PropertyFormatter("text"),
new fjs.PropertyFormatter("html"),
new fjs.PropertyFormatter("command"),
new fjs.PropertyFormatter("modal"),
new fjs.PropertyFormatter("button"),
new fjs.PropertyFormatter("dropdown"),
new fjs.PropertyFormatter("method"),
]),
]),
new fjs.ObjectFormatter("commands",true,[
new fjs.PropertyFormatter("reason"),
new fjs.PropertyFormatter("help"),
new fjs.PropertyFormatter("panel"),
new fjs.PropertyFormatter("panelId"),
new fjs.PropertyFormatter("panelAutoUpdate"),
new fjs.PropertyFormatter("ticket"),
new fjs.PropertyFormatter("ticketId"),
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("delete"),
new fjs.PropertyFormatter("deleteNoTranscript"),
new fjs.PropertyFormatter("reopen"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("claimUser"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("move"),
new fjs.PropertyFormatter("moveId"),
new fjs.PropertyFormatter("rename"),
new fjs.PropertyFormatter("renameName"),
new fjs.PropertyFormatter("add"),
new fjs.PropertyFormatter("addUser"),
new fjs.PropertyFormatter("remove"),
new fjs.PropertyFormatter("removeUser"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("blacklist"),
new fjs.PropertyFormatter("blacklistView"),
new fjs.PropertyFormatter("blacklistAdd"),
new fjs.PropertyFormatter("blacklistRemove"),
new fjs.PropertyFormatter("blacklistGet"),
new fjs.PropertyFormatter("blacklistGetUser"),
new fjs.PropertyFormatter("stats"),
new fjs.PropertyFormatter("statsReset"),
new fjs.PropertyFormatter("statsGlobal"),
new fjs.PropertyFormatter("statsUser"),
new fjs.PropertyFormatter("statsUserUser"),
new fjs.PropertyFormatter("statsTicket"),
new fjs.PropertyFormatter("statsTicketTicket"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("clear"),
new fjs.PropertyFormatter("clearFilter"),
new fjs.ObjectFormatter("clearFilters",true,[
new fjs.PropertyFormatter("all"),
new fjs.PropertyFormatter("open"),
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.PropertyFormatter("autoclose"),
]),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("autoclose"),
new fjs.PropertyFormatter("autocloseDisable"),
new fjs.PropertyFormatter("autocloseEnable"),
new fjs.PropertyFormatter("autocloseEnableTime"),
new fjs.PropertyFormatter("autodelete"),
new fjs.PropertyFormatter("autodeleteDisable"),
new fjs.PropertyFormatter("autodeleteEnable"),
new fjs.PropertyFormatter("autodeleteEnableTime"),
new fjs.TextFormatter(""),
new fjs.PropertyFormatter("topic"),
new fjs.PropertyFormatter("topicSet"),
new fjs.PropertyFormatter("topicValue"),
new fjs.PropertyFormatter("topicList"),
new fjs.PropertyFormatter("priority"),
new fjs.PropertyFormatter("prioritySet"),
new fjs.PropertyFormatter("priorityValue"),
new fjs.PropertyFormatter("priorityGet"),
new fjs.PropertyFormatter("priorityList"),
new fjs.PropertyFormatter("transfer"),
new fjs.PropertyFormatter("transferUser"),
]),
new fjs.ObjectFormatter("helpMenu",true,[
new fjs.PropertyFormatter("help"),
new fjs.PropertyFormatter("ticket"),
new fjs.PropertyFormatter("close"),
new fjs.PropertyFormatter("delete"),
new fjs.PropertyFormatter("reopen"),
new fjs.PropertyFormatter("pin"),
new fjs.PropertyFormatter("unpin"),
new fjs.PropertyFormatter("move"),
new fjs.PropertyFormatter("rename"),
new fjs.PropertyFormatter("claim"),
new fjs.PropertyFormatter("unclaim"),
new fjs.PropertyFormatter("add"),
new fjs.PropertyFormatter("remove"),
new fjs.PropertyFormatter("panel"),
new fjs.PropertyFormatter("blacklistView"),
new fjs.PropertyFormatter("blacklistAdd"),
new fjs.PropertyFormatter("blacklistRemove"),
new fjs.PropertyFormatter("blacklistGet"),
new fjs.PropertyFormatter("statsGlobal"),
new fjs.PropertyFormatter("statsTicket"),
new fjs.PropertyFormatter("statsUser"),
new fjs.PropertyFormatter("statsReset"),
new fjs.PropertyFormatter("autocloseDisable"),
new fjs.PropertyFormatter("autocloseEnable"),
new fjs.PropertyFormatter("autodeleteDisable"),
new fjs.PropertyFormatter("autodeleteEnable"),
new fjs.ObjectFormatter("categories",true,[
new fjs.PropertyFormatter("general"),
new fjs.PropertyFormatter("basicTicket"),
new fjs.PropertyFormatter("advancedTicket"),
new fjs.PropertyFormatter("userTicket"),
new fjs.PropertyFormatter("admin"),
new fjs.PropertyFormatter("advanced"),
new fjs.PropertyFormatter("extra"),
])
]),
new fjs.ObjectFormatter("stats",true,[
new fjs.ObjectFormatter("scopes",true,[
new fjs.PropertyFormatter("global"),
new fjs.PropertyFormatter("system"),
new fjs.PropertyFormatter("user"),
new fjs.PropertyFormatter("ticket"),
new fjs.PropertyFormatter("participants"),
new fjs.PropertyFormatter("messages"),
]),
new fjs.ObjectFormatter("properties",true,[
new fjs.PropertyFormatter("ticketsCreated"),
new fjs.PropertyFormatter("ticketsClosed"),
new fjs.PropertyFormatter("ticketsDeleted"),
new fjs.PropertyFormatter("ticketsReopened"),
new fjs.PropertyFormatter("ticketsAutoclosed"),
new fjs.PropertyFormatter("ticketsClaimed"),
new fjs.PropertyFormatter("ticketsPinned"),
new fjs.PropertyFormatter("ticketsMoved"),
new fjs.PropertyFormatter("usersBlacklisted"),
new fjs.PropertyFormatter("transcriptsCreated"),
new fjs.PropertyFormatter("ticketsAutodeleted"),
new fjs.PropertyFormatter("ticketsTransferred"),
new fjs.PropertyFormatter("ticketVolume"),
new fjs.PropertyFormatter("averageTickets"),
new fjs.PropertyFormatter("currentTickets"),
new fjs.PropertyFormatter("age"),
new fjs.PropertyFormatter("responseTime"),
new fjs.PropertyFormatter("resolutionTime"),
new fjs.PropertyFormatter("createdOn"),
new fjs.PropertyFormatter("createdBy"),
new fjs.PropertyFormatter("closedOn"),
new fjs.PropertyFormatter("closedBy"),
new fjs.PropertyFormatter("claimedOn"),
new fjs.PropertyFormatter("claimedBy"),
new fjs.PropertyFormatter("pinnedOn"),
new fjs.PropertyFormatter("pinnedBy"),
new fjs.PropertyFormatter("deletedOn"),
new fjs.PropertyFormatter("deletedBy"),
]),
new fjs.ObjectFormatter("roles",true,[
new fjs.PropertyFormatter("developer"),
new fjs.PropertyFormatter("serverOwner"),
new fjs.PropertyFormatter("serverAdmin"),
new fjs.PropertyFormatter("moderator"),
new fjs.PropertyFormatter("support"),
new fjs.PropertyFormatter("member"),
])
]),
new fjs.ObjectFormatter("panel",true,[
new fjs.PropertyFormatter("selectTicket"),
new fjs.PropertyFormatter("selectRole"),
new fjs.PropertyFormatter("selectOption"),
]),
new fjs.ObjectFormatter("priorities",true,[
new fjs.PropertyFormatter("urgent"),
new fjs.PropertyFormatter("veryHigh"),
new fjs.PropertyFormatter("high"),
new fjs.PropertyFormatter("normal"),
new fjs.PropertyFormatter("low"),
new fjs.PropertyFormatter("veryLow"),
new fjs.PropertyFormatter("none"),
]),
])
for (const language of fs.readdirSync(".docs/languages/")){
if (!fs.existsSync("./languages/"+language)){
console.log("language:",language,"does not exist yet in the primary ./languages/ folder. Unable to merge!")
continue
}
console.log("merging "+language+"...")
const original = JSON.parse(fs.readFileSync("./languages/"+language).toString())
const newSentences = JSON.parse(fs.readFileSync(".docs/languages/"+language).toString())
for (const key of Object.keys(newSentences)){
if (key.startsWith("_")) continue
try{
const splitted = key.split(".")
let currentObject = original
splitted.forEach((property,index) => {
let shouldBeObject = (splitted.length-1 !== index)
if (shouldBeObject && typeof currentObject[property] == "object"){
currentObject = currentObject[property]
}else if (shouldBeObject && typeof currentObject[property] == "undefined"){
currentObject[property] = {}
currentObject = currentObject[property]
}else if (typeof currentObject[property] == "string" || typeof currentObject[property] == "undefined"){
currentObject[property] = newSentences[key]
}else{
console.log("Failed to merge key:",key,"in file:",language,"--> Invalid type:",typeof currentObject[property])
}
})
}catch(err){
console.log("Failed to merge key:",key,"in file:",language)
}
}
original["_TRANSLATION"]["lastedited"] = new Date().toLocaleDateString("nl-BE",{day:"2-digit",month:"2-digit",year:"numeric"})
original["_TRANSLATION"]["otversion"] = "v4.1.2"
const finalText = formatter.stringify(original)
fs.writeFileSync("./languages/"+language,finalText)
}
+12 -24
View File
@@ -2,7 +2,7 @@
<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.7-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.7)
[![version](https://img.shields.io/badge/version-4.1.2-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.1.2)
[![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)
@@ -20,30 +20,18 @@ 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.1.2.json`**](openticket-egg-v4.1.2.json)
- This egg will always use Open Ticket `v4.1.2`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.1.1.json`**](openticket-egg-v4.1.1.json)
- This egg will always use Open Ticket `v4.1.1`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.1.0.json`**](openticket-egg-v4.1.0.json)
- This egg will always use Open Ticket `v4.1.0`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.7.json`**](openticket-egg-v4.0.7.json)
- This egg will always use Open Ticket `v4.0.7`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.6.json`**](openticket-egg-v4.0.6.json)
- This egg will always use Open Ticket `v4.0.6`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.5.json`**](openticket-egg-v4.0.5.json)
- This egg will always use Open Ticket `v4.0.5`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.4.json`**](openticket-egg-v4.0.4.json)
- This egg will always use Open Ticket `v4.0.4`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.3.json`**](openticket-egg-v4.0.3.json)
- This egg will always use Open Ticket `v4.0.3`. Open Ticket updates will not have an effect on this egg.
[**`openticket-egg-v4.0.2.json`**](openticket-egg-v4.0.2.json)
- This egg will always use Open Ticket `v4.0.2`. Open Ticket updates will not have an effect on this egg.
[**`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.
[**`openticket-egg-v3.5.9.json`**](openticket-egg-v3.5.9.json)
- This egg will always use Open Ticket `v3.5.9`. Open Ticket updates will not have an effect on this egg.
@@ -54,6 +42,6 @@ It's recommended to provide at least `1GB` of **Memory/RAM** and `5GB` of **disk
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
**Pterodactyl Eggs**<br>
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
-62
View File
@@ -1,62 +0,0 @@
{
"_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.3)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.3, 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.3)\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.3\"\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"
}
]
}
-62
View File
@@ -1,62 +0,0 @@
{
"_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.4)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.4, 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.4)\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.4\"\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"
}
]
}
-62
View File
@@ -1,62 +0,0 @@
{
"_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.5)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.5, 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.5)\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.5\"\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"
}
]
}
-62
View File
@@ -1,62 +0,0 @@
{
"_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.6)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.6, 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.6)\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.6\"\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"
}
]
}
@@ -5,9 +5,9 @@
"update_url": null
},
"exported_at": "2025-03-16T18:10:18+01:00",
"name": "Open Ticket (v4.0.0)",
"name": "Open Ticket (v4.1.0)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.0, 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!",
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.0, 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"
@@ -22,7 +22,7 @@
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.0)\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.0\"\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",
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.1.0)\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.1.0\"\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"
}
@@ -5,9 +5,9 @@
"update_url": null
},
"exported_at": "2025-03-16T18:10:18+01:00",
"name": "Open Ticket (v4.0.1)",
"name": "Open Ticket (v4.1.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!",
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.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"
@@ -22,7 +22,7 @@
},
"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",
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.1.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.1.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"
}
@@ -5,9 +5,9 @@
"update_url": null
},
"exported_at": "2025-03-16T18:10:18+01:00",
"name": "Open Ticket (v4.0.2)",
"name": "Open Ticket (v4.1.2)",
"author": "support@dj-dj.be",
"description": "This is the official Pterodactyl egg for Open Ticket v4.0.2, 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!",
"description": "This is the official Pterodactyl egg for Open Ticket v4.1.2, 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"
@@ -22,7 +22,7 @@
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.0.2)\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.2\"\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",
"script": "#!\/bin\/bash\r\n# Open Ticket Installation Script (v4.1.2)\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.1.2\"\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"
}
+3 -3
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.7-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.0.7) [![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.1.2-brightgreen.svg?style=flat-square)](https://github.com/open-discord-bots/open-ticket/releases/tag/v4.1.2) [![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>
@@ -87,6 +87,6 @@ you are **REQUIRED to send the bug privately via one of the following methods:**
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
**Contributing Guidelines**<br>
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
+16 -15
View File
@@ -14,21 +14,22 @@ This list will be updated on every release.
- 🟦 In Development **(ideas, bugs, support, html transcripts)**
- ✅ Supported **(features, bugs, support, docs, html transcripts)**
- 🚧 Maintenance **(support, docs, html transcripts)**
- 🟧 Deprecated **(docs)**
- 🟧 Deprecated **(docs only)**
- ❌ Fully Deprecated
| Version | Supported | Notes |
|------------|-----------|------------------------------------------|
| 4.1.0 | 🟦 | |
| 4.0.7 | ✅ | |
| 4.0.6 | ✅ | |
| 4.0.5 | ✅ | |
| 4.0.4 | ✅ | Supported until July 2025 (LTS) |
| 4.0.3 | 🚧 | Transcripts v2.0 (Offline August 2025) |
| 4.0.2 | 🟧 | Documentation Only (discord.js bug) |
| 4.0.1 | 🟧 | Documentation Only |
| 4.0.0 | 🟧 | Documentation Only |
| < 4.0.0 | ❌ | |
| Version | Supported | Notes |
|------------|-----------|---------------------------------------------------------------|
| 4.2.0 | 🟦 | In Development |
| 4.1.x | 🟦 | In Development |
| 4.1.2 | ✅ | |
| 4.1.1 | ✅ | Supported Until April 2026 (LTS) |
| 4.1.0 | 🚧 | |
| 4.0.7 | 🚧 | |
| 4.0.6 | 🚧 | |
| 4.0.5 | 🟧 | Deprecated |
| 4.0.4 | 🟧 | Deprecated |
| < 4.0.4 | 🟧 | Deprecated, Transcripts v2.0, Documentation Only |
| < 4.0.0 | ❌ | |
### 🕷️ Reporting Vulnerabilities
You can report vulnerabilities, errors & bugs using one of the following methods:
@@ -48,6 +49,6 @@ If possible, try to provide screenshots!
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
**Security Policy**<br>
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord](https://discord.dj-dj.be)<br>
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms#terms) - [Privacy Policy](https://www.dj-dj.be/terms#privacy)
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
+1
View File
@@ -19,4 +19,5 @@ otdebug.txt
.docs/*
!.docs/createDocs.js
!.docs/mergeTranslations.js
!.docs/typedoc-config.json
+26 -3
View File
@@ -1,6 +1,12 @@
<!-- omit from toc -->
# Open Ticket (License)
© 2025 - DJj123dj & Contributors
© 2021 - 2026 - DJj123dj & Contributors
#### Table Of Contents
- [General License](#general-license)
- [Additional Terms for Open Ticket](#additional-terms-for-open-ticket)
### General License
```
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
@@ -679,11 +685,28 @@ Public License instead of this License. But first, please read
```
### Additional Terms for Open Ticket
#### Terminology:
1. **“Software”**
Refers to the Open Ticket source code, documentation, and any associated files distributed under this license, including any modifications or derivative works thereof.
1. **“Public Discord Bot**
A Discord bot that is made publicly available for use by multiple, unrelated Discord servers or users, where the bot’s functionality is provided as a service rather than for private or personal use.
1. **“Monetized Service”**
Refers to any service or deployment that generates direct or indirect revenue through the use of the Software. This includes, but is not limited to, subscriptions, premium features, paid hosting, advertisements.
1. **“For-Profit Discord Server”**
Means a Discord server that generates income, revenue, or other material benefits, whether through memberships, donations, or other monetization strategies.
1. **“Private Use”**
Refers to using the Software on a limited number of Discord servers controlled or operated by a single individual or organization, not made available as a public service to multiple unrelated users.
#### Additional Terms:
The following additional terms apply to the use of this software:
1. This software may not be used as part of a public Discord bot service that is monetized (e.g., generating revenue through subscriptions, donations, or other forms of payment) without the prior written permission of the original author.
1. This software may not be used as (or part of) a public Discord bot that is monetized (e.g., generating revenue through subscriptions, donations, or other forms of payment) without the prior written permission of the original author.
2. This software may not be used as part of a public Discord bot service on multiple Discord servers without attribution to the original author.
2. This software may not be used as (or part of) a public Discord bot on multiple Discord servers without attribution to the original author.
3. You are allowed to use this bot in a Discord server that makes money or is for-profit, provided that the income is not generated directly from the ticket bot or its functionality.
+119 -102
View File
@@ -1,6 +1,8 @@
> ### 🎥 Content Creators 🎥
> Hey there! We're searching for content creators that would want to create a tutorial or setup guide for Open Ticket!<br>
> [📌 More Information](.github/CONTENT_CREATORS.md)
> ### 📌 Open Ticket Quick Links
> - [⏱️ Quick Setup](#️-quick-setup-using-cli)
> - [📔 Documentation](https://otdocs.dj-dj.be)
> - [🧩 Available Plugins](#-plugins)
> - [📞 Discord Server](https://discord.dj-dj.be)
---
<p align="center">
@@ -8,7 +10,7 @@
<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.7"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.0.7-brightgreen.svg?style=flat-square"></img></a>
<a href="https://github.com/open-discord-bots/open-ticket/releases/tag/v4.1.2"><img alt="Open Ticket Version" src="https://img.shields.io/badge/version-4.1.2-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>
@@ -19,48 +21,50 @@
</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>36 Languages</code>! If you need any help, feel free to join our <a href="https://discord.dj-dj.be">discord server</a>!
Open Ticket is the most advanced & customisable discord ticket bot available! You are able to customise up to 300+ settings and aspects! This includes <code>Html Transcripts</code>, <code>Advanced Plugins</code>, <code>Custom Embeds</code>, <code>Questions/Modals</code>, <code>Stats</code> & more!
The bot is translated in more than <code>36 Languages</code> and has been battle tested in large Discord servers! 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>
<h3 align="center"><b>⭐️ Help us grow by giving a star! ⭐️</b></h3>
### 📌 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 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, Claim, Pin, Rename & Move all your tickets!
- **🇬🇧 translation** - Open Ticket has been translated in more than **36 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!
- **📝 advanced plugins** - Create advanced plugins or use pre-made ones by our community!
- **👥 user management** - Add & Remove users from all tickets!
- **📊 detailed stats** - Open Ticket has ticket, user & global staticstics available for everyone!
- **🚫 blacklist** - Blacklist users to prevent them from creating a ticket!
- **❓ questions** - Let users answer questions in a modal before the ticket is created!
- **📦 slash & text** - Open Ticket supports both slash & text commands!
- **📥 extra buttons** - The bot also supports Reaction Roles & Url Buttons, because why not ¯\\_(ツ)_/¯
- **✨ commands** - The bot contains more than 25 commands!
- **⏳ Quick Setup** - Using the interactive Quick Setup CLI, you can **configure Open Ticket in less than 5min!**
- **🦇 Pterodactyl Support** - Open Ticket works perfect on Pterodactyl based panels. [(Download official eggs)](.eggs/README.md)
- **💩 No Credits** - Your bot won't contain any form of bloat or credits. It's all yours!
- **🔒 Private & Secure** - It has been battletested by thousands of servers and **respects security & privacy.**
- **📈 Scalable** - Made to handle huge servers and has already been **tested in servers with 100k members.**
- **📄 HTML Transcripts** - The **built-in HTML Transcripts Service** provides beautiful & easy-to-use transcripts.
- **✅ Ticket Status** - Close, reopen, delete, claim, pin, rename or move tickets in your server.
- **🇬🇧 Translation** - Every message has been translated in more than **36 languages** by our community.
- **🎨 Customisation** - More than **200+ settings** are related to customisation & advanced features.
- **🖥️ Interactions** - The bot has full support for buttons, dropdowns, slash/text commands & modals.
- **∞ Unlimited Possibilities** - Create an infinite amount of tickets, questions & panels.
- **📝 Advanced Plugins** - Create advanced plugins or use [**pre-made plugins**](#-plugins) by our community.
- **👥 Participants** - Add or remove participants & transfer ownership from one user to another.
- **📊 Detailed Statistics** - With more than **50+ statistics** for tickets, users & the server.
- **🚫 Blacklist** - Blacklist users to prevent them from creating new tickets.
- **🚨 Priorities** - Assign different **priority levels** to tickets to mark them as important.
- **❓ Modal Questions** - Give users the ability to **answer questions** in a modal before their ticket is created.
- **✨ Commands** - Manage all your tickets with more than 28+ commands.
- **🤖 Automation** - Automate ticket handling with **autoclose, autodelete** & slow mode.
- **😎 Additional Features** - For some weird reason, the bot also supports Reaction Role & URL Buttons.
#### And more using plugins!
- **💬 reviews** - Create & customise your own review system!
- **📢 feedback** - Collect feedback & create forms for people to answer!
- **🏷️ tags** - Create tags & answer questions automatically using keywords!
- **📝 forms** - Create advanced forms and ask people for additional details!
- **🔄 rotating status** - Create a rotating bot status & use dynamic variables from the bot!
- **💾 sqlite database** - Use an `sqlite` database for increased performances!
- **🎉 custom embeds** - Create your own embeds and use them in your server!
- **⏰ reminders** - Create & manage customisable reminders in your server!
- **🎨 customisation** - Yep, you heard it right! Even more customisation!
#### And even more using [pre-made community plugins](#-plugins)!
- **💬 Reviews** - Create & manage a support review system.
- **📢 Feedback** - Collect feedback & create forms for users to answer.
- **⏰ Reminders** - Create & manage customisable reminders.
- **🏷️ Tags** - Create tags & answer questions automatically using keywords.
- **📝 Forms** - Create advanced forms and automatically ask for repetitive questions.
- **🔄 Channel Display** - Create a voice channel with realtime statistics from the ticket system.
- **💾 SQLite Database** - Use an `SQLite` database for increased performance.
- **🎉 Custom Embeds** - Create your own embeds and send them using a command.
- **🎨 Customisation** - Yep, you heard it right. Even more customisation!
- **😁 And so much more...**
> ### 📦 Resources
> Not all resources are accurate yet! We are working on this.<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://openticket.dj-dj.be/message.html?msg=The%20current%20tutorial%20is%20outdated,%20we%27re%20still%20working%20on%20a%20new%20one!"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-docs.png" alt="Open Ticket Docs" width="180px"></a>
> These resources will help with configuration and usage of the bot:<br>
> <!--<a href="https://openticket.dj-dj.be/message.html?msg=The%20current%20tutorial%20is%20outdated,%20we%27re%20still%20working%20on%20a%20new%20one!"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-tutorial.png" alt="Open Ticket Tutorial" width="180px"></a>-->
> <a href="https://otdocs.dj-dj.be"><img src="https://apis.dj-dj.be/cdn/openticket/open-ticket-docs.png" alt="Open Ticket Docs" width="180px"></a>
> <a href="https://github.com/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
@@ -69,9 +73,11 @@ A big thanks to all our sponsors! Without them, it wouldn't be possible to creat
<table>
<tr>
<td><img src="https://github.com/guillee3.png" alt="Profile Picture" width="100px"></td>
<td><img src="https://github.com/yeeetSK.png" alt="Profile Picture" width="100px"></td>
</tr>
<tr>
<td align="center"><a href="https://github.com/guillee3"><b>guillee3</b></a></td>
<td align="center"><a href="https://github.com/yeeetSK"><b>yeeetSK</b></a></td>
</tr>
</table>
@@ -83,19 +89,19 @@ A big thanks to all our sponsors! Without them, it wouldn't be possible to creat
<img src="https://github.com/BENZORICH.png" alt="BENZORICH" width="40px">
</a>
### ⏱️ Quick Setup
### ⏱️ Quick Setup (Using CLI)
> 1. Download the latest version of Open Ticket on [Github](https://github.com/open-discord-bots/open-ticket).
> 2. Make sure node.js & npm are installed using `node -v` (minimum `v18`).
> 2. Make sure node.js & npm are installed using `node -v` (minimum `v20`).
> 3. Install any required dependencies using `npm install`.
> 4. Configure the bot in the `./config/` directory.
> 5. Start the bot using `npm start` or `node index.js`
> 4. Start the **Quick Setup CLI** using `npm run setup`.
> 5. Click on `> ⏱️ Quick Setup` and follow the instructions.
> 6. Start the bot using `npm start` or `node index.js`
> - The bot will let you know any existing config errors.
> - Fix these errors and restart the bot.
> 6. Enjoy using Open Ticket!
> 7. Enjoy using Open Ticket!
> ### [📔 Visit Documentation](https://otdocs.dj-dj.be)
>
> ### 🖥️ Recommended Hostings
> - [⭐ **Peakhosting.nl**](https://peakhosting.nl/) - Official support for Open Ticket pterodactyl eggs.
> - **Any Pterodactyl-Based Panel** - Easy installation & configuration.
> - **A Virtual Private Server (VPS)** - Extra customisation & more stability. Recommended for large servers.
>
@@ -115,64 +121,69 @@ A list of people that contributed or provided the most support for Open Ticket.
<td align="center"><img src="https://github.com/smetsliam.png" alt="Profile Picture" width="80px"></td>
<td align="center"><img src="https://github.com/FrankVissers.png" alt="Profile Picture" width="80px"></td>
<td align="center"><img src="https://github.com/Sank34.png" alt="Profile Picture" width="80px"></td>
<td align="center"><img src="https://github.com/Roppl3r.png" alt="Profile Picture" width="80px"></td>
<td align="center"><img src="https://github.com/guillee3.png" alt="Profile Picture" width="80px"></td>
</tr>
<tr>
<th><a href="https://github.com/DJj123dj">💻 DJj123dj</a></th>
<th><a href="https://github.com/smetsliam">💬 smetsliam</a></th>
<th><a href="https://github.com/FrankVissers">💬 Frank Vissers</a></th>
<th><a href="https://github.com/Sank34">💬 Sanke</a></th>
<th><a href="https://github.com/Roppl3r">🧩 Roppl3r</a></th>
<th><a href="https://github.com/guillee3">🧩 Guillee3</a></th>
</tr>
</table>
### 💬 Translators
With the amazing support of our translators, we've been able to translate Open Ticket in more than **36 languages**!
As a result, you're able to enjoy using Open Ticket in your own native language.
- **Categories: 🟢 Available - 🤖 Made Using AI - 🔴 Unavailable/Outdated**
With the amazing support of our translators, we've been able to translate Open Ticket in more than **36 languages**!
#### Categories:
- **🟢 Available**
- **⏳ In Progress (Incomplete)**
- **🤖 Made Using AI**
- **🟠 Incomplete**
- **🔴 Unavailable/Outdated**
|🔍 |Languages (36) |Maintainer (Github/Discord) |
|---|---------------------|--------------------------------|
|🟢 |🇬🇧 English |djj123dj |
|🟢 |🇳🇱 Dutch |djj123dj |
|🟢 |🇩🇪 German |benzorich |
|🟢 |🇪🇸 Spanish |redactado & josuens |
|🟢 |🇵🇹 Portuguese |quiradon |
|🟢 |❓ Catalan |guillee3 |
|🟢 |🇨🇿 Czech |spyeye_ |
|🟢 |🇭🇺 Hungarian |kornel0706 |
|🟢 |🇷🇴 Romanian |sankedev |
|🟢 |🇺🇦 Ukrainian |anderskiy |
|🟢 |🇮🇩 Indonesian |erxg |
|🟢 |🇮🇹 Italian |fraden1mvp. |
|🟢 |🇩🇰 Danish |the_gamer |
|🟢 |🇹🇭 Thai |modshd |
|🟢 |🇹🇷 Turkish |palestinian |
|🟢 |🇫🇷 French |guillee.3 |
|🟢 |🇦🇪 Arabic |palestinian |
|🟢 |🇮🇳 Hindi |an_developer |
|🟢 |🇱🇹 Lithuanian |tsgindrius |
|🟢 |🇵🇱 Polish |danoglez |
|🟢 |🇳🇴 Norwegian |NoOneNook |
|🟢 |🇸🇪 Swedish |NoOneNook |
|🟢 |🇮🇷 Persian |dysashop & zhavis |
|🟢 |🇧🇩 Bengali |HanumeshGupta |
|🤖 |🇪🇪 Estonian |iamnotmega |
|🤖 |🇫🇮 Finnish |iamnotmega |
|🤖 |🇷🇺 Russian |NoOneNook |
|🤖 |🇱🇻 Latvian |NoOneNook |
|🤖 |🇻🇳 Vietnamese |ngocdiep2006 |
|🤖 |🇯🇵 Japanese |HanumeshGupta |
|🤖 |🇬🇷 Greek |HanumeshGupta |
|🤖 |🇸🇮 Slovenian |HanumeshGupta |
|🤖 |🇰🇷 Korean |HanumeshGupta |
|🤖 |🇮🇳 Tamil |HanumeshGupta |
|🤖 |🇨🇳 Simplified Chinese |HanumeshGupta |
|🤖 |❓ Kurdish |HanumeshGupta |
|🔴 |🇨🇳 Traditional Chinese|[⭐ Contribute!](.github/CONTRIBUTING.md)|
|🔍 |Languages (36) |Maintainer (Github/Discord) |
|----|---------------------|--------------------------------|
|🟢 |🇬🇧 English |djj123dj |
|🟢 |🇳🇱 Dutch |djj123dj |
|🟢 |❓ Catalan |guillee3 |
|🟢 |🇮🇩 Indonesian |erxg |
|🟢 |🇮🇳 Hindi |challenger_nova |
|🟢 |🇩🇪 German |benzorich |
|🟢⏳ |🇪🇸 Spanish |redactado & josuens |
|🟢⏳ |🇫🇷 French |guillee.3 |
|🟢⏳ |🇵🇹 Portuguese |quiradon |
|🟢⏳ |🇨🇿 Czech |spyeye_ |
|🟢⏳ |🇭🇺 Hungarian |kornel0706 |
|🟢⏳ |🇷🇴 Romanian |sankedev |
|🟢⏳ |🇺🇦 Ukrainian |anderskiy |
|🟢⏳ |🇮🇹 Italian |fraden1mvp. |
|🟢⏳ |🇩🇰 Danish |the_gamer |
|🟢⏳ |🇹🇭 Thai |modshd |
|🟢⏳ |🇹🇷 Turkish |palestinian |
|🟢⏳ |🇦🇪 Arabic |palestinian |
|🟢⏳ |🇱🇹 Lithuanian |tsgindrius |
|🟢⏳ |🇵🇱 Polish |danoglez |
|🟢⏳ |🇳🇴 Norwegian |NoOneNook |
|🟢⏳ |🇸🇪 Swedish |NoOneNook |
|🟢⏳ |🇮🇷 Persian |dysashop & zhavis |
|🟢⏳ |🇧🇩 Bengali |HanumeshGupta |
|🤖 |🇪🇪 Estonian |iamnotmega |
|🤖 |🇫🇮 Finnish |iamnotmega |
|🤖 |🇯🇵 Japanese |HanumeshGupta |
|🤖 |🇬🇷 Greek |HanumeshGupta |
|🤖 |🇸🇮 Slovenian |HanumeshGupta |
|🤖 |🇰🇷 Korean |HanumeshGupta |
|🤖 |🇮🇳 Tamil |HanumeshGupta |
|🤖 |🇨🇳 Simplified Chinese |HanumeshGupta |
|🤖 |❓ Kurdish |HanumeshGupta |
|🤖⏳ |🇷🇺 Russian |NoOneNook |
|🤖⏳ |🇱🇻 Latvian |NoOneNook |
|🤖⏳ |🇻🇳 Vietnamese |ngocdiep2006 |
|🔴 |🇨🇳 Traditional Chinese|[⭐ Contribute!](.github/CONTRIBUTING.md)|
<!--[⭐ Contribute!](.github/CONTRIBUTING.md) -->
## ⭐️ Star History
Please give this repository a star if you like it.
If you enjoy using Open ticket, **consider starring** this repository.
This will help us grow and reach even more people!
<a href="https://star-history.com/#open-discord-bots/open-ticket&Date">
@@ -184,13 +195,22 @@ This will help us grow and reach even more people!
</a>
## 🧩 Plugins
**Download all plugins in our [Official Plugin Repository](https://github.com/open-discord-bots/plugins)!**<br>
**Download all plugins from our [Official Plugin Repository](https://github.com/open-discord-bots/plugins)!**<br>
> #### ⭐ Featured Plugins (Top 5 Most Used)
> **[`ot-sqlite-database`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-sqlite-database/),
> [`ot-migrate-v3`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-migrate-v3/),
> [`ot-reviews`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-reviews/),
> [`ot-feedback`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-feedback/),
> [`ot-tags`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-tags/)**
> [`ot-tags`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-tags/),
> [`ot-restrictions`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-restrictions/)**
#### Categories:
- **📄 Example** - These plugins serve as an example or starting template.
- **📢 Command** - These plugins add new commands to the bot.
- **⚙️ Utility** - These plugins help with utility systems. You might not notice them as a ticket user/admin directly.
- **🎨 Customisation** - These plugins add even more customisation to the bot.
- **💼 Management** - These plugins add features that help you manage your server or ticket system.
- **🤖 Client** - These plugins add features affecting the Discord Client or bot itself.
- Please Create a new category when your plugin doesn't fit in one of the available categories.
### 📦 Official *(made by DJdj Development)*
|Name |Category |Description |
@@ -214,7 +234,10 @@ This will help us grow and reach even more people!
|[`ot-move-actions`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-move-actions/) |💼 Management |Automatically unclaim/unpin a ticket when it's moved using `/move`. |
|[`ot-reviews`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-reviews/) |💼 Management |Review system for Open Ticket! It is very customisable and has lots of features. |
|[`ot-tags`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-tags/) |💼 Management |Use tags to quickly reply with a pre-existing text. |
|[`ot-restrictions`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-restrictions/) |💼 Management |Restrict which roles can open a specific ticket option. |
|[`ot-better-status`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-better-status/) |🤖 Client |An advanced status plugin to rotate between states. It also allows for the use of variables. |
|[`ot-channel-display`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-channel-display/) |🤖 Client |A plugin to show different variables in a voice channel in your server. |
|[`ot-vanity`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-vanity/) |🤖 Client |A plugin to detect the vanity status of members in the server and give them exclusive privilleges. |
### ✅ Verified *(made by community)*
|Name |Author |Category |Description |
@@ -225,20 +248,14 @@ This will help us grow and reach even more people!
|[`ot-assign-role`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-assign-role/) |rapid.fast |💼 Management |This plugin assigns a predefined role to a user upon creating a ticket. |
|[`ot-volume-warning`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-volume-warning/) |guillee.3 |💼 Management |Alerts ticket creators when too many tickets are open, indicating possible response delays. |
|[`od-reminders`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-reminders/) |guillee.3 |💼 Management |Set reminders that will be sent to a channel every specified time. |
|[`od-moderation`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/od-moderation/) |NotMukundOP |💼 Management |A simple moderation plugin for Open Discord with ban, kick & warnings. |
|[`ot-followups`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-followups/) |guillee.3 |💼 Management |Send additional follow-up messages to a ticket. |
|[`ot-translate-cmds`](https://github.com/open-discord-bots/plugins/tree/main/open-ticket/ot-translate-cmds/) |guillee.3 |🤖 Client |Translate all built-in command names, descriptions & options. |
### 📢 Categories
- **📄 Example** - These plugins serve as an example or starting template.
- **📢 Command** - These plugins add new commands to the bot.
- **⚙️ Utility** - These plugins help with backend & systems. You won't notice it in discord itself.
- **🎨 Customisation** - These plugins help you customise the bot even further.
- **💼 Management** - These plugins add features that help you manage your server.
- **🤖 Client** - These plugins add features affecting the discord client or bot itself.
---
<img src="https://apis.dj-dj.be/cdn/openticket/logo.png" alt="Open Ticket Logo" width="170px">
**README.md**<br>
[changelog](https://otgithub.dj-dj.be/releases) - [documentation](https://otdocs.dj-dj.be) - [tutorial](https://www.youtube.com/watch?v=2jK9kAf6ASU) - [website](https://openticket.dj-dj.be) - [discord server](https://discord.dj-dj.be) - [license](./LICENSE.md)<br>
[Changelog](https://otgithub.dj-dj.be/releases) - [Documentation](https://otdocs.dj-dj.be) - [Website](https://openticket.dj-dj.be) - [Support Server](https://discord.dj-dj.be) - [License](./LICENSE.md)<br>
© 2025 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
© 2021 - 2026 - [DJdj Development](https://www.dj-dj.be) - [Terms](https://www.dj-dj.be/terms) - [Privacy Policy](https://www.dj-dj.be/privacy) - [Support Us](https://github.com/sponsors/DJj123dj)
+51 -21
View File
@@ -2,10 +2,10 @@
"_INFO":{
"support":"https://otdocs.dj-dj.be",
"discord":"https://discord.dj-dj.be",
"version":"open-ticket-v4.0.7"
"version":"open-ticket-v4.1.2"
},
"token":"your bot token here! (or leave empty when using 'tokenFromENV')",
"token":"insert your bot token here! (or leave empty when using 'tokenFromENV')",
"tokenFromENV":false,
"mainColor":"#f8ba00",
@@ -20,21 +20,34 @@
"status":{
"enabled":true,
"type":"listening OR watching OR playing OR custom",
"mode":"online OR invisible OR idle OR dnd",
"text":"/help",
"status":"online OR invisible OR idle OR dnd"
"state":"(additional text or leave empty)"
},
"system":{
"removeParticipantsOnClose":false,
"replyOnTicketCreation":true,
"replyOnReactionRole":true,
"useTranslatedConfigChecker":true,
"preferSlashOverText":true,
"sendErrorOnUnknownCommand":true,
"questionFieldsInCodeBlock":true,
"displayFieldsWithQuestions":false,
"showGlobalAdminsInPanelRoles":false,
"disableVerifyBars":false,
"useRedErrorEmbeds":true,
"alwaysShowReason":false,
"emojiStyle":"before (OR after OR double OR disabled)",
"pinEmoji":"📌",
"replyOnTicketCreation":true,
"replyOnReactionRole":true,
"askPriorityOnTicketCreation":false,
"removeParticipantsOnClose":false,
"disableAutocloseAfterReopen":true,
"autodeleteRequiresClosedTicket":true,
"adminOnlyDeleteWithoutTranscript":true,
"allowCloseBeforeMessage":false,
"allowCloseBeforeAdminMessage":true,
"useTranslatedConfigChecker":true,
"pinFirstTicketMessage":false,
"enableTicketClaimButtons":true,
"enableTicketCloseButtons":true,
@@ -54,6 +67,18 @@
"userMaximum":3
},
"channelTopic":{
"showOptionName":true,
"showOptionDescription":false,
"showOptionTopic":true,
"showPriority":false,
"showClosed":true,
"showClaimed":false,
"showPinned":false,
"showCreator":false,
"showParticipants":false
},
"permissions":{
"help":"everyone (OR admin OR none OR role id)",
"panel":"admin (OR everyone OR none OR role id)",
@@ -73,23 +98,28 @@
"stats":"everyone (OR admin OR none OR role id)",
"clear":"admin (OR everyone OR none OR role id)",
"autoclose":"admin (OR everyone OR none OR role id)",
"autodelete":"admin (OR everyone OR none OR role id)"
"autodelete":"admin (OR everyone OR none OR role id)",
"transfer":"admin (OR everyone OR none OR role id)",
"topic":"admin (OR everyone OR none OR role id)",
"priority":"admin (OR everyone OR none OR role id)"
},
"messages":{
"creation":{"dm":false, "logs":true},
"closing":{"dm":false, "logs":true},
"deleting":{"dm":false, "logs":true},
"reopening":{"dm":false, "logs":true},
"claiming":{"dm":false, "logs":true},
"pinning":{"dm":false, "logs":true},
"adding":{"dm":false, "logs":true},
"removing":{"dm":false, "logs":true},
"renaming":{"dm":false, "logs":true},
"moving":{"dm":false, "logs":true},
"blacklisting":{"dm":false, "logs":true},
"roleAdding":{"dm":false, "logs":true},
"roleRemoving":{"dm":false, "logs":true}
"creation":{"dm":false,"logs":true},
"closing":{"dm":false,"logs":true},
"deleting":{"dm":false,"logs":true},
"reopening":{"dm":false,"logs":true},
"claiming":{"dm":false,"logs":true},
"pinning":{"dm":false,"logs":true},
"adding":{"dm":false,"logs":true},
"removing":{"dm":false,"logs":true},
"renaming":{"dm":false,"logs":true},
"moving":{"dm":false,"logs":true},
"blacklisting":{"dm":false,"logs":true},
"transferring":{"dm":false,"logs":true},
"topicChange":{"dm":false,"logs":true},
"priorityChange":{"dm":false,"logs":true},
"reactionRole":{"dm":false,"logs":true}
}
}
}
+5 -1
View File
@@ -25,7 +25,7 @@
"claimedCategory":[
{"user":"user id","category":"category id"}
],
"description":"This is a question ticket (or leave empty)"
"topic":"This is the topic of this ticket channel and is visible to everyone! (or leave empty)"
},
"dmMessage":{
@@ -87,6 +87,10 @@
"enabled":false,
"globalMaximum":20,
"userMaximum":3
},
"slowMode":{
"enabled":false,
"slowModeSeconds":20
}
},
{
+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.7 (or leave empty)",
"footer":"Open Ticket v4.1.2 (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.7 - Made by DJj123dj & Contributors
v4.1.2 - 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.7",
"otversion": "v4.1.2",
"translators": ["palestinian"],
"lastedited": "06/12/2024",
"language": "Arabic",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["HanumeshGupta"],
"lastedited":"19/06/2025",
"language":"Bengali",
+607 -477
View File
File diff suppressed because it is too large Load Diff
+156 -26
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["DJj123dj"],
"lastedited":"21/08/2024",
"lastedited":"03/12/2025",
"language":"Custom",
"automated":false
},
@@ -31,7 +31,15 @@
"stringContains":"This string needs to contain {0}!",
"stringChoices":"This string can only be one of the following values: {0}!",
"stringRegex":"This string is invalid!",
"stringInvertedContains":"This string is not allowed to contain {0}!",
"stringLowercase":"This string must be written in lowercase only!",
"stringUppercase":"This string must be written in uppercase only!",
"stringSpecialCharacters":"This string is not allowed to contain any special characters! (a-z, 0-9 & space only)",
"stringNoSpaces":"This string is not allowed to contain spaces!",
"stringCapitalWord":"It's recommended that each word in this string starts with a capital letter!",
"stringCapitalSentence":"It looks like some sentences in this string don't start with a capital letter!",
"stringPunctuation":"It looks like the sentence in this string doesn't end with a punctuation mark!",
"numberTooShort":"This number can't be shorter than {0} characters!",
"numberTooLong":"This number can't be longer than {0} characters!",
"numberLengthInvalid":"This number needs to be {0} characters long!",
@@ -48,10 +56,12 @@
"numberNegative":"This number can't be negative!",
"numberPositive":"This number can't be positive!",
"numberZero":"This number can't be zero!",
"numberNan":"This number can't be NaN (Not A Number)!",
"numberInvertedContains":"This number is not allowed to contain {0}!",
"booleanTrue":"This boolean can't be true!",
"booleanFalse":"This boolean can't be false!",
"arrayEmptyDisabled":"This array isn't allowed to be empty!",
"arrayEmptyRequired":"This array is required to be empty!",
"arrayTooShort":"This array needs to have a length of at least {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"This array needs to have a length of {0}!",
"arrayInvalidTypes":"This array can only contain the following types: {0}!",
"arrayDouble":"This array doesn't allow the same value twice!",
"discordInvalidId":"This is an invalid discord {0} id!",
"discordInvalidIdOptions":"This is an invalid discord {0} id! You can also use one of these: {1}!",
"discordInvalidToken":"This is an invalid discord token (syntactically)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"This url has an invalid path!",
"idNotUnique":"This id isn't unique, use another id instead!",
"idNonExistent":"The id {0} doesn't exist!",
"invalidType":"This property needs to be the type: {0}!",
"propertyMissing":"The property {0} is missing from this object!",
"propertyOptional":"The property {0} is optional in this object!",
@@ -84,12 +94,13 @@
"nullInvalid":"This property can't be null!",
"switchInvalidType":"This needs to be one of the following types: {0}!",
"objectSwitchInvalid":"This object needs to be one of the following types: {0}!",
"invalidLanguage":"This is an invalid language!",
"invalidButton":"This button needs to have at least an {0} or {1}!",
"unusedOption":"The option {0} isn't used anywhere!",
"unusedQuestion":"The question {0} isn't used anywhere!",
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!"
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!",
"customInvalidVersion":"The version specified in your config does not match! Make sure you have updated the config to the latest version!"
}
},
"actions":{
@@ -132,6 +143,7 @@
"blacklistAddDm":"Added To Blacklist",
"blacklistRemoveDm":"Removed From Blacklist",
"clear":"Tickets Cleared",
"clearTickets":"Clear Tickets",
"roles":"Roles Updated",
"autoclose":"Ticket Autoclosed",
@@ -139,7 +151,12 @@
"autocloseDisabled":"Autoclose Disabled",
"autodelete":"Ticket Autodeleted",
"autodeleteEnabled":"Autodelete Enabled",
"autodeleteDisabled":"Autodelete Disabled"
"autodeleteDisabled":"Autodelete Disabled",
"topicSet":"Topic Changed",
"prioritySet":"Priority Changed",
"priorityGet":"Ticket Priority",
"transfer":"Ticket Transferred"
},
"descriptions":{
"create":"Your ticket has been created. Click the button below to access it!",
@@ -154,7 +171,7 @@
"move":"The ticket has been moved to {0} successfully!",
"add":"{0} has been added to the ticket successfully!",
"remove":"{0} has been removed from the ticket successfully!",
"helpExplanation":"`<name>` => required parameter\n`[name]` => optional parameter",
"statsReset":"The bot stats have been reset successfully!",
"statsError":"Unable to view ticket stats!\n{0} is not a ticket!",
@@ -167,7 +184,7 @@
"clearVerify":"Are you sure you want to delete multiple tickets?\nThis action can't be undone!",
"clearReady":"{0} tickets have been deleted successfully!",
"rolesEmpty":"No roles have been updated!",
"autocloseLeave":"This ticket has been autoclosed because the creator left the server!",
"autocloseTimeout":"This ticket has been autoclosed because it has been inactive for more than `{0}h`!",
"autodeleteLeave":"This ticket has been autodeleted because the creator left the server!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Autoclose has been disabled in this ticket!\nIt won't be closed automatically anymore!",
"autodeleteEnabled":"Autodelete has been enabled in this ticket!\nIt will be deleted when it is inactive for more than `{0} days`!",
"autodeleteDisabled":"Autodelete has been disabled in this ticket!\nIt won't be deleted automatically anymore!",
"ticketMessageLimit":"You can only create {0} ticket(s) at the same time!",
"ticketMessageAutoclose":"This ticket will be autoclosed when inactive for {0}h!",
"ticketMessageAutodelete":"This ticket will be autodeleted when inactive for {0} days!",
"panelReady":"You can find the panel below!\nThis message can now be deleted!"
"panelReady":"The panel is available in the followup message!\nThis message can now be deleted!",
"topicSet":"The channel topic has been changed by {0} successfully!",
"prioritySet":"The ticket priority has been changed to {0} by {1} successfully!",
"priorityGet":"The current priority of this ticket is {0}.",
"transfer":"The ticket ownership has been transferred from {0} to {1} by {2} successfully!"
},
"modal":{
"closePlaceholder":"Why did you close this ticket?",
@@ -215,12 +237,19 @@
"addDm":"{0} has been added to your ticket in our server!",
"removeLog":"{0} has been removed from this ticket by {1}!",
"removeDm":"{0} has been removed from your ticket in our server!",
"blacklistAddLog":"{0} was blacklisted by {1}!",
"blacklistRemoveLog":"{0} was removed from the blacklist by {1}!",
"blacklistAddDm":"You have been blacklisted in our server!\nFrom now on, you are unable to create a ticket!",
"blacklistRemoveDm":"You have been removed from the blacklist in our server!\nNow you can create tickets again!",
"clearLog":"{0} tickets have been deleted by {1}!"
"clearLog":"{0} tickets have been deleted by {1}!",
"transferLog":"The ownership of this ticket has been transferred from {0} to {1} by {2}!",
"transferDm":"The ownership of your ticket has been transferred from {0} to {1} in our server!",
"prioritySetLog":"The priority of this ticket has been changed to {0} by {1}!",
"prioritySetDm":"The priority of your ticket has been changed to {0} in our server!",
"roleUpdateLog":"{0} has updated their roles!",
"roleUpdateDm":"Your roles in our server have been updated!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Transcript Created",
"textFileDescription":"This is the text transcript of a deleted ticket!",
"htmlProgress":"Please wait while this html transcript is getting processed...",
"createdChannel":"A new {0} transcript has been created in the server!",
"createdCreator":"A new {0} transcript has been created for one of your tickets!",
"createdParticipant":"A new {0} transcript has been created in one of the tickets you participated in!",
@@ -241,7 +270,19 @@
"retry":"Retry",
"continue":"Delete Without Transcript",
"backup":"Create Backup Transcript",
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons."
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons.",
"title":"Transcript Error"
},
"text":{
"messagesTitle":"MESSAGES",
"embedTitle":"EMBED",
"fileTitle":"FILE",
"fieldsTitle":"FIELDS",
"reactionsTitle":"REACTIONS",
"statsTitle":"STATS",
"emptyContent":"<content is empty>",
"noTitle":"<no-title>",
"noDesc":"<no-description>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Unknown Panel",
"notInGuild":"Not In Server",
"channelRename":"Unable To Rename Channel",
"busy":"Ticket Is Busy"
"busy":"Ticket Is Busy",
"permissionError":"Permission Error"
},
"descriptions":{
"askForInfo":"Contact the owner of this bot for more info!",
@@ -280,7 +322,10 @@
"notInGuild":"This {0} doesn't work in DM! Please try it again in a server!",
"channelRename":"Due to discord ratelimits, it's currently impossible for the bot to rename the channel. The channel will automatically be renamed over 10 minutes if the bot isn't rebooted.",
"channelRenameSource":"The source of this error is: {0}",
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!"
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!",
"closeBeforeMessage":"This ticket cannot be closed/deleted before a message has been sent by a user.",
"closeBeforeAdminMessage":"This ticket cannot be closed/deleted before a message has been sent by a ticket admin or support member.",
"unableToCreateTicket":"You are unable to create a ticket."
},
"optionInvalidReasons":{
"stringRegex":"Value doesn't match pattern!",
@@ -331,7 +376,6 @@
"added":"Added",
"removed":"Removed",
"filter":"Filter",
"claimedBy":"Claimed By {0}",
"method":"Method",
"type":"Type",
"blacklisted":"Blacklisted",
@@ -355,7 +399,27 @@
"status":"Status",
"claimed":"Claimed",
"pinned":"Pinned",
"creationDate":"Creation Date"
"creationDate":"Creation Date",
"noone":"No-One",
"open":"Open",
"closed":"Closed",
"priority":"Priority",
"participants":"Participants",
"yes":"Yes",
"no":"No",
"option":"Option",
"topic":"Topic",
"uptime":"System Uptime",
"messages":"Messages",
"embeds":"Embeds",
"files":"Files",
"components":"Components",
"cooldown":"Cooldown",
"maxTickets":"Max Tickets",
"admins":"Admins",
"roles":"Roles",
"size":"Size"
},
"lowercase":{
"text":"text",
@@ -384,6 +448,7 @@
"unclaim":"Unclaim a ticket.",
"pin":"Pin a ticket.",
"unpin":"Unpin a ticket.",
"move":"Move a ticket.",
"moveId":"The identifier of the option that you want to move to.",
"rename":"Rename a ticket.",
@@ -392,6 +457,7 @@
"addUser":"The user to add.",
"remove":"Remove a user from a ticket.",
"removeUser":"The user to remove.",
"blacklist":"Manage the ticket blacklist.",
"blacklistView":"View a list of the current blacklist.",
"blacklistAdd":"Add a user to the blacklist.",
@@ -405,6 +471,7 @@
"statsUserUser":"The user to view.",
"statsTicket":"View the stats of a ticket in the server.",
"statsTicketTicket":"The ticket to view.",
"clear":"Delete multiple tickets at the same time.",
"clearFilter":"The filter for clearing tickets.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"Unpinned",
"autoclose":"Autoclosed"
},
"autoclose":"Manage autoclose in a ticket.",
"autocloseDisable":"Disable autoclose in this ticket.",
"autocloseEnable":"Enable autoclose in this ticket.",
@@ -424,7 +492,19 @@
"autodelete":"Manage autodelete in a ticket.",
"autodeleteDisable":"Disable autodelete in this ticket.",
"autodeleteEnable":"Enable autodelete in this ticket.",
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it."
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it.",
"topic":"Manage the topic of the ticket channel.",
"topicSet":"Set the topic of the ticket channel.",
"topicValue":"The new topic of the channel.",
"topicList":"Get a list of all tickets with their topic and stats.",
"priority":"Manage the priority of the ticket.",
"prioritySet":"Set the priority of the ticket.",
"priorityValue":"The priority of the channel.",
"priorityGet":"Get the priority of the ticket.",
"priorityList":"Get a list of all tickets with their priority status.",
"transfer":"Transfer the ticket ownership from one user to another.",
"transferUser":"The user to transfer to."
},
"helpMenu":{
"help":"Get a list of all the available commands.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Disable autoclose in this ticket.",
"autocloseEnable":"Enable autoclose in this ticket.",
"autodeleteDisable":"Disable autodelete in this ticket.",
"autodeleteEnable":"Enable autodelete in this ticket."
"autodeleteEnable":"Enable autodelete in this ticket.",
"categories":{
"general":"General Commands",
"basicTicket":"Basic Ticket Commands",
"advancedTicket":"Advanced Ticket Commands",
"userTicket":"User Ticket Commands",
"admin":"Admin Commands",
"advanced":"Advanced Commands",
"extra":"Extra Commands"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"System Stats",
"user":"User Stats",
"ticket":"Ticket Stats",
"participants":"Participants"
"participants":"Participants",
"messages":"Messages"
},
"properties":{
"ticketsCreated":"Tickets Created",
@@ -472,7 +562,47 @@
"ticketsPinned":"Tickets Pinned",
"ticketsMoved":"Tickets Moved",
"usersBlacklisted":"Users Blacklisted",
"transcriptsCreated":"Transcripts Created"
"transcriptsCreated":"Transcripts Created",
"ticketsAutodeleted":"Tickets Autodeleted",
"ticketsTransferred":"Tickets Transferred",
"ticketVolume":"Ticket Volume",
"averageTickets":"Average Tickets/User",
"currentTickets":"Current Tickets",
"age":"Ticket Age",
"responseTime":"Response Time",
"resolutionTime":"Resolution Time",
"createdOn":"Created On",
"createdBy":"Created By",
"closedOn":"Closed On",
"closedBy":"Closed By",
"claimedOn":"Claimed On",
"claimedBy":"Claimed By",
"pinnedOn":"Pinned On",
"pinnedBy":"Pinned By",
"deletedOn":"Deleted On",
"deletedBy":"Deleted By"
},
"roles":{
"developer":"Developer",
"serverOwner":"Server Owner",
"serverAdmin":"Server Admin",
"moderator":"Moderator Team",
"support":"Support Team",
"member":"Member"
}
},
"panel":{
"selectTicket":"Select your ticket",
"selectRole":"Select your role",
"selectOption":"Select your option"
},
"priorities":{
"urgent":"Urgent",
"veryHigh":"Very High",
"high":"High",
"normal":"Normal",
"low":"Low",
"veryLow":"Very Low",
"none":"None"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["spyeye_"],
"lastedited":"21/08/2024",
"language":"Czech",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["the_gamer"],
"lastedited":"26/09/2024",
"language":"Danish",
+161 -31
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["DJj123dj"],
"lastedited":"21/08/2024",
"lastedited":"03/12/2025",
"language":"Dutch",
"automated":false
},
@@ -31,7 +31,15 @@
"stringContains":"Deze tekst moet {0} bevatten!",
"stringChoices":"Deze tekst kan alleen de volgende waardes bevatten: {0}!",
"stringRegex":"Deze tekst is ongeldig!",
"stringInvertedContains":"Deze tekst mag niet {0} bevatten!",
"stringLowercase":"Deze tekst moet in kleine letters geschreven zijn!",
"stringUppercase":"Deze tekst moet in hoofdletters geschreven zijn!",
"stringSpecialCharacters":"Deze tekst mag geen speciale karakters bevatten! (enkel a-z, 0-9 & spatie)",
"stringNoSpaces":"Deze tekst mag geen spaties bevatten!",
"stringCapitalWord":"Het is aangeraden om ieder woord in de zin te laten starten met een hoofdletter!",
"stringCapitalSentence":"Het ziet er naar uit dat sommige zinnen in deze tekst niet met een hoofdletter beginnen!",
"stringPunctuation":"Het ziet er naar uit dat de zin in deze tekst niet met een leesteken eindigt!",
"numberTooShort":"Dit nummer kan niet korter dan {0} karakters zijn!",
"numberTooLong":"Dit nummer kan niet langer dan {0} karakters zijn!",
"numberLengthInvalid":"Dit nummer moet {0} karakters lang zijn!",
@@ -48,10 +56,12 @@
"numberNegative":"Dit nummer kan niet negatief zijn!",
"numberPositive":"Dit nummer kan niet positief zijn!",
"numberZero":"Dit nummer kan niet nul zijn!",
"numberNan":"Dit nummer kan geen NaN (Not A Number) zijn!",
"numberInvertedContains":"Dit nummer mag niet {0} bevatten!",
"booleanTrue":"Deze boolean kan niet true zijn!",
"booleanFalse":"Deze boolean kan niet false zijn!",
"arrayEmptyDisabled":"Deze array mag niet leeg zijn!",
"arrayEmptyRequired":"Deze array moet leeg zijn!",
"arrayTooShort":"Deze array moet een minimum lengte hebben van {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"Deze array moet een lengte hebben van {0}!",
"arrayInvalidTypes":"Deze array kan alleen de volgende waardes bevatten: {0}!",
"arrayDouble":"Deze array staat dubbele waardes niet toe!",
"discordInvalidId":"Dit is een ongeldig discord {0} id!",
"discordInvalidIdOptions":"Dit is an ongeldig discord {0} id! Je kan ook een van deze gebruiken: {1}!",
"discordInvalidToken":"Dit is een ongeldig discord token (syntactisch)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"Deze url heeft een ongeldig pad!",
"idNotUnique":"Dit id is niet uniek, gebruik een andere in de plaats!",
"idNonExistent":"Het id {0} bestaat niet!",
"invalidType":"Het type van deze property moet gelijk zijn aan: {0}!",
"propertyMissing":"De property {0} mist in dit object!",
"propertyOptional":"De property {0} is optioneel in dit object!",
@@ -84,12 +94,13 @@
"nullInvalid":"Deze property kan niet null zijn!",
"switchInvalidType":"Dit moet een van de volgende types zijn: {0}!",
"objectSwitchInvalid":"Dit object moet een van de volgende types zijn: {0}!",
"invalidLanguage":"Dit is een ongeldige taal!",
"invalidButton":"Deze knop moet een {0} of {1} hebben!",
"unusedOption":"De optie {0} wordt nergens gebruikt!",
"unusedQuestion":"The vraag {0} wordt nergens gebruikt!",
"dropdownOption":"Een paneel met dropdown mag alleen opties bevaten van het 'ticket' type!"
"dropdownOption":"Een paneel met dropdown mag alleen opties bevaten van het 'ticket' type!",
"customInvalidVersion":"De versie gespecificeerd in u configbestand komt niet overeen! Zorg dat u het configbestand geüpdatet heeft naar de laatste versie!"
}
},
"actions":{
@@ -132,6 +143,7 @@
"blacklistAddDm":"Toegevoegd Aan Blacklist",
"blacklistRemoveDm":"Verwijderd Van Blacklist",
"clear":"Tickets Opgeruimd",
"clearTickets":"Tickets Opruimen",
"roles":"Rollen Bijgewerkt",
"autoclose":"Ticket Automatisch Gesloten",
@@ -139,7 +151,12 @@
"autocloseDisabled":"Autoclose Uitgeschakeld",
"autodelete":"Ticket Automatisch Verwijderd",
"autodeleteEnabled":"Autodelete Ingeschakeld",
"autodeleteDisabled":"Autodelete Uitgeschakeld"
"autodeleteDisabled":"Autodelete Uitgeschakeld",
"topicSet":"Onderwerp Veranderd",
"prioritySet":"Prioriteit Veranderd",
"priorityGet":"Ticket Prioriteit",
"transfer":"Ticket Overgedragen"
},
"descriptions":{
"create":"Je ticket is aangemaakt. Klik op de knop hier onder om er naar toe te gaan!",
@@ -154,7 +171,7 @@
"move":"Het ticket is succesvol verplaatst naar {0}!",
"add":"{0} is succesvol toegevoegd aan het ticket!",
"remove":"{0} is succesvol verwijderd van het ticket!",
"helpExplanation":"`<naam>` => verplichte parameter\n`[naam]` => optionele parameter",
"statsReset":"De bot stats zijn succesvol gereset!",
"statsError":"Kan ticket stats niet bekijken!\n{0} is geen ticket!",
@@ -167,20 +184,25 @@
"clearVerify":"Weet je zeker dat je meerdere tickets wilt verwijderen? Deze actie kan niet teruggedraaid worden!",
"clearReady":"{0} tickets zijn succesvol verwijderd!",
"rolesEmpty":"Geen enkele rollen zijn bijgewerkt!",
"autocloseLeave":"Dit ticket is automatisch gesloten omdat de maker de server verlaten is!",
"autocloseTimeout":"Dit ticket is automatisch gesloten omdat het inactief was voor meer dan `{0} uur`!",
"autocloseTimeout":"Dit ticket is automatisch gesloten omdat het meer dan `{0} uur` inactief was!",
"autodeleteLeave":"Dit ticket is automatisch verwijderd omdat de maker de server verlaten is!",
"autodeleteTimeout":"Dit ticket is automatisch verwijderd omdat het inactief was voor meer dan `{0} dagen`!",
"autocloseEnabled":"Autoclose is ingeschakeld in dit ticket!\nHet wordt gesloten wanneer het inactief is voor meer dan `{0} uur`!",
"autodeleteTimeout":"Dit ticket is automatisch verwijderd omdat het meer dan `{0} dagen` inactief was!",
"autocloseEnabled":"Autoclose is ingeschakeld in dit ticket!\nHet wordt gesloten na `{0} uur` inactiviteit!",
"autocloseDisabled":"Autoclose is uitgeschakeld in dit ticket!\nHet wordt niet meer automatisch gesloten!",
"autodeleteEnabled":"Autodelete is ingeschakeld in dit ticket!\nHet wordt verwijderd wanneer het inactief is voor meer dan `{0} dagen`!",
"autodeleteEnabled":"Autodelete is ingeschakeld in dit ticket!\nHet wordt verwijderd na `{0} dagen` inactiviteit!",
"autodeleteDisabled":"Autodelete is uitgeschakeld in dit ticket!\nHet wordt niet meer automatisch verwijderd!",
"ticketMessageLimit":"Je kan maar {0} ticket(s) op het zelfde moment aanmaken!",
"ticketMessageAutoclose":"Dit ticket wordt automatisch gesloten wanneer het inactief is voor {0} uur!",
"ticketMessageAutodelete":"Dit ticket wordt automatisch verwijderd wanneer het inactief is voor {0} dagen!",
"panelReady":"Je kan het paneel hier onder vinden!\nDit bericht kan nu verwijderd worden!"
"panelReady":"Het paneel is beschikbaar in het volgende bericht!\nDit bericht kan verwijderd worden!",
"topicSet":"Het kanaalsonderwerp is succesvol veranderd naar {0}!",
"prioritySet":"De ticket prioriteit is succesvol veranderd naar {0} door {1}!",
"priorityGet":"De huidige prioriteit van dit ticket is {0}.",
"transfer":"Het ticket is succesvol overgedragen van {0} naar {1} door {2}!"
},
"modal":{
"closePlaceholder":"Waarom heb je dit ticket gesloten?",
@@ -215,12 +237,19 @@
"addDm":"{0} is toegevoegd aan jouw ticket in onze server!",
"removeLog":"{0} is verwijderd van dit ticket door {1}!",
"removeDm":"{0} is verwijderd van jouw ticket in onze server!",
"blacklistAddLog":"{0} is geblacklist door {1}!",
"blacklistRemoveLog":"{0} is verwijderd van de blacklist door {1}!",
"blacklistAddDm":"Je bent geblacklist in onze server!\nVanaf nu kan je geen tickets meer aanmaken!",
"blacklistRemoveDm":"Je bent verwijderd van de blacklist in onze server!\nNormaal zou je nu terug tickets kunnen aanmaken!",
"clearLog":"{0} tickets zijn verwijderd door by {1}!"
"clearLog":"{0} tickets zijn verwijderd door by {1}!",
"transferLog":"Het ticket is overgedragen van {0} naar {1} door {2}!",
"transferDm":"U ticket is overgedragen van {0} naar {1} in onze server!",
"prioritySetLog":"De prioriteit van dit ticket is veranderd naar {0} door {1}!",
"prioritySetDm":"De prioriteit van u ticket is veranderd naar {0} in onze server!",
"roleUpdateLog":"{0} heeft zijn/haar rollen bewerkt!",
"roleUpdateDm":"U rollen in onze server zijn veranderd!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Transcript Aangemaakt",
"textFileDescription":"Dit is een tekst transcript van een verwijderd ticket!",
"htmlProgress":"Gelieve te wachten terwijl dit html transcript verwerkt wordt...",
"createdChannel":"Een nieuw {0} transcript is aangemaakt in de server!",
"createdCreator":"Een nieuw {0} transcript is aangemaakt voor een van jouw tickets!",
"createdParticipant":"Een nieuw {0} transcript is aangemaakt in een van de tickets waar jij lid van was!",
@@ -241,7 +270,19 @@
"retry":"Herprobeer",
"continue":"Verwijder Zonder Transcript",
"backup":"Maak Backup Transcript",
"error":"Er is iets misgegaan bij het maken van het transcript.\nWat wil je doen?\n\nDit ticket wordt niet meer verwijderd to je een van de onderstaande knoppen gebruikt."
"error":"Er is iets misgegaan bij het maken van het transcript.\nWat wil je doen?\n\nDit ticket wordt niet meer verwijderd to je een van de onderstaande knoppen gebruikt.",
"title":"Transcript Error"
},
"text":{
"messagesTitle":"BERICHTEN",
"embedTitle":"EMBED",
"fileTitle":"BESTAND",
"fieldsTitle":"VELDEN",
"reactionsTitle":"REACTIES",
"statsTitle":"STATS",
"emptyContent":"<inhoud is leeg>",
"noTitle":"<geen-titel>",
"noDesc":"<geen-beschrijving>"
}
},
"errors":{
@@ -257,10 +298,11 @@
"unknownPanel":"Onbekend Paneel",
"notInGuild":"Niet In Server",
"channelRename":"Kan Kanaal Niet Hernoemen",
"busy":"Ticket Is Bezig"
"busy":"Ticket Is Bezig",
"permissionError":"Permission Error"
},
"descriptions":{
"askForInfo":"Contacteer the eigenaar van deze bot voor meer info!",
"askForInfo":"Contacteer de eigenaar van deze bot voor meer info!",
"askForInfoResolve":"Contacteer de eigenaar van deze bot als het probleem niet opgelost wordt na enkele keren.",
"internalError":"Gefaald om te reageren op deze {0} door een interne error!",
"optionMissing":"Een verplichte parameter mist in deze command!",
@@ -280,7 +322,10 @@
"notInGuild":"Deze {0} werkt niet in DM! Probeer het opnieuw in een server!",
"channelRename":"Door discord ratelimits is het op dit moment onmogelijk voor de bot om het kanaal te hernoemen. Het kanaal zal automatisch hernoemd worden over 10 min als de bot niet herstart wordt.",
"channelRenameSource":"De bron van deze error is: {0}",
"busy":"Kan deze {0} niet gebruiken!\nHet ticket wordt op dit moment verwerkt door de bot.\n\nProbeer het opnieuw binnen een paar seconden!"
"busy":"Kan deze {0} niet gebruiken!\nHet ticket wordt op dit moment verwerkt door de bot.\n\nProbeer het opnieuw binnen een paar seconden!",
"closeBeforeMessage":"Dit ticket kan niet gesloten/verwijderd worden vooraleer er een bericht door een gebruiker verstuurd is.",
"closeBeforeAdminMessage":"Dit ticket kan niet gesloten/verwijderd worden vooraleer er een bericht door een ticket admin of supportlid verstuurd is.",
"unableToCreateTicket":"U kunt geen ticket aanmaken."
},
"optionInvalidReasons":{
"stringRegex":"Waarde is niet gelijk aan het patroon!",
@@ -331,7 +376,6 @@
"added":"Toegevoegd",
"removed":"Verwijderd",
"filter":"Filter",
"claimedBy":"Geclaimd Door {0}",
"method":"Methode",
"type":"Type",
"blacklisted":"Geblacklist",
@@ -355,7 +399,27 @@
"status":"Status",
"claimed":"Geclaimd",
"pinned":"Gepind",
"creationDate":"Aanmaakdatum"
"creationDate":"Aanmaakdatum",
"noone":"Niemand",
"open":"Open",
"closed":"Gesloten",
"priority":"Prioriteit",
"participants":"Deelnemers",
"yes":"Ja",
"no":"Nee",
"option":"Optie",
"topic":"Onderwerp",
"uptime":"Systeem Uptime",
"messages":"Berichten",
"embeds":"Embeds",
"files":"Bestanden",
"components":"Componenten",
"cooldown":"Cooldown",
"maxTickets":"Max Tickets",
"admins":"Admins",
"roles":"Rollen",
"size":"Grootte"
},
"lowercase":{
"text":"tekst",
@@ -384,6 +448,7 @@
"unclaim":"Ontclaim dit ticket.",
"pin":"Pin dit ticket.",
"unpin":"Maak dit ticket los.",
"move":"Verplaats een ticket.",
"moveId":"Het id van de optie waarnaar je wilt verplaatsen.",
"rename":"Hernoem een ticket.",
@@ -392,6 +457,7 @@
"addUser":"De gebruiker om toe te voegen.",
"remove":"Verwijder een user van dit ticket.",
"removeUser":"De gebruiker om te verwijderen.",
"blacklist":"Beheer de ticket blacklist.",
"blacklistView":"Bekijk de huidige blacklist.",
"blacklistAdd":"Voeg een gebruiker toe aan de blacklist.",
@@ -405,6 +471,7 @@
"statsUserUser":"De gebruiker om te bekijken.",
"statsTicket":"Bekijk de stats van een ticket in de server.",
"statsTicketTicket":"Het ticket om te bekijken.",
"clear":"Verwijder meerdere tickets tegelijkertijd.",
"clearFilter":"De filter om tickets op te ruimen.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"Losgemaakt (niet gepind)",
"autoclose":"Automatisch Gesloten"
},
"autoclose":"Beheer autoclose in een ticket.",
"autocloseDisable":"Schakel autoclose in dit ticket uit.",
"autocloseEnable":"Schakel autoclose in dit ticket in.",
@@ -424,7 +492,19 @@
"autodelete":"Beheer autodelete in een ticket.",
"autodeleteDisable":"Schakel autodelete in dit ticket aan.",
"autodeleteEnable":"Schakel autodelete in dit ticket aan.",
"autodeleteEnableTime":"De hoeveelheid dagen dat dit ticket inactief moet zijn voor het te verwijderen."
"autodeleteEnableTime":"De hoeveelheid dagen dat dit ticket inactief moet zijn voor het te verwijderen.",
"topic":"Beheer het onderwerp van een ticket kanaal.",
"topicSet":"Verander het onderwerp van een ticket kanaal.",
"topicValue":"Het nieuwe onderwerp van het kanaal.",
"topicList":"Bekijk een lijst van alle tickets met hun onderwerp en stats.",
"priority":"Beheer de prioriteit van een ticket.",
"prioritySet":"Verander de prioriteit van een ticket.",
"priorityValue":"De prioriteit van het kanaal.",
"priorityGet":"Bekijk de prioriteit van een ticket.",
"priorityList":"Bekijk een lijst van alle tickets met hun prioriteit.",
"transfer":"Draag het ticket eigendom over van de ene naar de andere gebruiker.",
"transferUser":"De user om naar over te dragen."
},
"helpMenu":{
"help":"Krijg een lijst van alle beschikbare commands.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Zet autoclose uit in dit ticket.",
"autocloseEnable":"Zet autoclose in aan dit ticket.",
"autodeleteDisable":"Zet autodelete uit in dit ticket.",
"autodeleteEnable":"Zet autodelete aan in dit ticket."
"autodeleteEnable":"Zet autodelete aan in dit ticket.",
"categories":{
"general":"Algemene Commands",
"basicTicket":"Basis Ticket Commands",
"advancedTicket":"Geavanceerde Ticket Commands",
"userTicket":"Gebruiker Ticket Commands",
"admin":"Admin Commands",
"advanced":"Geavanceerde Commands",
"extra":"Extra Commands"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"Systeem Stats",
"user":"User Stats",
"ticket":"Ticket Stats",
"participants":"Deelnemers"
"participants":"Deelnemers",
"messages":"Berichten"
},
"properties":{
"ticketsCreated":"Tickets Aangemaakt",
@@ -472,7 +562,47 @@
"ticketsPinned":"Tickets Gepind",
"ticketsMoved":"Tickets Verplaatst",
"usersBlacklisted":"Users Geblacklist",
"transcriptsCreated":"Transcripts Aangemaakt"
"transcriptsCreated":"Transcripts Aangemaakt",
"ticketsAutodeleted":"Tickets Autodeleted",
"ticketsTransferred":"Tickets Overgedragen",
"ticketVolume":"Ticket Volume",
"averageTickets":"Gemiddelde Tickets/Gebruiker",
"currentTickets":"Huidige Tickets",
"age":"Ticket Leeftijd",
"responseTime":"Antwoordtijd",
"resolutionTime":"Oplostijd",
"createdOn":"Gemaakt Op",
"createdBy":"Gemaakt Door",
"closedOn":"Gesloten Op",
"closedBy":"Gesloten Door",
"claimedOn":"Geclaimed Op",
"claimedBy":"Geclaimed Door",
"pinnedOn":"Gepint Op",
"pinnedBy":"Gepint Door",
"deletedOn":"Verwijderd Op",
"deletedBy":"Verwijderd Door"
},
"roles":{
"developer":"Developer",
"serverOwner":"Server Eigenaar",
"serverAdmin":"Server Admin",
"moderator":"Moderator Team",
"support":"Support Team",
"member":"Serverlid"
}
},
"panel":{
"selectTicket":"Selecteer u ticket",
"selectRole":"Selecteer u rol",
"selectOption":"Selecteer u optie"
},
"priorities":{
"urgent":"Urgent",
"veryHigh":"Zeer Hoog",
"high":"Hoog",
"normal":"Normaal",
"low":"Laag",
"veryLow":"Zeer Laag",
"none":"Geen"
}
}
+156 -26
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["DJj123dj"],
"lastedited":"21/08/2024",
"lastedited":"03/12/2025",
"language":"English",
"automated":false
},
@@ -31,7 +31,15 @@
"stringContains":"This string needs to contain {0}!",
"stringChoices":"This string can only be one of the following values: {0}!",
"stringRegex":"This string is invalid!",
"stringInvertedContains":"This string is not allowed to contain {0}!",
"stringLowercase":"This string must be written in lowercase only!",
"stringUppercase":"This string must be written in uppercase only!",
"stringSpecialCharacters":"This string is not allowed to contain any special characters! (a-z, 0-9 & space only)",
"stringNoSpaces":"This string is not allowed to contain spaces!",
"stringCapitalWord":"It's recommended that each word in this string starts with a capital letter!",
"stringCapitalSentence":"It looks like some sentences in this string don't start with a capital letter!",
"stringPunctuation":"It looks like the sentence in this string doesn't end with a punctuation mark!",
"numberTooShort":"This number can't be shorter than {0} characters!",
"numberTooLong":"This number can't be longer than {0} characters!",
"numberLengthInvalid":"This number needs to be {0} characters long!",
@@ -48,10 +56,12 @@
"numberNegative":"This number can't be negative!",
"numberPositive":"This number can't be positive!",
"numberZero":"This number can't be zero!",
"numberNan":"This number can't be NaN (Not A Number)!",
"numberInvertedContains":"This number is not allowed to contain {0}!",
"booleanTrue":"This boolean can't be true!",
"booleanFalse":"This boolean can't be false!",
"arrayEmptyDisabled":"This array isn't allowed to be empty!",
"arrayEmptyRequired":"This array is required to be empty!",
"arrayTooShort":"This array needs to have a length of at least {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"This array needs to have a length of {0}!",
"arrayInvalidTypes":"This array can only contain the following types: {0}!",
"arrayDouble":"This array doesn't allow the same value twice!",
"discordInvalidId":"This is an invalid discord {0} id!",
"discordInvalidIdOptions":"This is an invalid discord {0} id! You can also use one of these: {1}!",
"discordInvalidToken":"This is an invalid discord token (syntactically)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"This url has an invalid path!",
"idNotUnique":"This id isn't unique, use another id instead!",
"idNonExistent":"The id {0} doesn't exist!",
"invalidType":"This property needs to be the type: {0}!",
"propertyMissing":"The property {0} is missing from this object!",
"propertyOptional":"The property {0} is optional in this object!",
@@ -84,12 +94,13 @@
"nullInvalid":"This property can't be null!",
"switchInvalidType":"This needs to be one of the following types: {0}!",
"objectSwitchInvalid":"This object needs to be one of the following types: {0}!",
"invalidLanguage":"This is an invalid language!",
"invalidButton":"This button needs to have at least an {0} or {1}!",
"unusedOption":"The option {0} isn't used anywhere!",
"unusedQuestion":"The question {0} isn't used anywhere!",
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!"
"dropdownOption":"A panel with dropdown enabled can only contain options of the 'ticket' type!",
"customInvalidVersion":"The version specified in your config does not match! Make sure you have updated the config to the latest version!"
}
},
"actions":{
@@ -132,6 +143,7 @@
"blacklistAddDm":"Added To Blacklist",
"blacklistRemoveDm":"Removed From Blacklist",
"clear":"Tickets Cleared",
"clearTickets":"Clear Tickets",
"roles":"Roles Updated",
"autoclose":"Ticket Autoclosed",
@@ -139,7 +151,12 @@
"autocloseDisabled":"Autoclose Disabled",
"autodelete":"Ticket Autodeleted",
"autodeleteEnabled":"Autodelete Enabled",
"autodeleteDisabled":"Autodelete Disabled"
"autodeleteDisabled":"Autodelete Disabled",
"topicSet":"Topic Changed",
"prioritySet":"Priority Changed",
"priorityGet":"Ticket Priority",
"transfer":"Ticket Transferred"
},
"descriptions":{
"create":"Your ticket has been created. Click the button below to access it!",
@@ -154,7 +171,7 @@
"move":"The ticket has been moved to {0} successfully!",
"add":"{0} has been added to the ticket successfully!",
"remove":"{0} has been removed from the ticket successfully!",
"helpExplanation":"`<name>` => required parameter\n`[name]` => optional parameter",
"statsReset":"The bot stats have been reset successfully!",
"statsError":"Unable to view ticket stats!\n{0} is not a ticket!",
@@ -167,7 +184,7 @@
"clearVerify":"Are you sure you want to delete multiple tickets?\nThis action can't be undone!",
"clearReady":"{0} tickets have been deleted successfully!",
"rolesEmpty":"No roles have been updated!",
"autocloseLeave":"This ticket has been autoclosed because the creator left the server!",
"autocloseTimeout":"This ticket has been autoclosed because it has been inactive for more than `{0}h`!",
"autodeleteLeave":"This ticket has been autodeleted because the creator left the server!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Autoclose has been disabled in this ticket!\nIt won't be closed automatically anymore!",
"autodeleteEnabled":"Autodelete has been enabled in this ticket!\nIt will be deleted when it is inactive for more than `{0} days`!",
"autodeleteDisabled":"Autodelete has been disabled in this ticket!\nIt won't be deleted automatically anymore!",
"ticketMessageLimit":"You can only create {0} ticket(s) at the same time!",
"ticketMessageAutoclose":"This ticket will be autoclosed when inactive for {0}h!",
"ticketMessageAutodelete":"This ticket will be autodeleted when inactive for {0} days!",
"panelReady":"You can find the panel below!\nThis message can now be deleted!"
"panelReady":"The panel is available in the followup message!\nThis message can now be deleted!",
"topicSet":"The channel topic has been changed by {0} successfully!",
"prioritySet":"The ticket priority has been changed to {0} by {1} successfully!",
"priorityGet":"The current priority of this ticket is {0}.",
"transfer":"The ticket ownership has been transferred from {0} to {1} by {2} successfully!"
},
"modal":{
"closePlaceholder":"Why did you close this ticket?",
@@ -215,12 +237,19 @@
"addDm":"{0} has been added to your ticket in our server!",
"removeLog":"{0} has been removed from this ticket by {1}!",
"removeDm":"{0} has been removed from your ticket in our server!",
"blacklistAddLog":"{0} was blacklisted by {1}!",
"blacklistRemoveLog":"{0} was removed from the blacklist by {1}!",
"blacklistAddDm":"You have been blacklisted in our server!\nFrom now on, you are unable to create a ticket!",
"blacklistRemoveDm":"You have been removed from the blacklist in our server!\nNow you can create tickets again!",
"clearLog":"{0} tickets have been deleted by {1}!"
"clearLog":"{0} tickets have been deleted by {1}!",
"transferLog":"The ownership of this ticket has been transferred from {0} to {1} by {2}!",
"transferDm":"The ownership of your ticket has been transferred from {0} to {1} in our server!",
"prioritySetLog":"The priority of this ticket has been changed to {0} by {1}!",
"prioritySetDm":"The priority of your ticket has been changed to {0} in our server!",
"roleUpdateLog":"{0} has updated their roles!",
"roleUpdateDm":"Your roles in our server have been updated!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Transcript Created",
"textFileDescription":"This is the text transcript of a deleted ticket!",
"htmlProgress":"Please wait while this html transcript is getting processed...",
"createdChannel":"A new {0} transcript has been created in the server!",
"createdCreator":"A new {0} transcript has been created for one of your tickets!",
"createdParticipant":"A new {0} transcript has been created in one of the tickets you participated in!",
@@ -241,7 +270,19 @@
"retry":"Retry",
"continue":"Delete Without Transcript",
"backup":"Create Backup Transcript",
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons."
"error":"Something went wrong while trying to create the transcript.\nWhat would you like to do?\n\nThis ticket won't be deleted until you click one of these buttons.",
"title":"Transcript Error"
},
"text":{
"messagesTitle":"MESSAGES",
"embedTitle":"EMBED",
"fileTitle":"FILE",
"fieldsTitle":"FIELDS",
"reactionsTitle":"REACTIONS",
"statsTitle":"STATS",
"emptyContent":"<content is empty>",
"noTitle":"<no-title>",
"noDesc":"<no-description>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Unknown Panel",
"notInGuild":"Not In Server",
"channelRename":"Unable To Rename Channel",
"busy":"Ticket Is Busy"
"busy":"Ticket Is Busy",
"permissionError":"Permission Error"
},
"descriptions":{
"askForInfo":"Contact the owner of this bot for more info!",
@@ -280,7 +322,10 @@
"notInGuild":"This {0} doesn't work in DM! Please try it again in a server!",
"channelRename":"Due to discord ratelimits, it's currently impossible for the bot to rename the channel. The channel will automatically be renamed over 10 minutes if the bot isn't rebooted.",
"channelRenameSource":"The source of this error is: {0}",
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!"
"busy":"Unable to use this {0}!\nThe ticket is currently being processed by the bot.\n\nPlease try again in a few seconds!",
"closeBeforeMessage":"This ticket cannot be closed/deleted before a message has been sent by a user.",
"closeBeforeAdminMessage":"This ticket cannot be closed/deleted before a message has been sent by a ticket admin or support member.",
"unableToCreateTicket":"You are unable to create a ticket."
},
"optionInvalidReasons":{
"stringRegex":"Value doesn't match pattern!",
@@ -331,7 +376,6 @@
"added":"Added",
"removed":"Removed",
"filter":"Filter",
"claimedBy":"Claimed By {0}",
"method":"Method",
"type":"Type",
"blacklisted":"Blacklisted",
@@ -355,7 +399,27 @@
"status":"Status",
"claimed":"Claimed",
"pinned":"Pinned",
"creationDate":"Creation Date"
"creationDate":"Creation Date",
"noone":"No-One",
"open":"Open",
"closed":"Closed",
"priority":"Priority",
"participants":"Participants",
"yes":"Yes",
"no":"No",
"option":"Option",
"topic":"Topic",
"uptime":"System Uptime",
"messages":"Messages",
"embeds":"Embeds",
"files":"Files",
"components":"Components",
"cooldown":"Cooldown",
"maxTickets":"Max Tickets",
"admins":"Admins",
"roles":"Roles",
"size":"Size"
},
"lowercase":{
"text":"text",
@@ -384,6 +448,7 @@
"unclaim":"Unclaim a ticket.",
"pin":"Pin a ticket.",
"unpin":"Unpin a ticket.",
"move":"Move a ticket.",
"moveId":"The identifier of the option that you want to move to.",
"rename":"Rename a ticket.",
@@ -392,6 +457,7 @@
"addUser":"The user to add.",
"remove":"Remove a user from a ticket.",
"removeUser":"The user to remove.",
"blacklist":"Manage the ticket blacklist.",
"blacklistView":"View a list of the current blacklist.",
"blacklistAdd":"Add a user to the blacklist.",
@@ -405,6 +471,7 @@
"statsUserUser":"The user to view.",
"statsTicket":"View the stats of a ticket in the server.",
"statsTicketTicket":"The ticket to view.",
"clear":"Delete multiple tickets at the same time.",
"clearFilter":"The filter for clearing tickets.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"Unpinned",
"autoclose":"Autoclosed"
},
"autoclose":"Manage autoclose in a ticket.",
"autocloseDisable":"Disable autoclose in this ticket.",
"autocloseEnable":"Enable autoclose in this ticket.",
@@ -424,7 +492,19 @@
"autodelete":"Manage autodelete in a ticket.",
"autodeleteDisable":"Disable autodelete in this ticket.",
"autodeleteEnable":"Enable autodelete in this ticket.",
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it."
"autodeleteEnableTime":"The amount of days this ticket needs to be inactive to delete it.",
"topic":"Manage the topic of the ticket channel.",
"topicSet":"Set the topic of the ticket channel.",
"topicValue":"The new topic of the channel.",
"topicList":"Get a list of all tickets with their topic and stats.",
"priority":"Manage the priority of the ticket.",
"prioritySet":"Set the priority of the ticket.",
"priorityValue":"The priority of the channel.",
"priorityGet":"Get the priority of the ticket.",
"priorityList":"Get a list of all tickets with their priority status.",
"transfer":"Transfer the ticket ownership from one user to another.",
"transferUser":"The user to transfer to."
},
"helpMenu":{
"help":"Get a list of all the available commands.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Disable autoclose in this ticket.",
"autocloseEnable":"Enable autoclose in this ticket.",
"autodeleteDisable":"Disable autodelete in this ticket.",
"autodeleteEnable":"Enable autodelete in this ticket."
"autodeleteEnable":"Enable autodelete in this ticket.",
"categories":{
"general":"General Commands",
"basicTicket":"Basic Ticket Commands",
"advancedTicket":"Advanced Ticket Commands",
"userTicket":"User Ticket Commands",
"admin":"Admin Commands",
"advanced":"Advanced Commands",
"extra":"Extra Commands"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"System Stats",
"user":"User Stats",
"ticket":"Ticket Stats",
"participants":"Participants"
"participants":"Participants",
"messages":"Messages"
},
"properties":{
"ticketsCreated":"Tickets Created",
@@ -472,7 +562,47 @@
"ticketsPinned":"Tickets Pinned",
"ticketsMoved":"Tickets Moved",
"usersBlacklisted":"Users Blacklisted",
"transcriptsCreated":"Transcripts Created"
"transcriptsCreated":"Transcripts Created",
"ticketsAutodeleted":"Tickets Autodeleted",
"ticketsTransferred":"Tickets Transferred",
"ticketVolume":"Ticket Volume",
"averageTickets":"Average Tickets/User",
"currentTickets":"Current Tickets",
"age":"Ticket Age",
"responseTime":"Response Time",
"resolutionTime":"Resolution Time",
"createdOn":"Created On",
"createdBy":"Created By",
"closedOn":"Closed On",
"closedBy":"Closed By",
"claimedOn":"Claimed On",
"claimedBy":"Claimed By",
"pinnedOn":"Pinned On",
"pinnedBy":"Pinned By",
"deletedOn":"Deleted On",
"deletedBy":"Deleted By"
},
"roles":{
"developer":"Developer",
"serverOwner":"Server Owner",
"serverAdmin":"Server Admin",
"moderator":"Moderator Team",
"support":"Support Team",
"member":"Member"
}
},
"panel":{
"selectTicket":"Select your ticket",
"selectRole":"Select your role",
"selectOption":"Select your option"
},
"priorities":{
"urgent":"Urgent",
"veryHigh":"Very High",
"high":"High",
"normal":"Normal",
"low":"Low",
"veryLow":"Very Low",
"none":"None"
}
}
+158 -28
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["iamnotmega","ChatGPT"],
"lastedited":"21/10/2024",
"lastedited":"03/12/2025",
"language":"Estonian",
"automated":true
},
@@ -31,7 +31,15 @@
"stringContains":"See string peab sisaldama {0}!",
"stringChoices":"See string võib olla ainult üks järgmistest väärtustest: {0}!",
"stringRegex":"See string on kehtetu!",
"stringInvertedContains":"See string ei tohi sisaldada {0}!",
"stringLowercase":"See string peab olema kirjutatud ainult väikeste tähtedega!",
"stringUppercase":"See string peab olema kirjutatud ainult suurte tähtedega!",
"stringSpecialCharacters":"See string ei tohi sisaldada erimärke! (ainult a-z, 0-9 ja tühik)",
"stringNoSpaces":"See string ei tohi sisaldada tühikuid!",
"stringCapitalWord":"Soovitatav on, et iga sõna selles stringis algaks suure tähega!",
"stringCapitalSentence":"Tundub, et mõned laused selles stringis ei alga suure tähega!",
"stringPunctuation":"Tundub, et lause selles stringis ei lõpe kirjavahemärgiga!",
"numberTooShort":"See number ei tohi olla lühem kui {0} tähemärki!",
"numberTooLong":"See number ei tohi olla pikem kui {0} tähemärki!",
"numberLengthInvalid":"See number peab olema {0} tähemärki pikk!",
@@ -48,10 +56,12 @@
"numberNegative":"See arv ei saa olla negatiivne!",
"numberPositive":"See arv ei saa olla positiivne!",
"numberZero":"See arv ei saa olla null!",
"numberNan":"See number ei tohi olla NaN (mitte number)!",
"numberInvertedContains":"See number ei tohi sisaldada {0}!",
"booleanTrue":"See tõeväärtus ei saa olla tõsi!",
"booleanFalse":"See tõeväärtus ei saa olla vale!",
"arrayEmptyDisabled":"See massiiv ei tohi olla tühi!",
"arrayEmptyRequired":"See massiiv peab olema tühi!",
"arrayTooShort":"Selle massiivi pikkus peab olema vähemalt {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"Selle massiivi pikkus peab olema {0}!",
"arrayInvalidTypes":"See massiiv võib sisaldada ainult järgmisi tüüpe: {0}!",
"arrayDouble":"See massiiv ei luba sama väärtust kaks korda kasutada!",
"discordInvalidId":"See on kehtetu Discordi {0} ID!",
"discordInvalidIdOptions":"See on kehtetu Discordi {0} ID! Võite kasutada ka ühte järgmistest: {1}!",
"discordInvalidToken":"See on kehtetu Discordi tooken (süntaktiliselt)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"Sellel URL-il on vale tee!",
"idNotUnique":"See ID ei ole kordumatu, kasutage selle asemel teist ID-d!",
"idNonExistent":"ID-d {0} pole olemas!",
"invalidType":"Selle atribuudi tüüp peab olema: {0}!",
"propertyMissing":"Sellel objektil puudub atribuut {0}!",
"propertyOptional":"Atribuut {0} on selles objektis valikuline!",
@@ -84,12 +94,13 @@
"nullInvalid":"See vara ei saa olla tühi!",
"switchInvalidType":"See peab olema üks järgmistest tüüpidest: {0}!",
"objectSwitchInvalid":"See objekt peab olema ühte järgmistest tüüpidest: {0}!",
"invalidLanguage":"See on sobimatu keel!",
"invalidButton":"Sellel nupul peab olema vähemalt {0} või {1}!",
"unusedOption":"Valik {0} ei ole kusagil kasutusel!",
"unusedQuestion":"Küsimust {0} ei kasutata kuskil!",
"dropdownOption":"Lubatud rippmenüüga paneel võib sisaldada ainult \"pileti\" tüüpi valikuid!"
"dropdownOption":"Lubatud rippmenüüga paneel võib sisaldada ainult \"pileti\" tüüpi valikuid!",
"customInvalidVersion":"Teie konfiguratsioonis määratud versioon ei ühti! Veenduge, et olete konfiguratsiooni uuendanud uusimale versioonile!"
}
},
"actions":{
@@ -122,7 +133,7 @@
"move":"Pilet teisaldatud",
"add":"Pileti kasutaja lisatud",
"remove":"Pileti kasutaja eemaldatud",
"help":"Saadaolevad käsud",
"statsReset":"Lähtestage statistika",
"blacklistAdd":"Kasutaja on mustas nimekirjas",
@@ -132,14 +143,20 @@
"blacklistAddDm":"Lisatud musta nimekirja",
"blacklistRemoveDm":"Eemaldatud mustast nimekirjast",
"clear":"Piletid kustutatud",
"clearTickets":"Kustuta Piletid",
"roles":"Rollid uuendatud",
"autoclose":"Pilet automaatselt suletud",
"autocloseEnabled":"Automaatne sulgemine lubatud",
"autocloseDisabled":"Automaatne sulgemine keelatud",
"autodelete":"Pilet on automaatselt kustutatud",
"autodeleteEnabled":"Automaatne kustutamine lubatud",
"autodeleteDisabled":"Automaatne kustutamine keelatud"
"autodeleteDisabled":"Automaatne kustutamine keelatud",
"topicSet":"Teema Muudetud",
"prioritySet":"Prioriteet Muudetud",
"priorityGet":"Pileti Prioriteet",
"transfer":"Pilet Üle Antud"
},
"descriptions":{
"create":"Teie pilet on loodud. Sellele juurdepääsuks klõpsake alloleval nupul!",
@@ -154,7 +171,7 @@
"move":"Pilet teisaldati asukohta {0} edukalt!",
"add":"{0} lisati piletile edukalt!",
"remove":"{0} eemaldati piletist edukalt!",
"helpExplanation":"`<nimi>` => nõutav parameeter\n`[nimi]` => valikuline parameeter",
"statsReset":"Boti statistika on edukalt lähtestatud!",
"statsError":"Piletistatistikat ei saa vaadata!\n{0} ei ole pilet!",
@@ -167,7 +184,7 @@
"clearVerify":"Kas soovite kindlasti mitu piletit kustutada?\nSeda toimingut ei saa tagasi võtta!",
"clearReady":"{0} piletit on edukalt kustutatud!",
"rolesEmpty":"Ühtegi rolli pole värskendatud!",
"autocloseLeave":"See pilet on automaatselt suletud, kuna looja lahkus serverist!",
"autocloseTimeout":"See pilet on automaatselt suletud, kuna see on olnud passiivne rohkem kui `{0}h`!",
"autodeleteLeave":"See pilet on automaatselt kustutatud, kuna looja lahkus serverist!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Automaatne sulgemine on sellel piletil keelatud!\nSeda ei suleta enam automaatselt!",
"autodeleteEnabled":"Sellel piletil on automaatne kustutamine lubatud!\nSee kustutatakse, kui see on passiivne rohkem kui `{0} päeva`!",
"autodeleteDisabled":"Automaatne kustutamine on sellel piletil keelatud!\nSeda ei kustutata enam automaatselt!",
"ticketMessageLimit":"Saate korraga luua ainult {0} piletit!",
"ticketMessageAutoclose":"See pilet suletakse automaatselt, kui see on {0} tundi passiivne!",
"ticketMessageAutodelete":"See pilet kustutatakse automaatselt, kui see on {0} päeva passiivne!",
"panelReady":"Paneeli leiate altpoolt!\nSelle sõnumi saab nüüd kustutada!"
"panelReady":"Paneel on saadaval järelteates!\nSelle sõnumi võib nüüd kustutada!",
"topicSet":"Kanaliteema on edukalt muudetud kasutaja {0} poolt!",
"prioritySet":"Pileti prioriteet on edukalt muudetud väärtuseks {0} kasutaja {1} poolt!",
"priorityGet":"Selle pileti praegune prioriteet on {0}.",
"transfer":"Pileti omand on edukalt üle antud kasutajalt {0} kasutajale {1} kasutaja {2} poolt!"
},
"modal":{
"closePlaceholder":"Miks sa selle pileti kinni panid?",
@@ -215,12 +237,19 @@
"addDm":"{0} lisati teie piletile meie serveris!",
"removeLog":"Kasutaja {1} eemaldas sellelt piletilt {0}!",
"removeDm":"{0} on teie piletist meie serveris eemaldatud!",
"blacklistAddLog":"{1} lisas kasutaja {0} musta nimekirja!",
"blacklistRemoveLog":"Kasutaja {1} eemaldas kasutaja {0} mustast nimekirjast!",
"blacklistAddDm":"Olete meie serveris mustas nimekirjas!\nNüüdsest ei saa te piletit luua!",
"blacklistRemoveDm":"Teid on meie serveri mustast nimekirjast eemaldatud!\nNüüd saate uuesti pileteid luua!",
"clearLog":"{1} on kustutanud {0} piletit!"
"clearLog":"{1} on kustutanud {0} piletit!",
"transferLog":"Selle pileti omand on üle antud kasutajalt {0} kasutajale {1} kasutaja {2} poolt!",
"transferDm":"Teie pileti omand on üle antud kasutajalt {0} kasutajale {1} meie serveris!",
"prioritySetLog":"Selle pileti prioriteet on muudetud väärtuseks {0} kasutaja {1} poolt!",
"prioritySetDm":"Teie pileti prioriteet on muudetud väärtuseks {0} meie serveris!",
"roleUpdateLog":"{0} uuendas oma rolle!",
"roleUpdateDm":"Teie rolle meie serveris on uuendatud!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Transkriptsioon loodud",
"textFileDescription":"See on kustutatud pileti teksti ärakiri!",
"htmlProgress":"Palun oodake, kuni seda html-i ärakirja töödeldakse...",
"createdChannel":"Serveris on loodud uus {0} ärakiri!",
"createdCreator":"Ühe teie pileti jaoks on loodud uus {0} ärakiri!",
"createdParticipant":"Ühes teie osalenud piletis on loodud uus {0} ärakiri!",
@@ -241,7 +270,19 @@
"retry":"Proovi uuesti",
"continue":"Kustuta ilma ärakirjata",
"backup":"Loo varukoopia ärakirjast",
"error":"Midagi läks ärakirja loomisel valesti.\nMida sa teha tahaksid?\n\nSeda piletit ei kustutata enne, kui klõpsate ühel neist nuppudest."
"error":"Midagi läks ärakirja loomisel valesti.\nMida sa teha tahaksid?\n\nSeda piletit ei kustutata enne, kui klõpsate ühel neist nuppudest.",
"title":"Transkriptsiooniviga"
},
"text":{
"messagesTitle":"SÕNUMID",
"embedTitle":"EMBED",
"fileTitle":"FAIL",
"fieldsTitle":"VÄLJAD",
"reactionsTitle":"REAKTSIOONID",
"statsTitle":"STATISTIKA",
"emptyContent":"<sisu on tühi>",
"noTitle":"<pealkiri puudub>",
"noDesc":"<kirjeldus puudub>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Tundmatu paneel",
"notInGuild":"Pole serveris",
"channelRename":"Kanalit ei saa ümber nimetada",
"busy":"Pilet on kinni"
"busy":"Pilet on kinni",
"permissionError":"Õiguste Viga"
},
"descriptions":{
"askForInfo":"Lisateabe saamiseks võtke ühendust selle roboti omanikuga!",
@@ -280,7 +322,10 @@
"notInGuild":"See {0} ei tööta DM-is! Palun proovi uuesti serveris!",
"channelRename":"Ebakõlaliste kiiruspiirangute tõttu on robotil praegu võimatu kanalit ümber nimetada. Kui robotit ei taaskäivitata, nimetatakse kanal 10 minuti jooksul automaatselt ümber.",
"channelRenameSource":"Selle vea allikas on: {0}",
"busy":"Seda {0} ei saa kasutada!\nPiletit töötleb praegu bot.\n\nPalun proovige mõne sekundi pärast uuesti!"
"busy":"Seda {0} ei saa kasutada!\nPiletit töötleb praegu bot.\n\nPalun proovige mõne sekundi pärast uuesti!",
"closeBeforeMessage":"Seda piletit ei saa sulgeda/kustutada enne, kui kasutaja on sõnumi saatnud.",
"closeBeforeAdminMessage":"Seda piletit ei saa sulgeda/kustutada enne, kui piletihaldur või tugiliige on sõnumi saatnud.",
"unableToCreateTicket":"Te ei saa piletit luua."
},
"optionInvalidReasons":{
"stringRegex":"Väärtus ei vasta mustrile!",
@@ -331,7 +376,6 @@
"added":"Lisatud",
"removed":"Eemaldatud",
"filter":"Filter",
"claimedBy":"Nõude esitas {0}",
"method":"Meetod",
"type":"Tüüp",
"blacklisted":"Mustas nimekirjas",
@@ -355,7 +399,27 @@
"status":"Olek",
"claimed":"Nõutud",
"pinned":"Kinnitatud",
"creationDate":"Loomise kuupäev"
"creationDate":"Loomise kuupäev",
"noone":"Mitte Keegi",
"open":"Avatud",
"closed":"Suletud",
"priority":"Prioriteet",
"participants":"Osalejad",
"yes":"Jah",
"no":"Ei",
"option":"Valik",
"topic":"Teema",
"uptime":"Süsteemi Töötamise Aeg",
"messages":"Sõnumid",
"embeds":"Embedid",
"files":"Failid",
"components":"Komponendid",
"cooldown":"Jahtumisaeg",
"maxTickets":"Maksimaalselt Pileteid",
"admins":"Adminid",
"roles":"Rollid",
"size":"Suurus"
},
"lowercase":{
"text":"tekst",
@@ -384,6 +448,7 @@
"unclaim":"Tühista pilet.",
"pin":"Kinnitage pilet.",
"unpin":"Vabastage pilet.",
"move":"Liigutage pilet.",
"moveId":"Selle valiku identifikaator, millele soovite liikuda.",
"rename":"Nimetage pilet ümber.",
@@ -392,6 +457,7 @@
"addUser":"Lisatav kasutaja.",
"remove":"Kasutaja eemaldamine piletist.",
"removeUser":"Eemaldatav kasutaja.",
"blacklist":"Hallake piletite musta nimekirja.",
"blacklistView":"Vaadake praeguse musta nimekirja loendit.",
"blacklistAdd":"Lisage kasutaja musta nimekirja.",
@@ -405,6 +471,7 @@
"statsUserUser":"Kasutaja vaatamiseks.",
"statsTicket":"Vaadake serveris pileti statistikat.",
"statsTicketTicket":"Pilet vaatamiseks.",
"clear":"Kustutage mitu piletit korraga.",
"clearFilter":"Piletite puhastamise filter.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"Vabastatud",
"autoclose":"Automaatselt suletud"
},
"autoclose":"Hallake piletis automaatset sulgemist.",
"autocloseDisable":"Keela sellel piletil automaatne sulgemine.",
"autocloseEnable":"Luba sellel piletil automaatne sulgemine.",
@@ -424,7 +492,19 @@
"autodelete":"Automaatse kustutamise haldamine piletis.",
"autodeleteDisable":"Keela sellel piletil automaatne kustutamine.",
"autodeleteEnable":"Luba sellel piletil automaatne kustutamine.",
"autodeleteEnableTime":"Päevade arv, mille jooksul see pilet peab olema selle kustutamiseks passiivne."
"autodeleteEnableTime":"Päevade arv, mille jooksul see pilet peab olema selle kustutamiseks passiivne.",
"topic":"Halda pileti kanali teemat.",
"topicSet":"Määra pileti kanali teema.",
"topicValue":"Kanali uus teema.",
"topicList":"Hangi nimekiri kõigist piletitest koos nende teemade ja statistikaga.",
"priority":"Halda pileti prioriteeti.",
"prioritySet":"Määra pileti prioriteet.",
"priorityValue":"Kanali prioriteet.",
"priorityGet":"Hangi pileti prioriteet.",
"priorityList":"Hangi nimekiri kõigist piletitest ja nende prioriteedi olekust.",
"transfer":"Anna pileti omand üle ühelt kasutajalt teisele.",
"transferUser":"Kasutaja, kellele omand üle anda."
},
"helpMenu":{
"help":"Hankige kõigi saadaolevate käskude loend.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Keela sellel piletil automaatne sulgemine.",
"autocloseEnable":"Luba sellel piletil automaatne sulgemine.",
"autodeleteDisable":"Keela sellel piletil automaatne kustutamine.",
"autodeleteEnable":"Luba sellel piletil automaatne kustutamine."
"autodeleteEnable":"Luba sellel piletil automaatne kustutamine.",
"categories":{
"general":"Üldised Käsud",
"basicTicket":"Põhilised Piletikäsud",
"advancedTicket":"Täpsemad Piletikäsud",
"userTicket":"Kasutaja Piletikäsud",
"admin":"Admini Käsud",
"advanced":"Täpsemad Käsud",
"extra":"Lisakäsud"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"Süsteemi statistika",
"user":"Kasutaja statistika",
"ticket":"Piletistatistika",
"participants":"Osalejad"
"participants":"Osalejad",
"messages":"Sõnumid"
},
"properties":{
"ticketsCreated":"Pileteid loodud",
@@ -472,7 +562,47 @@
"ticketsPinned":"Pileteid kinnitatud",
"ticketsMoved":"Pileteid teisaldatud",
"usersBlacklisted":"Kasutajaid mustas nimekirjas",
"transcriptsCreated":"Loodud ärakirjad"
"transcriptsCreated":"Loodud ärakirjad",
"ticketsAutodeleted":"Piletid Automaatselt Kustutatud",
"ticketsTransferred":"Piletid Üle Antud",
"ticketVolume":"Piletite Arv",
"averageTickets":"Keskmine Piletite Arv/Kasutaja",
"currentTickets":"Praegused Piletid",
"age":"Pileti Vanus",
"responseTime":"Reageerimisaeg",
"resolutionTime":"Lahendusaeg",
"createdOn":"Loodud",
"createdBy":"Looja",
"closedOn":"Suletud",
"closedBy":"Sulgenud",
"claimedOn":"Võetud",
"claimedBy":"Võtnud",
"pinnedOn":"Kinnitatud",
"pinnedBy":"Kinnitanud",
"deletedOn":"Kustutatud",
"deletedBy":"Kustutanud"
},
"roles":{
"developer":"Arendaja",
"serverOwner":"Serveri Omanik",
"serverAdmin":"Serveri Administraator",
"moderator":"Moderaatorite Meeskond",
"support":"Tugimeeskond",
"member":"Liige"
}
},
"panel":{
"selectTicket":"Vali oma pilet",
"selectRole":"Vali oma roll",
"selectOption":"Vali oma valik"
},
"priorities":{
"urgent":"Kiireloomuline",
"veryHigh":"Väga Kõrge",
"high":"Kõrge",
"normal":"Tavaline",
"low":"Madal",
"veryLow":"Väga Madal",
"none":"Puudub"
}
}
+159 -29
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["iamnotmega","ChatGPT"],
"lastedited":"21/10/2024",
"lastedited":"03/12/2025",
"language":"Finnish",
"automated":true
},
@@ -31,7 +31,15 @@
"stringContains":"Tämän merkkijonon täytyy sisältää {0}!",
"stringChoices":"Tämä merkkijono voi olla vain yksi seuraavista arvoista: {0}!",
"stringRegex":"Tämä merkkijono on virheellinen!",
"stringInvertedContains":"Tämä merkkijono ei saa sisältää {0}!",
"stringLowercase":"Tämä merkkijono on kirjoitettava vain pienillä kirjaimilla!",
"stringUppercase":"Tämä merkkijono on kirjoitettava vain isoilla kirjaimilla!",
"stringSpecialCharacters":"Tämä merkkijono ei saa sisältää erikoismerkkejä! (vain a–z, 0–9 ja välilyönti)",
"stringNoSpaces":"Tämä merkkijono ei saa sisältää välilyöntejä!",
"stringCapitalWord":"On suositeltavaa, että jokainen sana tässä merkkijonossa alkaa isolla kirjaimella!",
"stringCapitalSentence":"Näyttää siltä, että jotkut lauseet tässä merkkijonossa eivät ala isolla kirjaimella!",
"stringPunctuation":"Näyttää siltä, että tämän merkkijonon lause ei pääty välimerkkiin!",
"numberTooShort":"Tämä numero ei voi olla lyhyempi kuin {0} merkkiä!",
"numberTooLong":"Tämä numero ei voi olla pidempi kuin {0} merkkiä!",
"numberLengthInvalid":"Tämän numeron on oltava {0} merkkiä pitkä!",
@@ -48,10 +56,12 @@
"numberNegative":"Tämä luku ei voi olla negatiivinen!",
"numberPositive":"Tämä luku ei voi olla positiivinen!",
"numberZero":"Tämä luku ei voi olla nolla!",
"numberNan":"Tämä numero ei voi olla NaN (ei numero)!",
"numberInvertedContains":"Tämä numero ei saa sisältää {0}!",
"booleanTrue":"Tämä boolean ei voi olla totta!",
"booleanFalse":"Tämä boolean ei voi olla väärä!",
"arrayEmptyDisabled":"Tämä taulukko ei saa olla tyhjä!",
"arrayEmptyRequired":"Tämän taulukon on oltava tyhjä!",
"arrayTooShort":"Tämän taulukon pituuden on oltava vähintään {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"Tämän taulukon pituuden on oltava {0}!",
"arrayInvalidTypes":"Tämä matriisi voi sisältää vain seuraavat tyypit: {0}!",
"arrayDouble":"Tämä matriisi ei salli samaa arvoa kahdesti!",
"discordInvalidId":"Tämä on virheellinen discord {0} -tunnus!",
"discordInvalidIdOptions":"Tämä on virheellinen discord {0} -tunnus! Voit myös käyttää jotakin seuraavista: {1}!",
"discordInvalidToken":"Tämä on virheellinen discord tunnus (syntaktisesti)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"Tällä URL-osoitteella on virheellinen polku!",
"idNotUnique":"Tämä tunnus ei ole ainutlaatuinen, käytä sen sijaan toista tunnusta!",
"idNonExistent":"Tunnusta {0} ei ole olemassa!",
"invalidType":"Tämän ominaisuuden on oltava tyyppiä: {0}!",
"propertyMissing":"Ominaisuus {0} puuttuu tästä objektista!",
"propertyOptional":"Ominaisuus {0} on valinnainen tässä objektissa!",
@@ -84,12 +94,13 @@
"nullInvalid":"Tämä omaisuus ei voi olla tyhjä!",
"switchInvalidType":"Tämän on oltava jokin seuraavista: {0}!",
"objectSwitchInvalid":"Tämän objektin on oltava jokin seuraavista tyypeistä: {0}!",
"invalidLanguage":"Tämä on virheellinen kieli!",
"invalidButton":"Tässä painikkeessa on oltava vähintään {0} tai {1}!",
"unusedOption":"Vaihtoehtoa {0} ei käytetä missään!",
"unusedQuestion":"Kysymystä {0} ei käytetä missään!",
"dropdownOption":"Paneeli, jossa pudotusvalikko on käytössä, voi sisältää vain \"lippu\"-tyyppisiä vaihtoehtoja!"
"dropdownOption":"Paneeli, jossa pudotusvalikko on käytössä, voi sisältää vain \"lippu\"-tyyppisiä vaihtoehtoja!",
"customInvalidVersion":"Määritetty versio kokoonpanossasi ei vastaa! Varmista, että olet päivittänyt kokoonpanon uusimpaan versioon!"
}
},
"actions":{
@@ -122,7 +133,7 @@
"move":"Lippu siirretty",
"add":"Lipun käyttäjä lisätty",
"remove":"Lipun käyttäjä poistettu",
"help":"Käytettävissä olevat komennot",
"statsReset":"Nollaa tilastot",
"blacklistAdd":"Käyttäjä mustalla listalla",
@@ -132,14 +143,20 @@
"blacklistAddDm":"Lisätty mustalle listalle",
"blacklistRemoveDm":"Poistettu mustalta listalta",
"clear":"Liput tyhjennetty",
"clearTickets":"Tyhjennä Tiketit",
"roles":"Roolit päivitetty",
"autoclose":"Lippu suljettu automaattisesti",
"autocloseEnabled":"Automaattinen sulkeminen käytössä",
"autocloseDisabled":"Automaattinen sulkeminen pois käytöstä",
"autodelete":"Lippu poistettu automaattisesti",
"autodeleteEnabled":"Automaattinen poisto käytössä",
"autodeleteDisabled":"Automaattinen poisto poissa käytöstä"
"autodeleteDisabled":"Automaattinen poisto poissa käytöstä",
"topicSet":"Aihe Muutettu",
"prioritySet":"Prioriteetti Muutettu",
"priorityGet":"Tiketin Prioriteetti",
"transfer":"Tiketti Siirretty"
},
"descriptions":{
"create":"Lippusi on luotu. Napsauta alla olevaa painiketta päästäksesi siihen!",
@@ -154,7 +171,7 @@
"move":"Lippu on siirretty kohteeseen {0} onnistuneesti!",
"add":"{0} on lisätty lippuun onnistuneesti!",
"remove":"{0} on poistettu lipusta onnistuneesti!",
"helpExplanation":"`<nimi>` => pakollinen parametri\n`[nimi]` => valinnainen parametri",
"statsReset":"Bottitilastot on nollattu onnistuneesti!",
"statsError":"Lipputilastoja ei voi tarkastella!\n{0} ei ole lippu!",
@@ -167,7 +184,7 @@
"clearVerify":"Haluatko varmasti poistaa useita lippuja? Tätä toimintoa ei voi kumota!",
"clearReady":"{0} lippua on poistettu onnistuneesti!",
"rolesEmpty":"Rooleja ei ole päivitetty!",
"autocloseLeave":"Tämä lippu on suljettu automaattisesti, koska luoja poistui palvelimelta!",
"autocloseTimeout":"Tämä lippu on suljettu automaattisesti, koska se on ollut passiivinen yli `{0}h`!",
"autodeleteLeave":"Tämä lippu on poistettu automaattisesti, koska sisällöntuottaja poistui palvelimelta!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Automaattinen sulkeminen on poistettu käytöstä tässä lipussa! Se ei enää sulkeudu automaattisesti!",
"autodeleteEnabled":"Automaattinen poisto on otettu käyttöön tässä lipussa! Se poistetaan, kun se on passiivinen yli `{0} päivään`!",
"autodeleteDisabled":"Automaattinen poisto on poistettu käytöstä tässä lipussa! Sitä ei enää poisteta automaattisesti!",
"ticketMessageLimit":"Voit luoda vain {0} lippua samanaikaisesti!",
"ticketMessageAutoclose":"Tämä lippu suljetaan automaattisesti, kun se ei ole aktiivinen {0} tuntia!",
"ticketMessageAutodelete":"Tämä lippu poistetaan automaattisesti, kun se ei ole aktiivinen {0} päivään!",
"panelReady":"Löydät paneelin alta! Tämä viesti voidaan nyt poistaa!"
"panelReady":"Paneeli on saatavilla jatkoviestissä!\nTämä viesti voidaan nyt poistaa!",
"topicSet":"Kanavan aihe on vaihdettu käyttäjän {0} toimesta onnistuneesti!",
"prioritySet":"Tiketin prioriteetti on vaihdettu arvoksi {0} käyttäjän {1} toimesta onnistuneesti!",
"priorityGet":"Tämän tiketin nykyinen prioriteetti on {0}.",
"transfer":"Tiketin omistus on siirretty käyttäjältä {0} käyttäjälle {1} käyttäjän {2} toimesta onnistuneesti!"
},
"modal":{
"closePlaceholder":"Miksi suljit tämän lipun?",
@@ -215,12 +237,19 @@
"addDm":"{0} on lisätty lippuusi palvelimellamme!",
"removeLog":"{1} on poistanut {0} tästä lipusta!",
"removeDm":"{0} on poistettu lipustasi palvelimellamme!",
"blacklistAddLog":"{1} lisäsi käyttäjän {0} mustalle listalle!",
"blacklistRemoveLog":"{1} poisti käyttäjän {0} mustalta listalta!",
"blacklistAddDm":"Sinut on mustalla listalla palvelimellamme! Tästä eteenpäin et voi luoda lippua!",
"blacklistRemoveDm":"Sinut on poistettu palvelimemme mustalta listalta! Nyt voit luoda lippuja uudelleen!",
"clearLog":"{1} on poistanut {0} lippua!"
"clearLog":"{1} on poistanut {0} lippua!",
"transferLog":"Tämän tiketin omistus on siirretty käyttäjältä {0} käyttäjälle {1} käyttäjän {2} toimesta!",
"transferDm":"Tiketin omistus on siirretty käyttäjältä {0} käyttäjälle {1} palvelimellamme!",
"prioritySetLog":"Tämän tiketin prioriteetti on vaihdettu arvoksi {0} käyttäjän {1} toimesta!",
"prioritySetDm":"Tiketin prioriteetti on vaihdettu arvoksi {0} palvelimellamme!",
"roleUpdateLog":"{0} on päivittänyt roolinsa!",
"roleUpdateDm":"Roolisi palvelimellamme on päivitetty!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Transkriptio luotu",
"textFileDescription":"Tämä on poistetun lipun tekstikopio!",
"htmlProgress":"Odota, kun tätä html-transkriptiota käsitellään...",
"createdChannel":"Uusi {0}-transkriptio on luotu palvelimelle!",
"createdCreator":"Yhdelle lipullesi on luotu uusi transkriptio {0}!",
"createdParticipant":"Uusi {0}-transkriptio on luotu yhteen lipuista, joihin osallistuit!",
@@ -241,7 +270,19 @@
"retry":"Yritä uudelleen",
"continue":"Poista ilman transkriptiota",
"backup":"Luo varmuuskopio",
"error":"Jotain meni pieleen, kun yritettiin luoda transkriptiota. Mitä haluaisit tehdä? Tätä lippua ei poisteta, ennen kuin napsautat jotakin näistä painikkeista. "
"error":"Jotain meni pieleen, kun yritettiin luoda transkriptiota. Mitä haluaisit tehdä? Tätä lippua ei poisteta, ennen kuin napsautat jotakin näistä painikkeista. ",
"title":"Transkriptiovirhe"
},
"text":{
"messagesTitle":"VIESTIT",
"embedTitle":"UPOTUS",
"fileTitle":"TIEDOSTO",
"fieldsTitle":"KENTÄT",
"reactionsTitle":"REAKTIOT",
"statsTitle":"TILASTOT",
"emptyContent":"<sisältö on tyhjä>",
"noTitle":"<ei-otsikkoa>",
"noDesc":"<ei-kuvausta>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Tuntematon paneeli",
"notInGuild":"Ei Palvelimessa",
"channelRename":"Kanavaa ei voi nimetä uudelleen",
"busy":"Lippu on varattu"
"busy":"Lippu on varattu",
"permissionError":"Käyttöoikeusvirhe"
},
"descriptions":{
"askForInfo":"Ota yhteyttä tämän botin omistajaan saadaksesi lisätietoja!",
@@ -280,7 +322,10 @@
"notInGuild":"Tämä {0} ei toimi DM:ssä! Ole hyvä ja yritä uudelleen palvelimella!",
"channelRename":"Discordin nopeusrajoitusten vuoksi botin on tällä hetkellä mahdotonta nimetä kanavaa uudelleen. Kanava nimetään automaattisesti uudelleen 10 minuutin kuluttua, jos bottia ei käynnistetä uudelleen.",
"channelRenameSource":"Tämän virheen lähde on: {0}",
"busy":"Tätä {0} ei voi käyttää! Botti käsittelee lippua parhaillaan. Yritä uudelleen muutaman sekunnin kuluttua!"
"busy":"Tätä {0} ei voi käyttää! Botti käsittelee lippua parhaillaan. Yritä uudelleen muutaman sekunnin kuluttua!",
"closeBeforeMessage":"Tätä tikettiä ei voi sulkea/poistaa ennen kuin käyttäjä on lähettänyt viestin.",
"closeBeforeAdminMessage":"Tätä tikettiä ei voi sulkea/poistaa ennen kuin tikettien ylläpitäjä tai tukihenkilö on lähettänyt viestin.",
"unableToCreateTicket":"Et voi luoda tikettiä."
},
"optionInvalidReasons":{
"stringRegex":"Arvo ei vastaa mallia!",
@@ -331,7 +376,6 @@
"added":"Lisätty",
"removed":"Poistettu",
"filter":"Suodattaa",
"claimedBy":"Vaatimuksen tekijä: {0}",
"method":"Menetelmä",
"type":"Tyyppi",
"blacklisted":"Mustalla listalla",
@@ -352,10 +396,30 @@
"version":"Versio",
"name":"Nimi",
"role":"Rooli",
"status":"Status",
"status":"Tila",
"claimed":"Väitetty",
"pinned":"Kiinnitetty",
"creationDate":"Luontipäivämäärä"
"creationDate":"Luontipäivämäärä",
"noone":"Ei Kukaan",
"open":"Avoin",
"closed":"Suljettu",
"priority":"Prioriteetti",
"participants":"Osallistujat",
"yes":"Kyllä",
"no":"Ei",
"option":"Vaihtoehto",
"topic":"Aihe",
"uptime":"Järjestelmän Käyttöaika",
"messages":"Viestit",
"embeds":"Upotukset",
"files":"Tiedostot",
"components":"Komponentit",
"cooldown":"Jäähy",
"maxTickets":"Maksimi Tiketit",
"admins":"Ylläpitäjät",
"roles":"Roolit",
"size":"Koko"
},
"lowercase":{
"text":"teksti",
@@ -384,6 +448,7 @@
"unclaim":"Peruuta lippu.",
"pin":"Kiinnitä lippu.",
"unpin":"Irrota lippu.",
"move":"Siirrä lippu.",
"moveId":"Sen vaihtoehdon tunniste, johon haluat siirtyä.",
"rename":"Nimeä lippu uudelleen.",
@@ -392,6 +457,7 @@
"addUser":"Lisättävä käyttäjä.",
"remove":"Poista käyttäjä lipusta.",
"removeUser":"Poistettava käyttäjä.",
"blacklist":"Hallitse lippujen mustaa listaa.",
"blacklistView":"Näytä luettelo nykyisestä mustasta listasta.",
"blacklistAdd":"Lisää käyttäjä mustalle listalle.",
@@ -405,6 +471,7 @@
"statsUserUser":"Käyttäjä katsella.",
"statsTicket":"Tarkastele lipun tilastoja palvelimella.",
"statsTicketTicket":"Lippu katsottavaksi.",
"clear":"Poista useita lippuja samanaikaisesti.",
"clearFilter":"Lippujen tyhjennyssuodatin.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"Irrotettu",
"autoclose":"Automaattisuljettu"
},
"autoclose":"Hallitse automaattista sulkemista lipussa.",
"autocloseDisable":"Poista automaattinen sulkeminen käytöstä tässä lipussa.",
"autocloseEnable":"Ota automaattinen sulkeminen käyttöön tässä lipussa.",
@@ -424,7 +492,19 @@
"autodelete":"Hallitse automaattista poistoa lipussa.",
"autodeleteDisable":"Poista automaattinen poisto käytöstä tässä lipussa.",
"autodeleteEnable":"Ota automaattinen poisto käyttöön tässä lipussa.",
"autodeleteEnableTime":"Kuinka monta päivää tämän lipun on oltava passiivinen, jotta se voidaan poistaa."
"autodeleteEnableTime":"Kuinka monta päivää tämän lipun on oltava passiivinen, jotta se voidaan poistaa.",
"topic":"Hallitse tikettikanavan aihetta.",
"topicSet":"Aseta tikettikanavan aihe.",
"topicValue":"Kanavan uusi aihe.",
"topicList":"Hae lista kaikista tiketeistä niiden aiheen ja tilastojen kanssa.",
"priority":"Hallitse tiketin prioriteettia.",
"prioritySet":"Aseta tiketin prioriteetti.",
"priorityValue":"Kanavan prioriteetti.",
"priorityGet":"Hae tiketin prioriteetti.",
"priorityList":"Hae lista kaikista tiketeistä ja niiden prioriteettitilasta.",
"transfer":"Siirrä tiketin omistus käyttäjältä toiselle.",
"transferUser":"Käyttäjä, jolle omistus siirretään."
},
"helpMenu":{
"help":"Hanki luettelo kaikista käytettävissä olevista komennoista.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Poista automaattinen sulkeminen käytöstä tässä lipussa.",
"autocloseEnable":"Ota automaattinen sulkeminen käyttöön tässä lipussa.",
"autodeleteDisable":"Poista automaattinen poisto käytöstä tässä lipussa.",
"autodeleteEnable":"Ota automaattinen poisto käyttöön tässä lipussa."
"autodeleteEnable":"Ota automaattinen poisto käyttöön tässä lipussa.",
"categories":{
"general":"Yleiset Komennot",
"basicTicket":"Perus Tikettikomennot",
"advancedTicket":"Edistyneet Tikettikomennot",
"userTicket":"Käyttäjän Tikettikomennot",
"admin":"Ylläpitäjäkomennot",
"advanced":"Edistyneet Komennot",
"extra":"Lisäkomennot"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"Järjestelmätilastot",
"user":"Käyttäjätilastot",
"ticket":"Lipputilastot",
"participants":"Osallistujat"
"participants":"Osallistujat",
"messages":"Viestit"
},
"properties":{
"ticketsCreated":"Liput luotu",
@@ -472,7 +562,47 @@
"ticketsPinned":"Liput kiinni",
"ticketsMoved":"Liput siirretty",
"usersBlacklisted":"Käyttäjät mustalla listalla",
"transcriptsCreated":"Transkriptiot luotu"
"transcriptsCreated":"Transkriptiot luotu",
"ticketsAutodeleted":"Tiketit Automaattisesti Poistettu",
"ticketsTransferred":"Tiketit Siirretty",
"ticketVolume":"Tikettilukumäärä",
"averageTickets":"Keskimääräiset Tiketit/Käyttäjä",
"currentTickets":"Nykyiset Tiketit",
"age":"Tiketin Ikä",
"responseTime":"Vastausaika",
"resolutionTime":"Ratkaisuaika",
"createdOn":"Luotu",
"createdBy":"Luonut",
"closedOn":"Suljettu",
"closedBy":"Sulkenut",
"claimedOn":"Otettu Vastaan",
"claimedBy":"Vastaanottanut",
"pinnedOn":"Kiinnitetty",
"pinnedBy":"Kiinnittänyt",
"deletedOn":"Poistettu",
"deletedBy":"Poistanut"
},
"roles":{
"developer":"Kehittäjä",
"serverOwner":"Palvelimen Omistaja",
"serverAdmin":"Palvelimen Ylläpitäjä",
"moderator":"Moderaattoritiimi",
"support":"Tukitiimi",
"member":"Jäsen"
}
},
"panel":{
"selectTicket":"Valitse tikettisi",
"selectRole":"Valitse roolisi",
"selectOption":"Valitse vaihtoehtosi"
},
"priorities":{
"urgent":"Kiireellinen",
"veryHigh":"Erittäin Korkea",
"high":"Korkea",
"normal":"Normaali",
"low":"Matala",
"veryLow":"Erittäin Matala",
"none":"Ei Mikään"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["guillee3"],
"lastedited":"04/12/2024",
"language":"French",
+156 -26
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["benzorich"],
"lastedited":"06/10/2024",
"lastedited":"03/12/2025",
"language":"German",
"automated":false
},
@@ -31,7 +31,15 @@
"stringContains":"Diese Zeichenfolge muss {0} enthalten!",
"stringChoices":"Diese Zeichenfolge kann nur einen der folgenden Werte annehmen: {0}!",
"stringRegex":"Diese Zeichenfolge ist ungültig!",
"stringInvertedContains":"Diese Zeichenkette darf {0} nicht enthalten!",
"stringLowercase":"Diese Zeichenkette muss ausschließlich in Kleinbuchstaben geschrieben werden!",
"stringUppercase":"Diese Zeichenkette muss ausschließlich in Großbuchstaben geschrieben werden!",
"stringSpecialCharacters":"Diese Zeichenkette darf keine Sonderzeichen enthalten! (nur a-z, 0-9 & Leerzeichen)",
"stringNoSpaces":"Diese Zeichenkette darf keine Leerzeichen enthalten!",
"stringCapitalWord":"Es wird empfohlen, dass jedes Wort in dieser Zeichenkette mit einem Großbuchstaben beginnt!",
"stringCapitalSentence":"Es sieht so aus, als würden einige Sätze in dieser Zeichenkette nicht mit einem Großbuchstaben beginnen!",
"stringPunctuation":"Es sieht so aus, als würde der Satz in dieser Zeichenkette nicht mit einem Satzzeichen enden!",
"numberTooShort":"Diese Zahl kann nicht kürzer als {0} Zeichen sein!",
"numberTooLong":"Diese Nummer darf nicht länger als {0} Zeichen sein!",
"numberLengthInvalid":"Diese Nummer muss {0} Zeichen lang sein!",
@@ -48,10 +56,12 @@
"numberNegative":"Diese Zahl kann nicht negativ sein!",
"numberPositive":"Diese Zahl kann nicht positiv sein!",
"numberZero":"Diese Zahl kann nicht Null sein!",
"numberNan":"Diese Zahl darf nicht NaN (Not A Number) sein!",
"numberInvertedContains":"Diese Zahl darf {0} nicht enthalten!",
"booleanTrue":"Dieser boolean Wert kann nicht wahr sein!",
"booleanFalse":"Dieser boolean Wert kann nicht falsch sein!",
"arrayEmptyDisabled":"Dieses Array darf nicht leer sein!",
"arrayEmptyRequired":"Dieses Array muss leer sein!",
"arrayTooShort":"Dieses Array muss eine Länge von mindestens {0} haben!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"Dieses Array muss eine Länge von {0} haben!",
"arrayInvalidTypes":"Dieses Array kann nur die folgenden Typen enthalten: {0}!",
"arrayDouble":"In diesem Array darf derselbe Wert nicht zweimal vorkommen!",
"discordInvalidId":"Dies ist eine ungültige Discord {0} id!",
"discordInvalidIdOptions":"Dies ist eine ungültige Discord {0} id! Du kannst auch eine der folgenden verwenden: {1}!",
"discordInvalidToken":"Das ist ein ungültiger Discord-Token (syntaktisch)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"Diese Url hat einen ungültigen Pfad!",
"idNotUnique":"Diese ID ist nicht eindeutig, verwenden Sie stattdessen eine andere ID!",
"idNonExistent":"Die ID {0} existiert nicht!",
"invalidType":"Diese Eigenschaft muss vom Typ sein: {0}!",
"propertyMissing":"Die Eigenschaft {0} fehlt in diesem Objekt!",
"propertyOptional":"Die Eigenschaft {0} ist in diesem Objekt optional!",
@@ -84,12 +94,13 @@
"nullInvalid":"Diese Eigenschaft kann nicht null sein!",
"switchInvalidType":"Dies muss einer der folgenden Typen sein: {0}!",
"objectSwitchInvalid":"Dieses Objekt muss einer der folgenden Typen sein: {0}!",
"invalidLanguage":"Dies ist eine ungültige Sprache!",
"invalidButton":"Dieser Button muss mindestens eine {0} oder {1} enthalten!",
"unusedOption":"Die Option {0} wird nirgends verwendet!",
"unusedQuestion":"Die Frage {0} wird nirgends verwendet!",
"dropdownOption":"Ein Panel mit aktiviertem Dropdown kann nur Optionen vom Typ 'Ticket' enthalten!"
"dropdownOption":"Ein Panel mit aktiviertem Dropdown kann nur Optionen vom Typ 'Ticket' enthalten!",
"customInvalidVersion":"Die in deiner Konfiguration angegebene Version stimmt nicht überein! Stelle sicher, dass du die Konfiguration auf die neueste Version aktualisiert hast!"
}
},
"actions":{
@@ -132,6 +143,7 @@
"blacklistAddDm":"Zur Blacklist hinzugefügt",
"blacklistRemoveDm":"Von der Blacklist entfernen",
"clear":"Freigegebene Tickets",
"clearTickets":"Tickets Löschen",
"roles":"Aktualisierte Rollen",
"autoclose":"Ticket automatisch geschlossen",
@@ -139,7 +151,12 @@
"autocloseDisabled":"Automatisches schließen Deaktiviert",
"autodelete":"Ticket automatisch gelöscht",
"autodeleteEnabled":"Automatisches Löschen Aktiviert",
"autodeleteDisabled":"Automatisches Löschen Deaktiviert"
"autodeleteDisabled":"Automatisches Löschen Deaktiviert",
"topicSet":"Thema Geändert",
"prioritySet":"Priorität Geändert",
"priorityGet":"Ticket-Priorität",
"transfer":"Ticket Übertragen"
},
"descriptions":{
"create":"Ihr Ticket wurde bereits erstellt. Klicken Sie auf die Button unten, um es zu öffnen!",
@@ -154,7 +171,7 @@
"move":"Das Ticket wurde erfolgreich nach {0} verschoben!",
"add":"{0} wurde erfolgreich zum Ticket hinzugefügt!",
"remove":"{0} wurde erfolgreich aus dem Ticket entfernt!",
"helpExplanation":"`<name>` => erforderlicher Parameter\n`[name]` => optionaler Parameter",
"statsReset":"Die Bot-Statistiken wurden erfolgreich zurückgesetzt!",
"statsError":"Ticketstatistiken können nicht angezeigt werden!\n{0} ist kein Ticket!",
@@ -167,7 +184,7 @@
"clearVerify":"Sind Sie sicher, dass Sie mehrere Tickets löschen möchten?\nDiese Aktion kann nicht rückgängig gemacht werden!",
"clearReady":"{0} Tickets wurden erfolgreich gelöscht!",
"rolesEmpty":"Es wurden keine Rollen aktualisiert!",
"autocloseLeave":"Dieses Ticket wurde automatisch geschlossen, weil der Ersteller den Server verlassen hat!",
"autocloseTimeout":"Dieses Ticket wurde automatisch geschlossen, da es seit mehr als `{0}h` inaktiv ist!",
"autodeleteLeave":"Dieses Ticket wurde automatisch gelöscht, weil der Ersteller den Server verlassen hat!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Autoclose wurde für dieses Ticket deaktiviert! Es wird nicht mehr automatisch geschlossen!",
"autodeleteEnabled":"Automatisches Löschen wurde für dieses Ticket aktiviert! Es wird gelöscht, wenn es länger als `{0} Tage` inaktiv ist!",
"autodeleteDisabled":"Automatisches Löschen wurde bei diesem Ticket deaktiviert! Es wird nicht mehr automatisch gelöscht!",
"ticketMessageLimit":"Sie können nur {0} Tickets gleichzeitig erstellen!",
"ticketMessageAutoclose":"Dieses Ticket wird automatisch geschlossen, wenn es {0}h lang inaktiv war!",
"ticketMessageAutodelete":"Dieses Ticket wird automatisch gelöscht, wenn es {0} Tage lang inaktiv war!",
"panelReady":"Sie finden das Panel unten!\nDiese Nachricht kann jetzt gelöscht werden!"
"panelReady":"Das Panel ist in der folgenden Nachricht verfügbar!\nDiese Nachricht kann nun gelöscht werden!",
"topicSet":"Das Kanalthema wurde erfolgreich von {0} geändert!",
"prioritySet":"Die Ticket-Priorität wurde erfolgreich von {1} auf {0} geändert!",
"priorityGet":"Die aktuelle Priorität dieses Tickets ist {0}.",
"transfer":"Das Ticket wurde erfolgreich von {0} an {1} durch {2} übertragen!"
},
"modal":{
"closePlaceholder":"Warum haben Sie dieses Ticket geschlossen?",
@@ -215,12 +237,19 @@
"addDm":"{0} wurde zu Ihrem Ticket auf unserem Server hinzugefügt!",
"removeLog":"{0} wurde von {1} aus diesem Ticket entfernt!",
"removeDm":"{0} wurde von Ihrem Ticket auf unserem Server entfernt!",
"blacklistAddLog":"{0} wurde von {1} auf die Blacklist gesetzt!",
"blacklistRemoveLog":"{0} wurde von {1} von der Blacklist entfernt!",
"blacklistAddDm":"Sie wurden in unserem Server auf die Blacklist gesetzt!\nAb sofort können Sie kein Ticket mehr erstellen!",
"blacklistRemoveDm":"Sie wurden von der Blacklist unseres Servers entfernt!\n Jetzt können Sie wieder Tickets erstellen!",
"clearLog":"{0} Tickets wurden von {1} gelöscht!"
"clearLog":"{0} Tickets wurden von {1} gelöscht!",
"transferLog":"Das Ticket wurde von {0} an {1} durch {2} übertragen!",
"transferDm":"Dein Ticket wurde von {0} an {1} auf unserem Server übertragen!",
"prioritySetLog":"Die Priorität dieses Tickets wurde von {1} auf {0} geändert!",
"prioritySetDm":"Die Priorität deines Tickets wurde auf unserem Server auf {0} geändert!",
"roleUpdateLog":"{0} hat seine Rollen aktualisiert!",
"roleUpdateDm":"Deine Rollen auf unserem Server wurden aktualisiert!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Transkript erstellt",
"textFileDescription":"Dies ist die Textabschrift eines gelöschten Tickets!",
"htmlProgress":"Bitte warten Sie, während dieses html-Transkript verarbeitet wird...",
"createdChannel":"Ein neues {0} Transkript wurde auf dem Server erstellt!",
"createdCreator":"Es wurde ein neues {0} Transkript für eines Ihrer Tickets erstellt!",
"createdParticipant":"In einem der Tickets, an denen Sie teilgenommen haben, wurde ein neues {0} Transkript erstellt!",
@@ -241,7 +270,19 @@
"retry":"Erneut versuchen",
"continue":"Löschen ohne Transkript",
"backup":"Sicherungstranskript erstellen",
"error":"Beim Versuch, das Transkript zu erstellen, ist etwas schief gelaufen.\nWas möchten Sie tun?\n\nDieses Ticket wird erst gelöscht, wenn Sie auf eine der folgenden Buttons klicken."
"error":"Beim Versuch, das Transkript zu erstellen, ist etwas schief gelaufen.\nWas möchten Sie tun?\n\nDieses Ticket wird erst gelöscht, wenn Sie auf eine der folgenden Buttons klicken.",
"title":"Transkript-Fehler"
},
"text":{
"messagesTitle":"NACHRICHTEN",
"embedTitle":"EMBED",
"fileTitle":"DATEI",
"fieldsTitle":"FELDER",
"reactionsTitle":"REAKTIONEN",
"statsTitle":"STATISTIKEN",
"emptyContent":"<Inhalt ist leer>",
"noTitle":"<kein Titel>",
"noDesc":"<keine Beschreibung>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Unbekanntes Panel",
"notInGuild":"Nicht auf dem Server",
"channelRename":"Kanal kann nicht umbenannt werden",
"busy":"Ticket ist besetzt"
"busy":"Ticket ist besetzt",
"permissionError":"Berechtigungsfehler"
},
"descriptions":{
"askForInfo":"Kontaktieren Sie den Besitzer dieses Bots für weitere Informationen!",
@@ -280,7 +322,10 @@
"notInGuild":"{0} funktioniert nicht in DM! Bitte versuchen Sie es erneut auf einem Server!",
"channelRename":"Aufgrund von Discord-Ratelimits ist es dem Bot derzeit nicht möglich, den Channel umzubenennen. Der Channel wird nach 10 Minuten automatisch umbenannt, wenn der Bot nicht neu gestartet wird.",
"channelRenameSource":"Die Quelle dieses Fehlers ist: {0}",
"busy":"{0} kann nicht verwendet werden!\nDas Ticket wird derzeit vom Bot bearbeitet.\n\nBitte versuchen Sie es in ein paar Sekunden erneut!"
"busy":"{0} kann nicht verwendet werden!\nDas Ticket wird derzeit vom Bot bearbeitet.\n\nBitte versuchen Sie es in ein paar Sekunden erneut!",
"closeBeforeMessage":"Dieses Ticket kann nicht geschlossen/gelöscht werden, bevor eine Nachricht von einem Benutzer gesendet wurde.",
"closeBeforeAdminMessage":"Dieses Ticket kann nicht geschlossen/gelöscht werden, bevor eine Nachricht von einem Ticket-Admin oder Support-Mitglied gesendet wurde.",
"unableToCreateTicket":"Du kannst kein Ticket erstellen."
},
"optionInvalidReasons":{
"stringRegex":"Wert stimmt nicht mit Muster überein!",
@@ -331,7 +376,6 @@
"added":"Hinzugefügt",
"removed":"Entfernt",
"filter":"Filter",
"claimedBy":"Beansprucht von {0}",
"method":"Methode",
"type":"Typ",
"blacklisted":"Gesperrt",
@@ -355,7 +399,27 @@
"status":"Status",
"claimed":"Beansprucht",
"pinned":"Angepinnt",
"creationDate":"Erstellungsdatum"
"creationDate":"Erstellungsdatum",
"noone":"Niemand",
"open":"Offen",
"closed":"Geschlossen",
"priority":"Priorität",
"participants":"Teilnehmer",
"yes":"Ja",
"no":"Nein",
"option":"Option",
"topic":"Thema",
"uptime":"System-Laufzeit",
"messages":"Nachrichten",
"embeds":"Embeds",
"files":"Dateien",
"components":"Komponenten",
"cooldown":"Cooldown",
"maxTickets":"Max. Tickets",
"admins":"Admins",
"roles":"Rollen",
"size":"Größe"
},
"lowercase":{
"text":"text",
@@ -384,6 +448,7 @@
"unclaim":"Beanspruchen Sie ein Ticket zurück.",
"pin":"Pinne ein Ticket an.",
"unpin":"Pinne ein Ticket ab.",
"move":"Verschieben Sie ein Ticket.",
"moveId":"Die Kennung der Option.",
"rename":"Ein Ticket umbenennen.",
@@ -392,6 +457,7 @@
"addUser":"Der hinzuzufügende Benutzer.",
"remove":"Entfernen Sie einen Benutzer aus einem Ticket.",
"removeUser":"Der zu entfernende Benutzer.",
"blacklist":"Verwalten Sie die Blacklist für Tickets.",
"blacklistView":"Zeigen Sie eine Liste der aktuellen Blacklist an.",
"blacklistAdd":"Hinzufügen eines Benutzers zur Blacklist.",
@@ -405,6 +471,7 @@
"statsUserUser":"Der zu betrachtende Benutzer.",
"statsTicket":"Anzeigen der Statistiken eines Tickets auf dem Server.",
"statsTicketTicket":"Das Ticket zur Betrachtung.",
"clear":"Mehrere Tickets gleichzeitig löschen. Optional kann ein Filter angegeben werden.",
"clearFilter":"Der Filter zum Löschen von Tickets.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"nicht Angepinnte",
"autoclose":"Autoclosed"
},
"autoclose":"Verwalten Sie die automatische Schließung in einem Ticket.",
"autocloseDisable":"Deaktivieren Sie das automatische Schließen in diesem Ticket.",
"autocloseEnable":"Aktivieren Sie das automatische Schließen in diesem Ticket.",
@@ -424,7 +492,19 @@
"autodelete":"Verwalten Sie die automatische Löschung in einem Ticket.",
"autodeleteDisable":"Deaktivieren Sie das automatische Löschen in diesem Ticket.",
"autodeleteEnable":"Aktivieren Sie das automatische Löschen in diesem Ticket.",
"autodeleteEnableTime":"Die Anzahl der Tage, die das Ticket inaktiv sein muss, um es zu löschen."
"autodeleteEnableTime":"Die Anzahl der Tage, die das Ticket inaktiv sein muss, um es zu löschen.",
"topic":"Verwalte das Thema des Ticket-Kanals.",
"topicSet":"Setze das Thema des Ticket-Kanals.",
"topicValue":"Das neue Thema des Kanals.",
"topicList":"Zeige eine Liste aller Tickets mit ihrem Thema und Statistiken an.",
"priority":"Verwalte die Priorität des Tickets.",
"prioritySet":"Setze die Priorität des Tickets.",
"priorityValue":"Die Priorität des Kanals.",
"priorityGet":"Zeige die Priorität des Tickets an.",
"priorityList":"Zeige eine Liste aller Tickets mit ihrem Prioritätsstatus an.",
"transfer":"Übertrage das Ticket von einem Benutzer an einen anderen.",
"transferUser":"Der Benutzer, an den übertragen werden soll."
},
"helpMenu":{
"help":"Erhalten Sie eine Liste mit allen verfügbaren Befehlen.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Deaktivieren Sie das automatische Schließen in diesem Ticket.",
"autocloseEnable":"Aktivieren Sie das automatische Schließen in diesem Ticket.",
"autodeleteDisable":"Deaktivieren Sie das automatische Löschen in diesem Ticket.",
"autodeleteEnable":"Aktivieren Sie das automatische Löschen in diesem Ticket."
"autodeleteEnable":"Aktivieren Sie das automatische Löschen in diesem Ticket.",
"categories":{
"general":"Allgemeine Befehle",
"basicTicket":"Basis-Ticket-Befehle",
"advancedTicket":"Erweiterte Ticket-Befehle",
"userTicket":"Benutzer-Ticket-Befehle",
"admin":"Admin-Befehle",
"advanced":"Erweiterte Befehle",
"extra":"Extra-Befehle"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"System-Statistiken",
"user":"Benutzer-Statistiken",
"ticket":"Ticket-Statistiken",
"participants":"Teilnehmer"
"participants":"Teilnehmer",
"messages":"Nachrichten"
},
"properties":{
"ticketsCreated":"Tickets erstellt",
@@ -472,7 +562,47 @@
"ticketsPinned":"Tickets angepinnt",
"ticketsMoved":"Tickets verschoben",
"usersBlacklisted":"Nutzer auf der Blacklist",
"transcriptsCreated":"Transcripts erstellt"
"transcriptsCreated":"Transcripts erstellt",
"ticketsAutodeleted":"Automatisch gelöschte Tickets",
"ticketsTransferred":"Übertragene Tickets",
"ticketVolume":"Ticket-Volumen",
"averageTickets":"Durchschnittliche Tickets/Benutzer",
"currentTickets":"Aktuelle Tickets",
"age":"Ticket-Alter",
"responseTime":"Antwortzeit",
"resolutionTime":"Lösungszeit",
"createdOn":"Erstellt am",
"createdBy":"Erstellt von",
"closedOn":"Geschlossen am",
"closedBy":"Geschlossen von",
"claimedOn":"Angenommen am",
"claimedBy":"Angenommen von",
"pinnedOn":"Angepinnt am",
"pinnedBy":"Angepinnt von",
"deletedOn":"Gelöscht am",
"deletedBy":"Gelöscht von"
},
"roles":{
"developer":"Entwickler",
"serverOwner":"Server-Besitzer",
"serverAdmin":"Server-Administrator",
"moderator":"Moderatoren-Team",
"support":"Support-Team",
"member":"Mitglied"
}
},
"panel":{
"selectTicket":"Wähle dein Ticket",
"selectRole":"Wähle deine Rolle",
"selectOption":"Wähle deine Option"
},
"priorities":{
"urgent":"Dringend",
"veryHigh":"Sehr Hoch",
"high":"Hoch",
"normal":"Normal",
"low":"Niedrig",
"veryLow":"Sehr Niedrig",
"none":"Keine"
}
}
+245 -115
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"translators":["HanumeshGupta"],
"lastedited":"19/06/2025",
"otversion":"v4.1.2",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"03/12/2025",
"language":"Greek",
"automated":true
},
@@ -31,7 +31,15 @@
"stringContains":"Αυτή η συμβολοσειρά πρέπει να περιέχει {0}!",
"stringChoices":"Αυτή η συμβολοσειρά μπορεί να είναι μόνο μία από τις ακόλουθες τιμές: {0}!",
"stringRegex":"Αυτή η συμβολοσειρά είναι άκυρη!",
"stringInvertedContains":"Αυτή η συμβολοσειρά δεν επιτρέπεται να περιέχει {0}!",
"stringLowercase":"Αυτή η συμβολοσειρά πρέπει να είναι γραμμένη μόνο με πεζά!",
"stringUppercase":"Αυτή η συμβολοσειρά πρέπει να είναι γραμμένη μόνο με κεφαλαία!",
"stringSpecialCharacters":"Αυτή η συμβολοσειρά δεν επιτρέπεται να περιέχει ειδικούς χαρακτήρες! (a-z, 0-9 & κενό μόνο)",
"stringNoSpaces":"Αυτή η συμβολοσειρά δεν επιτρέπεται να περιέχει κενά!",
"stringCapitalWord":"Συνιστάται κάθε λέξη σε αυτήν τη συμβολοσειρά να ξεκινά με κεφαλαίο γράμμα!",
"stringCapitalSentence":"Φαίνεται ότι ορισμένες προτάσεις σε αυτήν τη συμβολοσειρά δεν ξεκινούν με κεφαλαίο γράμμα!",
"stringPunctuation":"Φαίνεται ότι η πρόταση σε αυτήν τη συμβολοσειρά δεν τελειώνει με σημείο στίξης!",
"numberTooShort":"Αυτός ο αριθμός δεν μπορεί να είναι μικρότερος από {0} ψηφία!",
"numberTooLong":"Αυτός ο αριθμός δεν μπορεί να είναι μεγαλύτερος από {0} ψηφία!",
"numberLengthInvalid":"Αυτός ο αριθμός πρέπει να είναι {0} ψηφία!",
@@ -48,10 +56,12 @@
"numberNegative":"Αυτός ο αριθμός δεν μπορεί να είναι αρνητικός!",
"numberPositive":"Αυτός ο αριθμός δεν μπορεί να είναι θετικός!",
"numberZero":"Αυτός ο αριθμός δεν μπορεί να είναι μηδέν!",
"numberNan":"Αυτός ο αριθμός δεν μπορεί να είναι NaN (Not A Number)!",
"numberInvertedContains":"Αυτός ο αριθμός δεν επιτρέπεται να περιέχει {0}!",
"booleanTrue":"Αυτό το boolean δεν μπορεί να είναι true!",
"booleanFalse":"Αυτό το boolean δεν μπορεί να είναι false!",
"arrayEmptyDisabled":"Αυτός ο πίνακας δεν επιτρέπεται να είναι κενός!",
"arrayEmptyRequired":"Αυτός ο πίνακας πρέπει να είναι κενός!",
"arrayTooShort":"Αυτός ο πίνακας πρέπει να έχει μήκος τουλάχιστον {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"Αυτός ο πίνακας πρέπει να έχει μήκος {0}!",
"arrayInvalidTypes":"Αυτός ο πίνακας μπορεί να περιέχει μόνο τους ακόλουθους τύπους: {0}!",
"arrayDouble":"Αυτός ο πίνακας δεν επιτρέπει την ίδια τιμή δύο φορές!",
"discordInvalidId":"Αυτό είναι ένα άκυρο discord {0} id!",
"discordInvalidIdOptions":"Αυτό είναι ένα άκυρο discord {0} id! Μπορείτε επίσης να χρησιμοποιήσετε ένα από αυτά: {1}!",
"discordInvalidToken":"Αυτό είναι ένα άκυρο discord token (συντακτικά)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"Αυτό το url έχει άκυρη διαδρομή!",
"idNotUnique":"Αυτό το id δεν είναι μοναδικό, χρησιμοποιήστε άλλο id!",
"idNonExistent":"Το id {0} δεν υπάρχει!",
"invalidType":"Αυτή η ιδιότητα πρέπει να είναι του τύπου: {0}!",
"propertyMissing":"Η ιδιότητα {0} λείπει από αυτό το αντικείμενο!",
"propertyOptional":"Η ιδιότητα {0} είναι προαιρετική σε αυτό το αντικείμενο!",
@@ -84,12 +94,13 @@
"nullInvalid":"Αυτή η ιδιότητα δεν μπορεί να είναι null!",
"switchInvalidType":"Αυτό πρέπει να είναι ένας από τους ακόλουθους τύπους: {0}!",
"objectSwitchInvalid":"Αυτό το αντικείμενο πρέπει να είναι ένας από τους ακόλουθους τύπους: {0}!",
"invalidLanguage":"Αυτή είναι μια άκυρη γλώσσα!",
"invalidButton":"Αυτό το κουμπί πρέπει να έχει τουλάχιστον ένα {0} ή {1}!",
"unusedOption":"Η επιλογή {0} δεν χρησιμοποιείται πουθενά!",
"unusedQuestion":"Η ερώτηση {0} δεν χρησιμοποιείται πουθενά!",
"dropdownOption":"Ένα πάνελ με ενεργοποιημένο dropdown μπορεί να περιέχει μόνο επιλογές τύπου 'ticket'!"
"dropdownOption":"Ένα πάνελ με ενεργοποιημένο dropdown μπορεί να περιέχει μόνο επιλογές τύπου 'ticket'!",
"customInvalidVersion":"Η έκδοση που καθορίστηκε στο config σας δεν ταιριάζει! Βεβαιωθείτε ότι έχετε ενημερώσει το config στην πιο πρόσφατη έκδοση!"
}
},
"actions":{
@@ -132,6 +143,7 @@
"blacklistAddDm":"Προστέθηκε στη Μαύρη Λίστα",
"blacklistRemoveDm":"Αφαιρέθηκε από τη Μαύρη Λίστα",
"clear":"Εισιτήρια Διαγράφηκαν",
"clearTickets":"Εκκαθάριση Tickets",
"roles":"Ενημέρωση Ρόλων",
"autoclose":"Αυτόματο Κλείσιμο",
@@ -139,7 +151,12 @@
"autocloseDisabled":"Απενεργοποιήθηκε Αυτόματο Κλείσιμο",
"autodelete":"Αυτόματη Διαγραφή",
"autodeleteEnabled":"Ενεργοποιήθηκε Αυτόματη Διαγραφή",
"autodeleteDisabled":"Απενεργοποιήθηκε Αυτόματη Διαγραφή"
"autodeleteDisabled":"Απενεργοποιήθηκε Αυτόματη Διαγραφή",
"topicSet":"Το Θέμα Αλλάχθηκε",
"prioritySet":"Η Προτεραιότητα Αλλάχθηκε",
"priorityGet":"Προτεραιότητα Ticket",
"transfer":"Το Ticket Μεταφέρθηκε"
},
"descriptions":{
"create":"Το εισιτήριό σας δημιουργήθηκε. Κάντε κλικ στο παρακάτω κουμπί για να το προσπελάσετε!",
@@ -154,7 +171,7 @@
"move":"Το εισιτήριο μετακινήθηκε στο {0} με επιτυχία!",
"add":"Ο {0} προστέθηκε στο εισιτήριο με επιτυχία!",
"remove":"Ο {0} αφαιρέθηκε από το εισιτήριο με επιτυχία!",
"helpExplanation":"`<όνομα>` => απαιτούμενη παράμετρος\n`[όνομα]` => προαιρετική παράμετρος",
"statsReset":"Τα στατιστικά του bot επαναφέρθηκαν με επιτυχία!",
"statsError":"Αδυναμία προβολής στατιστικών εισιτηρίου!\nτο {0} δεν είναι εισιτήριο!",
@@ -167,7 +184,7 @@
"clearVerify":"Είστε βέβαιοι ότι θέλετε να διαγράψετε πολλά εισιτήρια;\nΑυτή η ενέργεια δεν μπορεί να αναιρεθεί!",
"clearReady":"{0} εισιτήρια διαγράφηκαν με επιτυχία!",
"rolesEmpty":"Δεν ενημερώθηκαν ρόλοι!",
"autocloseLeave":"Αυτό το εισιτήριο έκλεισε αυτόματα επειδή ο δημιουργός άφησε τον server!",
"autocloseTimeout":"Αυτό το εισιτήριο έκλεισε αυτόματα επειδή ήταν ανενεργό για περισσότερο από `{0} ώρες`!",
"autodeleteLeave":"Αυτό το εισιτήριο διαγράφηκε αυτόματα επειδή ο δημιουργός άφησε τον server!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Το αυτόματο κλείσιμο απενεργοποιήθηκε σε αυτό το εισιτήριο!\nΔεν θα κλείνει πλέον αυτόματα!",
"autodeleteEnabled":"Η αυτόματη διαγραφή ενεργοποιήθηκε σε αυτό το εισιτήριο!\nΘα διαγραφεί όταν είναι ανενεργό για περισσότερο από `{0} ημέρες`!",
"autodeleteDisabled":"Η αυτόματη διαγραφή απενεργοποιήθηκε σε αυτό το εισιτήριο!\nΔεν θα διαγράφεται πλέον αυτόματα!",
"ticketMessageLimit":"Μπορείτε να δημιουργήσετε μόνο {0} εισιτήρια ταυτόχρονα!",
"ticketMessageAutoclose":"Αυτό το εισιτήριο θα κλείσει αυτόματα όταν είναι ανενεργό για {0} ώρες!",
"ticketMessageAutodelete":"Αυτό το εισιτήριο θα διαγραφεί αυτόματα όταν είναι ανενεργό για {0} ημέρες!",
"panelReady":"Μπορείτε να βρείτε το πάνελ παρακάτω!\nΑυτό το μήνυμα μπορεί τώρα να διαγραφεί!"
"panelReady":"Το πάνελ είναι διαθέσιμο στο επόμενο μήνυμα!\nΑυτό το μήνυμα μπορεί τώρα να διαγραφεί!",
"topicSet":"Το θέμα του καναλιού άλλαξε επιτυχώς από τον/την {0}!",
"prioritySet":"Η προτεραιότητα του ticket άλλαξε σε {0} από τον/την {1} επιτυχώς!",
"priorityGet":"Η τρέχουσα προτεραιότητα αυτού του ticket είναι {0}.",
"transfer":"Η ιδιοκτησία του ticket μεταφέρθηκε από τον/την {0} στον/στην {1} από τον/την {2} επιτυχώς!"
},
"modal":{
"closePlaceholder":"Γιατί έκλεισες αυτό το εισιτήριο;",
@@ -215,12 +237,19 @@
"addDm":"Ο {0} προστέθηκε στο εισιτήριό σας στον server μας!",
"removeLog":"Ο {0} αφαιρέθηκε από αυτό το εισιτήριο από τον {1}!",
"removeDm":"Ο {0} αφαιρέθηκε από το εισιτήριό σας στον server μας!",
"blacklistAddLog":"Ο {0} προστέθηκε στη μαύρη λίστα από τον {1}!",
"blacklistRemoveLog":"Ο {0} αφαιρέθηκε από τη μαύρη λίστα από τον {1}!",
"blacklistAddDm":"Έχετε προστεθεί στη μαύρη λίστα στον server μας!\nΑπό τώρα, δεν μπορείτε να δημιουργήσετε εισιτήριο!",
"blacklistRemoveDm":"Έχετε αφαιρεθεί από τη μαύρη λίστα στον server μας!\nΤώρα μπορείτε να δημιουργήσετε εισιτήρια ξανά!",
"clearLog":"{0} εισιτήρια διαγράφηκαν από τον {1}!"
"clearLog":"{0} εισιτήρια διαγράφηκαν από τον {1}!",
"transferLog":"Η ιδιοκτησία αυτού του ticket μεταφέρθηκε από τον/την {0} στον/στην {1} από τον/την {2}!",
"transferDm":"Η ιδιοκτησία του ticket σας μεταφέρθηκε από τον/την {0} στον/στην {1} στον server μας!",
"prioritySetLog":"Η προτεραιότητα αυτού του ticket άλλαξε σε {0} από τον/την {1}!",
"prioritySetDm":"Η προτεραιότητα του ticket σας άλλαξε σε {0} στον server μας!",
"roleUpdateLog":"Ο/Η {0} ενημέρωσε τους ρόλους του/της!",
"roleUpdateDm":"Οι ρόλοι σας στον server μας έχουν ενημερωθεί!"
}
},
"transcripts":{
@@ -229,7 +258,7 @@
"ready":"Δημιουργήθηκε Αντίγραφο",
"textFileDescription":"Αυτό είναι το αντίγραφο κειμένου ενός διαγεγραμμένου εισιτηρίου!",
"htmlProgress":"Παρακαλώ περιμένετε ενώ επεξεργάζεται αυτό το html αντίγραφο...",
"createdChannel":"Ένα νέο {0} αντίγραφο δημιουργήθηκε στον server!",
"createdCreator":"Ένα νέο {0} αντίγραφο δημιουργήθηκε για ένα από τα εισιτήριά σας!",
"createdParticipant":"Ένα νέο {0} αντίγραφο δημιουργήθηκε σε ένα εισιτήριο που συμμετείχατε!",
@@ -241,7 +270,19 @@
"retry":"Επανάληψη",
"continue":"Διαγραφή Χωρίς Αντίγραφο",
"backup":"Δημιουργία Αντιγράφου Ασφαλείας",
"error":"Κάτι πήγε στραβά κατά τη δημιουργία του αντιγράφου.\nΤι θα θέλατε να κάνετε;\n\nΑυτό το εισιτήριο δεν θα διαγραφεί μέχρι να κάνετε κλικ σε ένα από αυτά τα κουμπιά."
"error":"Κάτι πήγε στραβά κατά τη δημιουργία του αντιγράφου.\nΤι θα θέλατε να κάνετε;\n\nΑυτό το εισιτήριο δεν θα διαγραφεί μέχρι να κάνετε κλικ σε ένα από αυτά τα κουμπιά.",
"title":"Σφάλμα Transcript"
},
"text":{
"messagesTitle":"ΜΗΝΥΜΑΤΑ",
"embedTitle":"EMBED",
"fileTitle":"ΑΡΧΕΙΟ",
"fieldsTitle":"ΠΕΔΙΑ",
"reactionsTitle":"ΑΝΤΙΔΡΑΣΕΙΣ",
"statsTitle":"ΣΤΑΤΙΣΤΙΚΑ",
"emptyContent":"<το περιεχόμενο είναι κενό>",
"noTitle":"<χωρίς τίτλο>",
"noDesc":"<χωρίς περιγραφή>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Άγνωστο Πάνελ",
"notInGuild":"Δεν Είστε σε Server",
"channelRename":"Αδυναμία Μετονομασίας Κανάλι",
"busy":"Το Εισιτήριο Είναι Απασχολημένο"
"busy":"Το Εισιτήριο Είναι Απασχολημένο",
"permissionError":"Σφάλμα Δικαιωμάτων"
},
"descriptions":{
"askForInfo":"Επικοινωνήστε με τον ιδιοκτήτη αυτού του bot για περισσότερες πληροφορίες!",
@@ -280,7 +322,10 @@
"notInGuild":"Αυτό το {0} δεν λειτουργεί σε DM! Παρακαλώ δοκιμάστε ξανά σε έναν server!",
"channelRename":"Λόγω discord ratelimits, είναι αδύνατο για το bot να μετονομάσει το κανάλι. Το κανάλι θα μετονομαστεί αυτόματα σε 10 λεπτά αν το bot δεν επανεκκινηθεί.",
"channelRenameSource":"Η πηγή αυτού του σφάλματος είναι: {0}",
"busy":"Αδυναμία χρήσης αυτού του {0}!\nΤο εισιτήριο είναι αυτή τη στιγμή σε επεξεργασία από το bot.\n\nΠαρακαλώ δοκιμάστε ξανά σε λίγα δευτερόλεπτα!"
"busy":"Αδυναμία χρήσης αυτού του {0}!\nΤο εισιτήριο είναι αυτή τη στιγμή σε επεξεργασία από το bot.\n\nΠαρακαλώ δοκιμάστε ξανά σε λίγα δευτερόλεπτα!",
"closeBeforeMessage":"Αυτό το ticket δεν μπορεί να κλείσει/διαγραφεί πριν σταλεί ένα μήνυμα από έναν χρήστη.",
"closeBeforeAdminMessage":"Αυτό το ticket δεν μπορεί να κλείσει/διαγραφεί πριν σταλεί μήνυμα από έναν ticket admin ή μέλος υποστήριξης.",
"unableToCreateTicket":"Δεν μπορείτε να δημιουργήσετε ticket."
},
"optionInvalidReasons":{
"stringRegex":"Η τιμή δεν ταιριάζει με το μοτίβο!",
@@ -331,7 +376,6 @@
"added":"Προστέθηκε",
"removed":"Αφαιρέθηκε",
"filter":"Φίλτρο",
"claimedBy":"Αναλήφθηκε Από {0}",
"method":"Μέθοδος",
"type":"Τύπος",
"blacklisted":"Στη Μαύρη Λίστα",
@@ -355,7 +399,27 @@
"status":"Κατάσταση",
"claimed":"Αναληφθείς",
"pinned":"Καρφιτσωμένο",
"creationDate":"Ημερομηνία Δημιουργίας"
"creationDate":"Ημερομηνία Δημιουργίας",
"noone":"Κανείς",
"open":"Ανοιχτό",
"closed":"Κλειστό",
"priority":"Προτεραιότητα",
"participants":"Συμμετέχοντες",
"yes":"Ναι",
"no":"Όχι",
"option":"Επιλογή",
"topic":"Θέμα",
"uptime":"Χρόνος Λειτουργίας Συστήματος",
"messages":"Μηνύματα",
"embeds":"Embeds",
"files":"Αρχεία",
"components":"Στοιχεία",
"cooldown":"Χρόνος Αναμονής",
"maxTickets":"Μέγιστος Αριθμός Tickets",
"admins":"Διαχειριστές",
"roles":"Ρόλοι",
"size":"Μέγεθος"
},
"lowercase":{
"text":"κείμενο",
@@ -373,106 +437,172 @@
"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": "Προβολή στατιστικών από το bot, ένα μέλος ή ένα εισιτήριο.",
"statsReset": "Επαναφορά όλων των στατιστικών του bot (και έναρξη καταμέτρησης από το μηδέν).",
"statsGlobal": "Προβολή παγκόσμιων στατιστικών.",
"statsUser": "Προβολή στατιστικών ενός χρήστη στον server.",
"statsUserUser": "Ο χρήστης που θα προβληθεί.",
"statsTicket": "Προβολή στατιστικών ενός εισιτηρίου στον server.",
"statsTicketTicket": "Το εισιτήριο που θα προβληθεί.",
"clear": "Διαγραφή πολλαπλών εισιτηρίων ταυτόχρονα.",
"clearFilter": "Το φίλτρο για την εκκαθάριση εισιτηρίων.",
"clearFilters": {
"all": "Όλα",
"open": "Ανοιχτά",
"close": "Κλειστά",
"claim": "Αιτηματοποιημένα",
"unclaim": "Μη αιτηματοποιημένα",
"pin": "Καρφιτσωμένα",
"unpin": "Μη καρφιτσωμένα",
"autoclose": "Αυτόματα κλειστά"
"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":"Προβολή στατιστικών από το bot, ένα μέλος ή ένα εισιτήριο.",
"statsReset":"Επαναφορά όλων των στατιστικών του bot (και έναρξη καταμέτρησης από το μηδέν).",
"statsGlobal":"Προβολή παγκόσμιων στατιστικών.",
"statsUser":"Προβολή στατιστικών ενός χρήστη στον server.",
"statsUserUser":"Ο χρήστης που θα προβληθεί.",
"statsTicket":"Προβολή στατιστικών ενός εισιτηρίου στον server.",
"statsTicketTicket":"Το εισιτήριο που θα προβληθεί.",
"clear":"Διαγραφή πολλαπλών εισιτηρίων ταυτόχρονα.",
"clearFilter":"Το φίλτρο για την εκκαθάριση εισιτηρίων.",
"clearFilters":{
"all":"Όλα",
"open":"Ανοιχτά",
"close":"Κλειστά",
"claim":"Αιτηματοποιημένα",
"unclaim":"Μη αιτηματοποιημένα",
"pin":"Καρφιτσωμένα",
"unpin":"Μη καρφιτσωμένα",
"autoclose":"Αυτόματα κλειστά"
},
"autoclose": "Διαχείριση αυτόματου κλεισίματος σε εισιτήριο.",
"autocloseDisable": "Απενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autocloseEnable": "Ενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autocloseEnableTime": "Ο αριθμός των ωρών που απαιτείται για να κλείσει αυτόματα το εισιτήριο λόγω αδράνειας.",
"autodelete": "Διαχείριση αυτόματης διαγραφής σε εισιτήριο.",
"autodeleteDisable": "Απενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"autodeleteEnable": "Ενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"autodeleteEnableTime": "Ο αριθμός των ημερών που απαιτείται για να διαγραφεί αυτόματα το εισιτήριο λόγω αδράνειας."
"autoclose":"Διαχείριση αυτόματου κλεισίματος σε εισιτήριο.",
"autocloseDisable":"Απενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autocloseEnable":"Ενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autocloseEnableTime":"Ο αριθμός των ωρών που απαιτείται για να κλείσει αυτόματα το εισιτήριο λόγω αδράνειας.",
"autodelete":"Διαχείριση αυτόματης διαγραφής σε εισιτήριο.",
"autodeleteDisable":"Απενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"autodeleteEnable":"Ενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"autodeleteEnableTime":"Ο αριθμός των ημερών που απαιτείται για να διαγραφεί αυτόματα το εισιτήριο λόγω αδράνειας.",
"topic":"Διαχειριστείτε το θέμα του καναλιού ticket.",
"topicSet":"Ορίστε το θέμα του καναλιού ticket.",
"topicValue":"Το νέο θέμα του καναλιού.",
"topicList":"Λάβετε μια λίστα όλων των tickets με το θέμα και τα στατιστικά τους.",
"priority":"Διαχειριστείτε την προτεραιότητα του ticket.",
"prioritySet":"Ορίστε την προτεραιότητα του ticket.",
"priorityValue":"Η προτεραιότητα του καναλιού.",
"priorityGet":"Λάβετε την προτεραιότητα του ticket.",
"priorityList":"Λάβετε μια λίστα όλων των tickets με την κατάσταση προτεραιότητάς τους.",
"transfer":"Μεταφέρετε την ιδιοκτησία του ticket από έναν χρήστη σε άλλον.",
"transferUser":"Ο χρήστης στον οποίο θα γίνει η μεταφορά."
},
"helpMenu":{
"help": "Λήψη λίστας όλων των διαθέσιμων εντολών.",
"ticket": "Δημιουργία εισιτηρίου αμέσως.",
"close": "Κλείσιμο εισιτηρίου, αυτό απενεργοποιεί τη γραφή σε αυτό το κανάλι.",
"delete": "Διαγραφή εισιτηρίου, αυτό δημιουργεί μια μεταγραφή όταν είναι ενεργοποιημένη.",
"reopen": "Επαναφορά εισιτηρίου, αυτό ενεργοποιεί ξανά τη γραφή σε αυτό το κανάλι.",
"pin": "Καρφίτσωμα εισιτηρίου. Αυτό θα μετακινήσει το εισιτήριο στην κορυφή και θα προσθέσει ένα emoji '📌' στο όνομα.",
"unpin": "Ξεκαρφίτσωμα εισιτηρίου. Το εισιτήριο θα παραμείνει στη θέση του αλλά θα χάσει το emoji '📌'.",
"move": "Μετακίνηση εισιτηρίου. Αυτό θα αλλάξει τον τύπο αυτού του εισιτηρίου.",
"rename": "Μετονομασία εισιτηρίου. Αυτό θα αλλάξει το όνομα του καναλιού αυτού του εισιτηρίου.",
"claim": "Αιτηματοποίηση εισιτηρίου. Με αυτό, μπορείτε να ενημερώσετε την ομάδα σας ότι το χειρίζεστε.",
"unclaim": "Ακύρωση αιτηματοποίησης εισιτηρίου. Με αυτό, μπορείτε να ενημερώσετε την ομάδα σας ότι το εισιτήριο είναι ελεύθερο ξανά.",
"add": "Προσθήκη χρήστη σε εισιτήριο. Αυτό θα επιτρέψει στον χρήστη να διαβάζει και να γράφει σε αυτό το εισιτήριο.",
"remove": "Αφαίρεση χρήστη από εισιτήριο. Αυτό θα αφαιρέσει τη δυνατότητα ανάγνωσης και εγγραφής για έναν χρήστη σε αυτό το εισιτήριο.",
"panel": "Δημιουργία μηνύματος με αναπτυσσόμενο μενού ή κουμπιά (για δημιουργία εισιτηρίου).",
"blacklistView": "Προβολή λίστας της τρέχουσας μαύρης λίστας.",
"blacklistAdd": "Προσθήκη χρήστη στη μαύρη λίστα.",
"blacklistRemove": "Αφαίρεση χρήστη από τη μαύρη λίστα.",
"blacklistGet": "Λήψη λεπτομερειών από έναν χρήστη στη μαύρη λίστα.",
"statsGlobal": "Προβολή παγκόσμιων στατιστικών.",
"statsTicket": "Προβολή στατιστικών ενός εισιτηρίου στον server.",
"statsUser": "Προβολή στατιστικών ενός χρήστη στον server.",
"statsReset": "Επαναφορά όλων των στατιστικών του bot (και έναρξη καταμέτρησης από το μηδέν).",
"autocloseDisable": "Απενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autocloseEnable": "Ενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autodeleteDisable": "Απενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"autodeleteEnable": "Ενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο."
"help":"Λήψη λίστας όλων των διαθέσιμων εντολών.",
"ticket":"Δημιουργία εισιτηρίου αμέσως.",
"close":"Κλείσιμο εισιτηρίου, αυτό απενεργοποιεί τη γραφή σε αυτό το κανάλι.",
"delete":"Διαγραφή εισιτηρίου, αυτό δημιουργεί μια μεταγραφή όταν είναι ενεργοποιημένη.",
"reopen":"Επαναφορά εισιτηρίου, αυτό ενεργοποιεί ξανά τη γραφή σε αυτό το κανάλι.",
"pin":"Καρφίτσωμα εισιτηρίου. Αυτό θα μετακινήσει το εισιτήριο στην κορυφή και θα προσθέσει ένα emoji '📌' στο όνομα.",
"unpin":"Ξεκαρφίτσωμα εισιτηρίου. Το εισιτήριο θα παραμείνει στη θέση του αλλά θα χάσει το emoji '📌'.",
"move":"Μετακίνηση εισιτηρίου. Αυτό θα αλλάξει τον τύπο αυτού του εισιτηρίου.",
"rename":"Μετονομασία εισιτηρίου. Αυτό θα αλλάξει το όνομα του καναλιού αυτού του εισιτηρίου.",
"claim":"Αιτηματοποίηση εισιτηρίου. Με αυτό, μπορείτε να ενημερώσετε την ομάδα σας ότι το χειρίζεστε.",
"unclaim":"Ακύρωση αιτηματοποίησης εισιτηρίου. Με αυτό, μπορείτε να ενημερώσετε την ομάδα σας ότι το εισιτήριο είναι ελεύθερο ξανά.",
"add":"Προσθήκη χρήστη σε εισιτήριο. Αυτό θα επιτρέψει στον χρήστη να διαβάζει και να γράφει σε αυτό το εισιτήριο.",
"remove":"Αφαίρεση χρήστη από εισιτήριο. Αυτό θα αφαιρέσει τη δυνατότητα ανάγνωσης και εγγραφής για έναν χρήστη σε αυτό το εισιτήριο.",
"panel":"Δημιουργία μηνύματος με αναπτυσσόμενο μενού ή κουμπιά (για δημιουργία εισιτηρίου).",
"blacklistView":"Προβολή λίστας της τρέχουσας μαύρης λίστας.",
"blacklistAdd":"Προσθήκη χρήστη στη μαύρη λίστα.",
"blacklistRemove":"Αφαίρεση χρήστη από τη μαύρη λίστα.",
"blacklistGet":"Λήψη λεπτομερειών από έναν χρήστη στη μαύρη λίστα.",
"statsGlobal":"Προβολή παγκόσμιων στατιστικών.",
"statsTicket":"Προβολή στατιστικών ενός εισιτηρίου στον server.",
"statsUser":"Προβολή στατιστικών ενός χρήστη στον server.",
"statsReset":"Επαναφορά όλων των στατιστικών του bot (και έναρξη καταμέτρησης από το μηδέν).",
"autocloseDisable":"Απενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autocloseEnable":"Ενεργοποίηση αυτόματου κλεισίματος σε αυτό το εισιτήριο.",
"autodeleteDisable":"Απενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"autodeleteEnable":"Ενεργοποίηση αυτόματης διαγραφής σε αυτό το εισιτήριο.",
"categories":{
"general":"Γενικές Εντολές",
"basicTicket":"Βασικές Εντολές Ticket",
"advancedTicket":"Προχωρημένες Εντολές Ticket",
"userTicket":"Εντολές Ticket Χρήστη",
"admin":"Εντολές Διαχειριστή",
"advanced":"Προχωρημένες Εντολές",
"extra":"Επιπλέον Εντολές"
}
},
"stats":{
"scopes":{
"global": "Παγκόσμια Στατιστικά",
"system": "Στατιστικά Συστήματος",
"user": "Στατιστικά Χρήστη",
"ticket": "Στατιστικά Εισιτηρίου",
"participants": "Συμμετέχοντες"
"global":"Παγκόσμια Στατιστικά",
"system":"Στατιστικά Συστήματος",
"user":"Στατιστικά Χρήστη",
"ticket":"Στατιστικά Εισιτηρίου",
"participants":"Συμμετέχοντες",
"messages":"Μηνύματα"
},
"properties":{
"ticketsCreated": "Εισιτήρια Δημιουργήθηκαν",
"ticketsClosed": "Εισιτήρια Κλείσαν",
"ticketsDeleted": "Εισιτήρια Διαγράφηκαν",
"ticketsReopened": "Εισιτήρια Επαναφέρθηκαν",
"ticketsAutoclosed": "Εισιτήρια Αυτόματα Κλείσαν",
"ticketsClaimed": "Εισιτήρια Αιτηματοποιήθηκαν",
"ticketsPinned": "Εισιτήρια Καρφιτσώθηκαν",
"ticketsMoved": "Εισιτήρια Μετακινήθηκαν",
"usersBlacklisted": "Χρήστες στη Μαύρη Λίστα",
"transcriptsCreated": "Μεταγραφές Δημιουργήθηκαν"
"ticketsCreated":"Εισιτήρια Δημιουργήθηκαν",
"ticketsClosed":"Εισιτήρια Κλείσαν",
"ticketsDeleted":"Εισιτήρια Διαγράφηκαν",
"ticketsReopened":"Εισιτήρια Επαναφέρθηκαν",
"ticketsAutoclosed":"Εισιτήρια Αυτόματα Κλείσαν",
"ticketsClaimed":"Εισιτήρια Αιτηματοποιήθηκαν",
"ticketsPinned":"Εισιτήρια Καρφιτσώθηκαν",
"ticketsMoved":"Εισιτήρια Μετακινήθηκαν",
"usersBlacklisted":"Χρήστες στη Μαύρη Λίστα",
"transcriptsCreated":"Μεταγραφές Δημιουργήθηκαν",
"ticketsAutodeleted":"Tickets Αυτόματης Διαγραφής",
"ticketsTransferred":"Tickets Μεταφερμένα",
"ticketVolume":"Όγκος Tickets",
"averageTickets":"Μέσος Όρος Tickets/Χρήστη",
"currentTickets":"Τρέχοντα Tickets",
"age":"Ηλικία Ticket",
"responseTime":"Χρόνος Απόκρισης",
"resolutionTime":"Χρόνος Επίλυσης",
"createdOn":"Δημιουργήθηκε Στις",
"createdBy":"Δημιουργήθηκε Από",
"closedOn":"Έκλεισε Στις",
"closedBy":"Έκλεισε Από",
"claimedOn":"Διεκδικήθηκε Στις",
"claimedBy":"Διεκδικήθηκε Από",
"pinnedOn":"Καρφιτσώθηκε Στις",
"pinnedBy":"Καρφιτσώθηκε Από",
"deletedOn":"Διαγράφηκε Στις",
"deletedBy":"Διαγράφηκε Από"
},
"roles":{
"developer":"Developer",
"serverOwner":"Ιδιοκτήτης Server",
"serverAdmin":"Διαχειριστής Server",
"moderator":"Ομάδα Moderators",
"support":"Ομάδα Υποστήριξης",
"member":"Μέλος"
}
},
"panel":{
"selectTicket":"Επιλέξτε το ticket σας",
"selectRole":"Επιλέξτε τον ρόλο σας",
"selectOption":"Επιλέξτε την επιλογή σας"
},
"priorities":{
"urgent":"Επείγον",
"veryHigh":"Πολύ Υψηλή",
"high":"Υψηλή",
"normal":"Κανονική",
"low":"Χαμηλή",
"veryLow":"Πολύ Χαμηλή",
"none":"Καμία"
}
}
+158 -28
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"translators":["an_developer"],
"lastedited":"14/12/2024",
"otversion":"v4.1.2",
"translators":["challenger_nova"],
"lastedited":"03/12/2025",
"language":"Hindi",
"automated":false
},
@@ -31,7 +31,15 @@
"stringContains":"इस स्ट्रिंग में {0} होना आवश्यक है!",
"stringChoices":"यह स्ट्रिंग केवल निम्नलिखित मानों में से एक हो सकती है: {0}!",
"stringRegex":"यह स्ट्रिंग अमान्य है!",
"stringInvertedContains":"इस स्ट्रिंग में {0} शामिल नहीं होना चाहिए!",
"stringLowercase":"यह स्ट्रिंग केवल छोटे अक्षरों में लिखी जानी चाहिए!",
"stringUppercase":"यह स्ट्रिंग केवल बड़े अक्षरों में लिखी जानी चाहिए!",
"stringSpecialCharacters":"इस स्ट्रिंग में कोई विशेष अक्षर नहीं होना चाहिए! (केवल a-z, 0-9 और स्पेस अनुमत हैं)",
"stringNoSpaces":"इस स्ट्रिंग में स्पेस नहीं होना चाहिए!",
"stringCapitalWord":"यह अनुशंसा की जाती है कि इस स्ट्रिंग के प्रत्येक शब्द की शुरुआत बड़े अक्षर से हो!",
"stringCapitalSentence":"ऐसा लगता है कि इस स्ट्रिंग में कुछ वाक्य बड़े अक्षर से शुरू नहीं होते हैं!",
"stringPunctuation":"ऐसा लगता है कि इस स्ट्रिंग का वाक्य विराम चिह्न के साथ समाप्त नहीं होता है!",
"numberTooShort":"यह संख्या {0} वर्णों से छोटी नहीं हो सकती!",
"numberTooLong":"यह संख्या {0} वर्णों से अधिक लंबी नहीं हो सकती!",
"numberLengthInvalid":"यह संख्या {0} वर्ण लंबी होनी चाहिए!",
@@ -48,10 +56,12 @@
"numberNegative":"यह संख्या ऋणात्मक नहीं हो सकती!",
"numberPositive":"यह संख्या सकारात्मक नहीं हो सकती!",
"numberZero":"यह संख्या शून्य नहीं हो सकती!",
"numberNan":"यह संख्या NaN (Not A Number) नहीं हो सकती!",
"numberInvertedContains":"इस संख्या में {0} शामिल नहीं होना चाहिए!",
"booleanTrue":"यह बूलियन सत्य नहीं हो सकता!",
"booleanFalse":"यह बूलियन झूठा नहीं हो सकता!",
"arrayEmptyDisabled":"इस सरणी को खाली रहने की अनुमति नहीं है!",
"arrayEmptyRequired":"यह सरणी खाली होनी आवश्यक है!",
"arrayTooShort":"इस सरणी की लंबाई कम से कम {0} होनी चाहिए!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"इस सरणी की लंबाई {0} होनी चाहिए!",
"arrayInvalidTypes":"इस सरणी में केवल निम्नलिखित प्रकार हो सकते हैं: {0}!",
"arrayDouble":"यह सरणी एक ही मान को दो बार अनुमति नहीं देती है!",
"discordInvalidId":"यह एक अमान्य कलह {0} आईडी है!",
"discordInvalidIdOptions":"यह एक अमान्य कलह {0} आईडी है! ",
"discordInvalidToken":"यह एक अमान्य कलह टोकन है (वाक्यविन्यास की दृष्टि से)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"इस यूआरएल में एक अमान्य पथ है!",
"idNotUnique":"यह आईडी अद्वितीय नहीं है, इसके बजाय किसी अन्य आईडी का उपयोग करें!",
"idNonExistent":"आईडी {0} मौजूद नहीं है!",
"invalidType":"यह संपत्ति इस प्रकार की होनी चाहिए: {0}!",
"propertyMissing":"इस ऑब्जेक्ट में संपत्ति {0} गायब है!",
"propertyOptional":"इस ऑब्जेक्ट में संपत्ति {0} वैकल्पिक है!",
@@ -84,12 +94,13 @@
"nullInvalid":"यह संपत्ति शून्य नहीं हो सकती!",
"switchInvalidType":"इसे निम्न प्रकारों में से एक होना आवश्यक है: {0}!",
"objectSwitchInvalid":"यह ऑब्जेक्ट निम्न प्रकारों में से एक होना चाहिए: {0}!",
"invalidLanguage":"यह एक अमान्य भाषा है!",
"invalidButton":"इस बटन पर कम से कम {0} या {1} होना आवश्यक है!",
"unusedOption":"विकल्प {0} का उपयोग कहीं भी नहीं किया जाता है!",
"unusedQuestion":"प्रश्न {0} का प्रयोग कहीं भी नहीं किया गया है!",
"dropdownOption":"ड्रॉपडाउन सक्षम पैनल में केवल 'टिकट' प्रकार के विकल्प हो सकते हैं!"
"dropdownOption":"ड्रॉपडाउन सक्षम पैनल में केवल 'टिकट' प्रकार के विकल्प हो सकते हैं!",
"customInvalidVersion":"आपके कॉन्फ़िग में निर्दिष्ट संस्करण मेल नहीं खाता! कृपया सुनिश्चित करें कि आपने कॉन्फ़िग को नवीनतम संस्करण में अपडेट किया है!"
}
},
"actions":{
@@ -122,7 +133,7 @@
"move":"टिकट स्थानांतरित",
"add":"टिकट उपयोगकर्ता जोड़ा गया",
"remove":"टिकट उपयोगकर्ता हटा दिया गया",
"help":"उपलब्ध आदेश",
"statsReset":"आँकड़े रीसेट करें",
"blacklistAdd":"उपयोगकर्ता को ब्लैकलिस्ट किया गया",
@@ -132,14 +143,20 @@
"blacklistAddDm":"ब्लैकलिस्ट में जोड़ा गया",
"blacklistRemoveDm":"काली सूची से हटाया गया",
"clear":"टिकट साफ़ हो गए",
"clearTickets":"टिकट साफ़ करें",
"roles":"भूमिकाएँ अद्यतन की गईं",
"autoclose":"टिकट स्वतः बंद",
"autocloseEnabled":"स्वत: बंद सक्षम",
"autocloseDisabled":"स्वत: बंद अक्षम",
"autodelete":"टिकट स्वतः हटा दिया गया",
"autodeleteEnabled":"स्वतः हटाना सक्षम",
"autodeleteDisabled":"स्वतः हटाना अक्षम"
"autodeleteDisabled":"स्वतः हटाना अक्षम",
"topicSet":"विषय बदला गया",
"prioritySet":"प्राथमिकता बदली गई",
"priorityGet":"टिकट प्राथमिकता",
"transfer":"टिकट स्थानांतरित किया गया"
},
"descriptions":{
"create":"आपका टिकट बन गया है. ",
@@ -154,7 +171,7 @@
"move":"टिकट को सफलतापूर्वक {0} पर ले जाया गया है!",
"add":"{0} को टिकट में सफलतापूर्वक जोड़ दिया गया है!",
"remove":"{0} को टिकट से सफलतापूर्वक हटा दिया गया है!",
"helpExplanation":"`<name>` => आवश्यक पैरामीटर\n",
"statsReset":"बॉट आँकड़े सफलतापूर्वक रीसेट कर दिए गए हैं!",
"statsError":"टिकट आँकड़े देखने में असमर्थ!\n",
@@ -167,7 +184,7 @@
"clearVerify":"क्या आप वाकई एकाधिक टिकट हटाना चाहते हैं?\n",
"clearReady":"{0} टिकट सफलतापूर्वक हटा दिए गए हैं!",
"rolesEmpty":"कोई भूमिका अद्यतन नहीं की गई है!",
"autocloseLeave":"यह टिकट स्वतः बंद हो गया है क्योंकि निर्माता ने सर्वर छोड़ दिया है!",
"autocloseTimeout":"यह टिकट स्वतः बंद कर दिया गया है क्योंकि यह `{0}h` से अधिक समय से निष्क्रिय है!",
"autodeleteLeave":"यह टिकट स्वतः हटा दिया गया है क्योंकि निर्माता ने सर्वर छोड़ दिया है!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"इस टिकट में ऑटोक्लोज़ अक्षम कर दिया गया है!\n",
"autodeleteEnabled":"इस टिकट में ऑटोडिलीट सक्षम कर दिया गया है!\n",
"autodeleteDisabled":"इस टिकट में ऑटोडिलीट अक्षम कर दिया गया है!\n",
"ticketMessageLimit":"आप एक ही समय में केवल {0} टिकट बना सकते हैं!",
"ticketMessageAutoclose":"{0}घंटे तक निष्क्रिय रहने पर यह टिकट स्वतः बंद हो जाएगा!",
"ticketMessageAutodelete":"{0} दिनों तक निष्क्रिय रहने पर यह टिकट स्वतः हटा दिया जाएगा!",
"panelReady":"आप नीचे पैनल पा सकते हैं!\n"
"panelReady":"पैनल फॉलोअप संदेश में उपलब्ध है!\nयह संदेश अब हटाया जा सकता है!",
"topicSet":"चैनल का विषय {0} द्वारा सफलतापूर्वक बदल दिया गया है!",
"prioritySet":"टिकट की प्राथमिकता {1} द्वारा {0} में सफलतापूर्वक बदल दी गई है!",
"priorityGet":"इस टिकट की वर्तमान प्राथमिकता {0} है।",
"transfer":"टिकट का स्वामित्व {0} से {1} में {2} द्वारा सफलतापूर्वक स्थानांतरित कर दिया गया है!"
},
"modal":{
"closePlaceholder":"आपने यह टिकट क्यों बंद कर दिया?",
@@ -215,12 +237,19 @@
"addDm":"हमारे सर्वर में आपके टिकट में {0} जोड़ दिया गया है!",
"removeLog":"{1} द्वारा इस टिकट से {0} हटा दिया गया है!",
"removeDm":"हमारे सर्वर में आपके टिकट से {0} हटा दिया गया है!",
"blacklistAddLog":"{0} को {1} द्वारा काली सूची में डाल दिया गया था!",
"blacklistRemoveLog":"{0} को {1} द्वारा काली सूची से हटा दिया गया था!",
"blacklistAddDm":"आपको हमारे सर्वर में काली सूची में डाल दिया गया है!\n",
"blacklistRemoveDm":"आपको हमारे सर्वर में ब्लैकलिस्ट से हटा दिया गया है!\n",
"clearLog":"{0} टिकटें {1} द्वारा हटा दी गई हैं!"
"clearLog":"{0} टिकटें {1} द्वारा हटा दी गई हैं!",
"transferLog":"इस टिकट का स्वामित्व {0} से {1} में {2} द्वारा स्थानांतरित किया गया है!",
"transferDm":"आपके टिकट का स्वामित्व हमारे सर्वर में {0} से {1} में स्थानांतरित कर दिया गया है!",
"prioritySetLog":"इस टिकट की प्राथमिकता {1} द्वारा {0} में बदल दी गई है!",
"prioritySetDm":"आपके टिकट की प्राथमिकता हमारे सर्वर में {0} में बदल दी गई है!",
"roleUpdateLog":"{0} ने अपनी भूमिकाएँ अपडेट की हैं!",
"roleUpdateDm":"आपकी भूमिकाएँ हमारे सर्वर में अपडेट कर दी गई हैं!"
}
},
"transcripts":{
@@ -241,7 +270,19 @@
"retry":"पुन: प्रयास करें",
"continue":"प्रतिलेख के बिना हटाएँ",
"backup":"बैकअप ट्रांस्क्रिप्ट बनाएं",
"error":"प्रतिलेख बनाने का प्रयास करते समय कुछ गलत हो गया।\n"
"error":"प्रतिलेख बनाने का प्रयास करते समय कुछ गलत हो गया।\n",
"title":"ट्रांसक्रिप्ट त्रुटि"
},
"text":{
"messagesTitle":"संदेश",
"embedTitle":"एम्बेड",
"fileTitle":"फ़ाइल",
"fieldsTitle":"फ़ील्ड्स",
"reactionsTitle":"प्रतिक्रियाएँ",
"statsTitle":"आँकड़े",
"emptyContent":"<सामग्री खाली है>",
"noTitle":"<कोई शीर्षक नहीं>",
"noDesc":"<कोई विवरण नहीं>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"अज्ञात पैनल",
"notInGuild":"सर्वर में नहीं",
"channelRename":"चैनल का नाम बदलने में असमर्थ",
"busy":"टिकट व्यस्त है"
"busy":"टिकट व्यस्त है",
"permissionError":"अनुमति त्रुटि"
},
"descriptions":{
"askForInfo":"अधिक जानकारी के लिए इस बॉट के मालिक से संपर्क करें!",
@@ -280,7 +322,10 @@
"notInGuild":"यह {0} डीएम में काम नहीं करता! ",
"channelRename":"विवाद की दर सीमा के कारण, वर्तमान में बॉट के लिए चैनल का नाम बदलना असंभव है। ",
"channelRenameSource":"इस त्रुटि का स्रोत है: {0}",
"busy":"इस {0} का उपयोग करने में असमर्थ!\n"
"busy":"इस {0} का उपयोग करने में असमर्थ!\n",
"closeBeforeMessage":"किसी उपयोगकर्ता द्वारा संदेश भेजे जाने से पहले इस टिकट को बंद/हटाया नहीं जा सकता।",
"closeBeforeAdminMessage":"टिकट एडमिन या सपोर्ट सदस्य द्वारा संदेश भेजे जाने से पहले इस टिकट को बंद/हटाया नहीं जा सकता।",
"unableToCreateTicket":"आप टिकट बनाने में असमर्थ हैं।"
},
"optionInvalidReasons":{
"stringRegex":"मान पैटर्न से मेल नहीं खाता!",
@@ -331,7 +376,6 @@
"added":"जोड़ा",
"removed":"निकाला गया",
"filter":"फ़िल्टर",
"claimedBy":"{0} द्वारा दावा किया गया",
"method":"तरीका",
"type":"प्रकार",
"blacklisted":"ब्लैक लिस्ट किया",
@@ -355,7 +399,27 @@
"status":"स्थिति",
"claimed":"दावा किया",
"pinned":"पिन की गई",
"creationDate":"निर्माण तिथि"
"creationDate":"निर्माण तिथि",
"noone":"कोई नहीं",
"open":"खुला",
"closed":"बंद",
"priority":"प्राथमिकता",
"participants":"प्रतिभागी",
"yes":"हाँ",
"no":"नहीं",
"option":"विकल्प",
"topic":"विषय",
"uptime":"सिस्टम अपटाइम",
"messages":"संदेश",
"embeds":"एम्बेड्स",
"files":"फ़ाइलें",
"components":"घटक",
"cooldown":"कूलडाउन",
"maxTickets":"अधिकतम टिकट",
"admins":"एडमिन",
"roles":"भूमिकाएँ",
"size":"आकार"
},
"lowercase":{
"text":"मूलपाठ",
@@ -384,6 +448,7 @@
"unclaim":"टिकट का दावा रद्द करें.",
"pin":"टिकट पिन करें.",
"unpin":"टिकट अनपिन करें.",
"move":"एक टिकट ले जाएँ.",
"moveId":"उस विकल्प का पहचानकर्ता जिस पर आप जाना चाहते हैं.",
"rename":"टिकट का नाम बदलें.",
@@ -392,6 +457,7 @@
"addUser":"उपयोगकर्ता को जोड़ना है.",
"remove":"किसी उपयोगकर्ता को टिकट से हटाएँ.",
"removeUser":"उपयोगकर्ता को हटाना है.",
"blacklist":"टिकट ब्लैकलिस्ट प्रबंधित करें.",
"blacklistView":"वर्तमान ब्लैकलिस्ट की सूची देखें.",
"blacklistAdd":"किसी उपयोगकर्ता को काली सूची में जोड़ें.",
@@ -405,6 +471,7 @@
"statsUserUser":"देखने के लिए उपयोगकर्ता.",
"statsTicket":"सर्वर में टिकट के आँकड़े देखें।",
"statsTicketTicket":"देखने के लिए टिकट.",
"clear":"एक ही समय में एकाधिक टिकट हटाएँ।",
"clearFilter":"टिकट साफ़ करने के लिए फ़िल्टर.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"अनपिन किया गया",
"autoclose":"स्वतः बंद"
},
"autoclose":"किसी टिकट में ऑटोक्लोज़ प्रबंधित करें.",
"autocloseDisable":"इस टिकट में ऑटोक्लोज़ अक्षम करें.",
"autocloseEnable":"इस टिकट में ऑटोक्लोज़ सक्षम करें।",
@@ -424,7 +492,19 @@
"autodelete":"किसी टिकट में स्वत: हटाना प्रबंधित करें.",
"autodeleteDisable":"इस टिकट में ऑटोडिलीट अक्षम करें।",
"autodeleteEnable":"इस टिकट में ऑटोडिलीट सक्षम करें।",
"autodeleteEnableTime":"इस टिकट को हटाने के लिए उतने दिनों की संख्या निष्क्रिय होनी चाहिए।"
"autodeleteEnableTime":"इस टिकट को हटाने के लिए उतने दिनों की संख्या निष्क्रिय होनी चाहिए।",
"topic":"टिकट चैनल के विषय का प्रबंधन करें।",
"topicSet":"टिकट चैनल का विषय सेट करें।",
"topicValue":"चैनल का नया विषय।",
"topicList":"सभी टिकटों की सूची प्राप्त करें जिनके विषय और आँकड़े शामिल हैं।",
"priority":"टिकट की प्राथमिकता का प्रबंधन करें।",
"prioritySet":"टिकट की प्राथमिकता सेट करें।",
"priorityValue":"चैनल की प्राथमिकता।",
"priorityGet":"टिकट की प्राथमिकता प्राप्त करें।",
"priorityList":"सभी टिकटों की प्राथमिकता स्थिति की सूची प्राप्त करें।",
"transfer":"टिकट का स्वामित्व एक उपयोगकर्ता से दूसरे को स्थानांतरित करें।",
"transferUser":"जिस उपयोगकर्ता को स्थानांतरित करना है।"
},
"helpMenu":{
"help":"सभी उपलब्ध आदेशों की सूची प्राप्त करें.",
@@ -452,7 +532,16 @@
"autocloseDisable":"इस टिकट में ऑटोक्लोज़ अक्षम करें.",
"autocloseEnable":"इस टिकट में ऑटोक्लोज़ सक्षम करें।",
"autodeleteDisable":"इस टिकट में ऑटोडिलीट अक्षम करें।",
"autodeleteEnable":"इस टिकट में ऑटोडिलीट सक्षम करें।"
"autodeleteEnable":"इस टिकट में ऑटोडिलीट सक्षम करें।",
"categories":{
"general":"सामान्य कमांड्स",
"basicTicket":"मूल टिकट कमांड्स",
"advancedTicket":"उन्नत टिकट कमांड्स",
"userTicket":"उपयोगकर्ता टिकट कमांड्स",
"admin":"एडमिन कमांड्स",
"advanced":"उन्नत कमांड्स",
"extra":"अतिरिक्त कमांड्स"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"सिस्टम आँकड़े",
"user":"उपयोगकर्ता आँकड़े",
"ticket":"टिकट आँकड़े",
"participants":"प्रतिभागियों"
"participants":"प्रतिभागियों",
"messages":"संदेश"
},
"properties":{
"ticketsCreated":"टिकट बनाये गये",
@@ -472,7 +562,47 @@
"ticketsPinned":"टिकट पिन किये गये",
"ticketsMoved":"टिकट ले जाया गया",
"usersBlacklisted":"उपयोगकर्ता ब्लैकलिस्टेड",
"transcriptsCreated":"प्रतिलिपियाँ बनाई गईं"
"transcriptsCreated":"प्रतिलिपियाँ बनाई गईं",
"ticketsAutodeleted":"टिकट स्वचालित रूप से हटाए गए",
"ticketsTransferred":"स्थानांतरित टिकट",
"ticketVolume":"टिकट मात्रा",
"averageTickets":"औसत टिकट/उपयोगकर्ता",
"currentTickets":"वर्तमान टिकट",
"age":"टिकट की आयु",
"responseTime":"प्रतिक्रिया समय",
"resolutionTime":"समाधान समय",
"createdOn":"निर्माण तिथि",
"createdBy":"द्वारा बनाया गया",
"closedOn":"बंद करने की तिथि",
"closedBy":"द्वारा बंद किया गया",
"claimedOn":"दावा की गई तिथि",
"claimedBy":"द्वारा दावा किया गया",
"pinnedOn":"पिन की गई तिथि",
"pinnedBy":"द्वारा पिन किया गया",
"deletedOn":"हटाने की तिथि",
"deletedBy":"द्वारा हटाया गया"
},
"roles":{
"developer":"डेवलपर",
"serverOwner":"सर्वर स्वामी",
"serverAdmin":"सर्वर एडमिन",
"moderator":"मॉडरेटर टीम",
"support":"सपोर्ट टीम",
"member":"सदस्य"
}
},
"panel":{
"selectTicket":"अपना टिकट चुनें",
"selectRole":"अपनी भूमिका चुनें",
"selectOption":"अपना विकल्प चुनें"
},
"priorities":{
"urgent":"अत्यावश्यक",
"veryHigh":"बहुत उच्च",
"high":"उच्च",
"normal":"सामान्य",
"low":"निम्न",
"veryLow":"बहुत निम्न",
"none":"कोई नहीं"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["Kornel0706"],
"lastedited":"22/08/2024",
"language":"Hungarian",
+157 -27
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["erxg"],
"lastedited":"25/08/2024",
"lastedited":"03/12/2025",
"language":"Indonesian",
"automated":false
},
@@ -31,7 +31,15 @@
"stringContains":"String ini harus mengandung {0}!",
"stringChoices":"String ini hanya dapat berupa salah satu dari nilai berikut ini: {0}!",
"stringRegex":"String ini tidak valid!",
"stringInvertedContains":"Teks ini tidak boleh mengandung {0}!",
"stringLowercase":"Teks ini harus ditulis dalam huruf kecil saja!",
"stringUppercase":"Teks ini harus ditulis dalam huruf kecil besar!",
"stringSpecialCharacters":"Teks ini tidak boleh mengandung karakter khusus apa pun! (Hanya huruf a-z, angka 0-9, dan spasi)",
"stringNoSpaces":"Teks ini tidak boleh mengandung spasi",
"stringCapitalWord":"Disarankan agar setiap kata dalam teks ini dimulai dengan huruf kapital!",
"stringCapitalSentence":"Sepertinya beberapa kalimat dalam teks ini tidak dimulai dengan huruf kapital!",
"stringPunctuation":"Sepertinya kalimat dalam teks ini tidak diakhiri dengan tanda baca!",
"numberTooShort":"Nomor ini tidak boleh lebih pendek dari {0} karakter!",
"numberTooLong":"Nomor ini tidak boleh lebih panjang dari {0} karakter!",
"numberLengthInvalid":"Nomor ini harus setidaknya {0} karakter!",
@@ -48,10 +56,12 @@
"numberNegative":"Nomor ini tidak boleh negatif!",
"numberPositive":"Nomor ini tidak boleh positif!",
"numberZero":"Nomor ini tidak boleh nol!",
"numberNan":"Nomor ini tidak boleh NaN (Bukan Angka)!",
"numberInvertedContains":"Nomor ini tidak boleh mengandung {0}!",
"booleanTrue":"Boolean ini tidak boleh benar!",
"booleanFalse":"Boolean ini tidak boleh salah!",
"arrayEmptyDisabled":"Array ini tidak boleh kosong!",
"arrayEmptyRequired":"Array ini harus kosong!",
"arrayTooShort":"Array ini harus memiliki panjang setidaknya {0}!",
@@ -59,7 +69,7 @@
"arrayLengthInvalid":"Array ini hanya dapat berisi tipe berikut ini: {0}!",
"arrayInvalidTypes":"Array ini hanya dapat berisi tipe berikut: {0}!",
"arrayDouble":"Array ini tidak mengizinkan nilai yang sama dua kali!",
"discordInvalidId":"Ini adalah id Discord {0} yang tidak valid!",
"discordInvalidIdOptions":"Ini adalah id Discord {0} yang tidak valid! Anda juga dapat menggunakan salah satu dari ini: {1}!",
"discordInvalidToken":"Ini adalah token Discord yang tidak valid (secara sintaksis)!",
@@ -76,7 +86,7 @@
"urlInvalidPath":"URL ini memiliki jalur yang tidak valid!",
"idNotUnique":"Id ini tidak unik, gunakan id lain sebagai gantinya!",
"idNonExistent":"Id {0} tidak ada!",
"invalidType":"Properti ini harus sesuai dengan jenisnya: {0}!",
"propertyMissing":"Properti {0} tidak ada pada objek ini!",
"propertyOptional":"Properti {0} bersifat opsional dalam objek ini!",
@@ -84,12 +94,13 @@
"nullInvalid":"Properti ini tidak boleh bernilai nol!",
"switchInvalidType":"Ini harus salah satu dari jenis berikut ini: {0}!",
"objectSwitchInvalid":"Objek ini harus merupakan salah satu dari jenis berikut: {0}!",
"invalidLanguage":"Ini adalah bahasa yang tidak valid!",
"invalidButton":"Tombol ini harus memiliki setidaknya {0} atau {1}!",
"unusedOption":"Opsi {0} tidak digunakan di mana pun!",
"unusedQuestion":"Pertanyaan {0} tidak digunakan di mana pun!",
"dropdownOption":"Panel dengan menu tarik-ulur yang diaktifkan hanya dapat berisi opsi dengan tipe 'tiket'!"
"dropdownOption":"Panel dengan menu tarik-ulur yang diaktifkan hanya dapat berisi opsi dengan tipe 'tiket'!",
"customInvalidVersion":"Versi yang ditetapkan dalam konfigurasi tidak sesuai! Pastikan konfigurasi Anda telah diperbarui ke versi terbaru!"
}
},
"actions":{
@@ -132,6 +143,7 @@
"blacklistAddDm":"Ditambahkan ke Daftar Hitam",
"blacklistRemoveDm":"Dihapus dari Daftar Hitam",
"clear":"Tiket dibersihkan.",
"clearTickets":"Bersihkan Tiket",
"roles":"Peran Diperbarui",
"autoclose":"Tiket Ditutup Otomatis",
@@ -139,7 +151,12 @@
"autocloseDisabled":"Tutup Otomatis Dimatikan",
"autodelete":"Tiket Dihapus Otomatis",
"autodeleteEnabled":"Hapus Otomatis Diaktifkan",
"autodeleteDisabled":"Hapus Otomatis Dinonaktifkan"
"autodeleteDisabled":"Hapus Otomatis Dinonaktifkan",
"topicSet":"Topik Diganti",
"prioritySet":"Prioritas Berganti",
"priorityGet":"Prioritas Tiket",
"transfer":"Tiket Ditransfer"
},
"descriptions":{
"create":"Tiket kamu telah dibuat. Klik tombol di bawah ini untuk mengaksesnya!",
@@ -154,7 +171,7 @@
"move":"Tiket telah berhasil dipindahkan ke {0}!",
"add":"{0} telah berhasil ditambahkan ke tiket!",
"remove":"{0} telah berhasil dihapus dari tiket!",
"helpExplanation":"`<name>` => parameter wajib\n`[name]` => parameter opsional",
"statsReset":"Statistik bot telah berhasil disetel ulang!",
"statsError":"Tidak dapat melihat statistik tiket!\n{0} bukan tiket!",
@@ -167,7 +184,7 @@
"clearVerify":"Apakah Anda yakin ingin menghapus beberapa tiket?\nTindakan ini tidak dapat dibatalkan!",
"clearReady":"Tiket {0} telah berhasil dihapus!",
"rolesEmpty":"Tidak ada peran yang telah diperbarui!",
"autocloseLeave":"tiket ini telah ditutup secara otomatis karena pembuatnya meninggalkan server!",
"autocloseTimeout":"tiket ini telah ditutup otomatis karena tidak aktif selama lebih dari `{0} jam`!",
"autodeleteLeave":"tiket ini telah dihapus secara otomatis karena pembuatnya meninggalkan server!",
@@ -176,11 +193,16 @@
"autocloseDisabled":"Penutupan otomatis telah dinonaktifkan untuk tiket ini!\nIt won't be closed automatically anymore!",
"autodeleteEnabled":"Penghapsan otomatis telah diaktifkan untuk tiket ini!\nIni akan dihapus jika tidak aktif selama lebih dari `{0} hari`!",
"autodeleteDisabled":"Penghapusan otomatis telah dinonaktifkan untuk tiket ini!\nTiket ini tidak akan dihapus secara otomatis lagi!",
"ticketMessageLimit":"Anda hanya dapat membuat {0} tiket pada saat yang bersamaan!",
"ticketMessageAutoclose":"Tiket ini akan ditutup secara otomatis ketika tidak aktif selama {0} jam!",
"ticketMessageAutodelete":"Tiket ini akan dihapus secara otomatis ketika tidak aktif selama {0} hari!",
"panelReady":"Anda dapat menemukan panel di bawah ini!\nPesan ini sekarang dapat dihapus!"
"panelReady":"Panel ini tersedia dalam pesan tindak lanjut!\nPesan ini sekarang dapat dihapus!",
"topicSet":"Topik kanal ini telah diubah oleh {0}!",
"prioritySet":"Prioritas tiket ini telah diubah menjadi {0} oleh {1}!",
"priorityGet":"Prioritas tiket ini pada saat ini adalah {0}.",
"transfer":"Status kepemilikan tiket telah berhasil dipindahkan dari {0} ke {1} oleh {2}!"
},
"modal":{
"closePlaceholder":"Mengapa kamu menutup tiket ini?",
@@ -215,12 +237,19 @@
"addDm":"{0} telah ditambahkan ke tiket kamu di server kami!",
"removeLog":"{0} telah dihapus dari tiket ini oleh {1}!",
"removeDm":"{0} telah dihapus dari tiket kamu di server kami!",
"blacklistAddLog":"{0} dimasukkan ke dalam daftar hitam oleh {1}!",
"blacklistRemoveLog":"{0} dihapus dari daftar hitam oleh {1}!",
"blacklistAddDm":"Anda telah masuk ke dalam daftar hitam di server kami!\nMulai sekarang, Anda tidak dapat membuat tiket!",
"blacklistRemoveDm":"Kamu telah dihapus dari daftar hitam di server kami!\nSekarang Anda dapat membuat tiket lagi!",
"clearLog":"Tiket {0} telah dihapus oleh {1}!"
"clearLog":"Tiket {0} telah dihapus oleh {1}!",
"transferLog":"Kepemilikan tiket ini telah berhasil dipindahkan dari {0} ke {1} oleh {2}",
"transferDm":"Kepemilikan tiket kamu sudah dialihkan dari {0} ke {1} di server kami!",
"prioritySetLog":"Prioritas tiket ini telah diubah menjadi {0} oleh {1}!",
"prioritySetDm":"Prioritas tiket kamu telah diubah menjadi {0} di server kami!",
"roleUpdateLog":"{0} telah memperbarui status mereka!",
"roleUpdateDm":"Status kamu di server kami telah diperbarui!"
}
},
"transcripts":{
@@ -241,7 +270,19 @@
"retry":"Coba Ulang",
"continue":"Hapus Tanpa Transkrip",
"backup":"Membuat Transkrip Cadangan",
"error":"Terjadi kesalahan saat mencoba membuat transkrip.\nApa yang ingin Anda lakukan?\n\nTiket ini tidak akan dihapus hingga Anda mengeklik salah satu tombol ini."
"error":"Terjadi kesalahan saat mencoba membuat transkrip.\nApa yang ingin Anda lakukan?\n\nTiket ini tidak akan dihapus hingga Anda mengeklik salah satu tombol ini.",
"title":"Kesalahan Dalam Pembuatan Transkrip"
},
"text":{
"messagesTitle":"PESAN",
"embedTitle":"SEMATAN",
"fileTitle":"BERKAS",
"fieldsTitle":"BIDANG",
"reactionsTitle":"REAKSI",
"statsTitle":"STATUS",
"emptyContent":"<isi dokumen kosong>",
"noTitle":"<tidak-ada-judul>",
"noDesc":"<tidak-ada-deskripsi>"
}
},
"errors":{
@@ -257,7 +298,8 @@
"unknownPanel":"Panel Tidak Diketahui",
"notInGuild":"Tidak Berada Di Dalam Server",
"channelRename":"Tidak Dapat Mengganti Nama Saluran",
"busy":"Tidak Sedang Sibuk"
"busy":"Tidak Sedang Sibuk",
"permissionError":"Terjadi Kesalahan Hak Akses"
},
"descriptions":{
"askForInfo":"Hubungi pemilik bot ini untuk info lebih lanjut!",
@@ -272,15 +314,18 @@
"noPermissionsCooldown":"Anda tidak diperbolehkan menggunakan {0} karena kamu sedang dalam cooldown!",
"noPermissionsBlacklist":"Anda tidak diperbolehkan menggunakan {0} karena Anda telah masuk dalam daftar hitam!",
"noPermissionsLimitGlobal":"Anda tidak diizinkan untuk membuat tiket karena server telah mencapai batas maksimal tiket!",
"noPermissionsLimitGlobalPengguna":"Anda tidak dapat membuat tiket karena Anda telah mencapai batas maksimal tiket!",
"noPermissionsLimitGlobalUser":"Anda tidak dapat membuat tiket karena Anda telah mencapai batas maksimal tiket!",
"noPermissionsLimitOption":"Anda tidak diizinkan untuk membuat tiket karena server telah mencapai batas maksimal tiket untuk opsi ini!",
"noPermissionsLimitOptionPengguna":"Anda tidak dapat membuat tiket karena Anda telah mencapai batas maksimal tiket untuk opsi ini!",
"noPermissionsLimitOptionUser":"Anda tidak dapat membuat tiket karena Anda telah mencapai batas maksimal tiket untuk opsi ini!",
"unknownTicket":"Gunakan perintah ini lagi dalam tiket yang valid!",
"deprecatedTicket":"Saluran saat ini bukanlah tiket yang valid! Ini mungkin merupakan tiket dari versi Open Tiket yang lama!",
"notInGuild":"Ini {0} tidak berfungsi di DM! Silakan coba lagi di server!",
"channelRename":"Karena batasan rasio Discord, saat ini bot tidak mungkin mengganti nama saluran. Saluran akan secara otomatis diganti namanya dalam waktu 10 menit jika bot tidak di-boot ulang.",
"channelRenameSource":"Sumber dari masalah: {0}",
"busy":"Dapat dapat menggunakan {0}!\nTiket sedang diproses oleh bot.\n\nMohon coba beberapa saat lagi!"
"busy":"Dapat dapat menggunakan {0}!\nTiket sedang diproses oleh bot.\n\nMohon coba beberapa saat lagi!",
"closeBeforeMessage":"Tiket ini tidak dapat ditutup ataupun dihapus sebelum pesan dikirim oleh seseorang.",
"closeBeforeAdminMessage":"Tiket ini tidak dapat ditutup ataupun dihapus sebelum admin tiket atau anggota tim dukungan mengirimkan pesan.",
"unableToCreateTicket":"Anda tidak dapat membuat tiket.."
},
"optionInvalidReasons":{
"stringRegex":"Nilai tidak sesuai pola!",
@@ -331,7 +376,6 @@
"added":"Ditambahkan",
"removed":"Dikeluarkan",
"filter":"Penyaring",
"claimedBy":"Diklaim oleh {0}",
"method":"Metode",
"type":"Tipe",
"blacklisted":"Daftar hitam",
@@ -355,7 +399,27 @@
"status":"Status",
"claimed":"Diklaim",
"pinned":"Disematkan",
"creationDate":"Tanggal Pembuatan"
"creationDate":"Tanggal Pembuatan",
"noone":"Tidak Seorangpun",
"open":"Buka",
"closed":"Tutup",
"priority":"Prioritas",
"participants":"Para Partisipan",
"yes":"Ya",
"no":"Tidak",
"option":"Opsi",
"topic":"Topik",
"uptime":"Waktu Aktif Sistem",
"messages":"Pesan",
"embeds":"Sematan",
"files":"Berkas",
"components":"Komponen",
"cooldown":"Cooldown",
"maxTickets":"Tiket Maksimum",
"admins":"Admin",
"roles":"Hak",
"size":"Ukuran"
},
"lowercase":{
"text":"teks",
@@ -384,6 +448,7 @@
"unclaim":"Batalkan klaim tiket.",
"pin":"Sematkan sebuah tiket.",
"unpin":"Batalkan penyematan tiket.",
"move":"Pindahkan tiket.",
"moveId":"Penanda opsi yang ingin anda pindahkan.",
"rename":"Ganti nama tiket.",
@@ -392,6 +457,7 @@
"addUser":"Pengguna yang akan ditambahkan.",
"remove":"Keluarkan seseorang dari tiket.",
"removeUser":"Pengguna yang akan dikeluarkan.",
"blacklist":"Kelola the Tiket blacklist.",
"blacklistView":"Lihat daftar yang masuk ke dalam daftar hitam.",
"blacklistAdd":"Tambahkan seseorang ke dalam daftar hitam.",
@@ -405,6 +471,7 @@
"statsUserUser":"Pengguna yang akan dilihat.",
"statsTicket":"Lihat status dari sebuah tiket di server.",
"statsTicketTicket":"Tiket yang akan dilihat.",
"clear":"Hapus banyak tiket sekaligus.",
"clearFilter":"Filter untuk menghapus tiket.",
"clearFilters":{
@@ -417,6 +484,7 @@
"unpin":"Pembatalan penyematan",
"autoclose":"Ditutup otomatis"
},
"autoclose":"Kelola penutupan otomatis tiket.",
"autocloseDisable":"Non-aktifkan penutupan otomatis.",
"autocloseEnable":"Aktifkan penutupan otomatis.",
@@ -424,7 +492,19 @@
"autodelete":"Kelola penghapusan otomatis tiket.",
"autodeleteDisable":"Non-aktifkan penghapusan otomatis.",
"autodeleteEnable":"Aktifkan penghapusan otomatis.",
"autodeleteEnableTime":"Lama waktu saluran tidak aktif sebelum dihapus."
"autodeleteEnableTime":"Lama waktu saluran tidak aktif sebelum dihapus.",
"topic":"Kelola topik kanal tiket.",
"topicSet":"Tentukan topik kanal tiket.",
"topicValue":"Topik baru kanal ini.",
"topicList":"Dapatkan informasi lengkap tentang semua tiket beserta topik dan statistiknya.",
"priority":"Kelola prioritas tiket.",
"prioritySet":"Tentukan prioritas tiket.",
"priorityValue":"Prioritas kanal.",
"priorityGet":"Dapatkan prioritas tiket.",
"priorityList":"Dapatkan daftar semua tiket beserta status prioritasnya.",
"transfer":"Alihkan kepemilikan tiket dari satu pengguna ke pengguna lain..",
"transferUser":"Pengguna yang akan ditransferkan."
},
"helpMenu":{
"help":"Dapatkan daftar perintah yang tersedia.",
@@ -452,7 +532,16 @@
"autocloseDisable":"Nonaktifkan penutupan otomatis.",
"autocloseEnable":"Aktifkan penutupan otomatis.",
"autodeleteDisable":"Non-aktifkan penghapusan otomatis.",
"autodeleteEnable":"Aktifkan penghapusan otomatis."
"autodeleteEnable":"Aktifkan penghapusan otomatis.",
"categories":{
"general":"Perintah Umum",
"basicTicket":"Perintah Dasar Tiket",
"advancedTicket":"Perintah Lanjutan Ticket",
"userTicket":"Perintah Tiket untuk Pengguna",
"admin":"Perintah Admin",
"advanced":"Perintah Lanjutan",
"extra":"Perintah Tambahan"
}
},
"stats":{
"scopes":{
@@ -460,7 +549,8 @@
"system":"Status Sistem",
"user":"Status Pengguna",
"ticket":"Status Tiket",
"participants":"Partisipan"
"participants":"Partisipan",
"messages":"Pesan"
},
"properties":{
"ticketsCreated":"Tiket Dibuat",
@@ -472,7 +562,47 @@
"ticketsPinned":"Tiket Disematkan",
"ticketsMoved":"Tickets Dipindahkan",
"usersBlacklisted":"Pengguna Masuk Ke Dalam Daftar Hitam",
"transcriptsCreated":"Transkrip Dibuat"
"transcriptsCreated":"Transkrip Dibuat",
"ticketsAutodeleted":"Tiket Dihapus Secara Otomatis",
"ticketsTransferred":"Tiket Dipindahkan",
"ticketVolume":"Kapasitas Tiket",
"averageTickets":"Rata-rata Tiket per Pengguna",
"currentTickets":"Tiket Saat Ini",
"age":"Umur Tiket",
"responseTime":"Waktu Respons",
"resolutionTime":"Resolution Time",
"createdOn":"Dibuat Pada",
"createdBy":"Dibuat Oleh",
"closedOn":"Ditutup Pada",
"closedBy":"Ditutup Oleh",
"claimedOn":"Diklaim Pada",
"claimedBy":"Diklaim Oleh",
"pinnedOn":"Disematkan Pada",
"pinnedBy":"Disematkan Oleh",
"deletedOn":"Dihapus Pada",
"deletedBy":"Dihapus Oleh"
},
"roles":{
"developer":"Pembuat",
"serverOwner":"Pemilik Server",
"serverAdmin":"Admin Server",
"moderator":"Tim Moderator",
"support":"Tim Pendukung",
"member":"Anggota"
}
},
"panel":{
"selectTicket":"Pilih tiket kamu",
"selectRole":"Pilih status kamu",
"selectOption":"Pilih opsi kamu"
},
"priorities":{
"urgent":"Sangat Penting",
"veryHigh":"Sangat Tinggi",
"high":"Tinggi",
"normal":"Normal",
"low":"Rendah",
"veryLow":"Sangat Rendah",
"none":"Tidak Ada"
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["fraden1mvp."],
"lastedited":"08/10/2024",
"language":"Italian",
+227 -91
View File
@@ -1,8 +1,8 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"translators":["HanumeshGupta"],
"lastedited":"19/06/2025",
"otversion":"v4.1.2",
"translators":["HanumeshGupta","ChatGPT"],
"lastedited":"03/12/2025",
"language":"Japanese",
"automated":true
},
@@ -12,78 +12,95 @@
"headerOpenTicket":"チケットを開く",
"typeWarning":"[警告]",
"typeInfo":"[情報]",
"headerConfigChecker": "コンフィグチェッカー",
"headerDescription": "設定ファイルのエラーをチェック!",
"footerError": "{0}が修正されるまでボットは起動しません!",
"footerWarning": "起動前にすべての{0}を修正することを推奨します!",
"footerSupport": "サポート: {0} - ドキュメント: {1}",
"compactInformation": "詳細は{0}を使用してください!",
"dataPath": "パス",
"dataDocs": "ドキュメント",
"dataMessages": "メッセージ"
"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": "この数値は{1}から始まる{0}の倍数でなければなりません!",
"numberStartsWith": "この数値は「{0}」で始まる必要があります!",
"numberEndsWith": "この数値は「{0}」で終わる必要があります!",
"numberContains": "この数値には「{0}」が含まれている必要があります!",
"numberChoices": "この数値は次のいずれかの値でなければなりません: {0}!",
"numberFloat": "この数値は小数にできません!",
"numberNegative": "この数値は負の値にできません!",
"numberPositive": "この数値は正の値にできません!",
"numberZero": "この数値はゼロにできません!",
"booleanTrue": "このブール値はtrueにできません!",
"booleanFalse": "このブール値はfalseにできません!",
"arrayEmptyDisabled": "この配列を空にすることは許可されていません!",
"arrayEmptyRequired": "この配列は空でなければなりません!",
"arrayTooShort": "この配列の長さは少なくとも{0}でなければなりません!",
"arrayTooLong": "この配列の長さは最大{0}でなければなりません!",
"arrayLengthInvalid": "この配列の長さは{0}でなければなりません!",
"arrayInvalidTypes": "この配列に含めることができる型は次のみです: {0}!",
"arrayDouble": "この配列では同じ値を2回使用できません!",
"discordInvalidId": "これは無効なDiscordの{0}IDです!",
"discordInvalidIdOptions": "これは無効なDiscordの{0}IDです! 代わりに次のいずれかを使用できます: {1}!",
"discordInvalidToken": "これは無効なDiscordトークンです(構文的に)!",
"colorInvalid": "これは無効なHEXカラーコードです!",
"emojiTooShort": "この文字列には少なくとも{0}個の絵文字が必要です!",
"emojiTooLong": "この文字列には最大{0}個の絵文字しか含められません!",
"emojiCustom": "この絵文字はDiscordのカスタム絵文字にできません!",
"emojiInvalid": "これは無効な絵文字です!",
"urlInvalid": "このURLは無効です!",
"urlInvalidHttp": "This url can only use the https:// protocol!",
"urlInvalidProtocol": "This url can only use the http:// & https:// protocols!",
"urlInvalidHostname": "このURLのホスト名は許可されていません!",
"urlInvalidExtension": "このURLの拡張子が無効です! 次のいずれかを選択してください: {0}!",
"urlInvalidPath": "このURLのパスが無効です!",
"idNotUnique": "このIDは一意ではありません。別のIDを使用してください!",
"idNonExistent": "ID「{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」タイプのオプションのみ含めることができます!"
"stringTooShort":"この文字列は{0}文字より短くできません!",
"stringTooLong":"この文字列は{0}文字より長くできません!",
"stringLengthInvalid":"この文字列は{0}文字でなければなりません!",
"stringStartsWith":"この文字列は「{0}」で始まる必要があります!",
"stringEndsWith":"この文字列は「{0}」で終わる必要があります!",
"stringContains":"この文字列には「{0}」が含まれている必要があります!",
"stringChoices":"この文字列は次のいずれかの値でなければなりません: {0}!",
"stringRegex":"この文字列は無効です!",
"stringInvertedContains":"この文字列には {0} を含めることはできません!",
"stringLowercase":"この文字列はすべて小文字で書かなければなりません!",
"stringUppercase":"この文字列はすべて大文字で書かなければなりません!",
"stringSpecialCharacters":"この文字列には特殊文字を含めることはできません!(a-z、0-9、スペースのみ)",
"stringNoSpaces":"この文字列にはスペースを含めることはできません!",
"stringCapitalWord":"この文字列の各単語は大文字で始めることを推奨します!",
"stringCapitalSentence":"この文字列の一部の文が大文字で始まっていないようです!",
"stringPunctuation":"この文字列の文が句読点で終わっていないようです!",
"numberTooShort":"この数値は{0}桁より短くできません!",
"numberTooLong":"この数値は{0}桁より長くできません!",
"numberLengthInvalid":"この数値は{0}桁でなければなりません!",
"numberTooSmall":"この数値は{0}以上でなければなりません!",
"numberTooLarge":"この数値は{0}以下でなければなりません!",
"numberNotEqual":"この数値は{0}でなければなりません!",
"numberStep":"この数値は{0}の倍数でなければなりません!",
"numberStepOffset":"この数値は{1}から始まる{0}の倍数でなければなりません!",
"numberStartsWith":"この数値は「{0}」で始まる必要があります!",
"numberEndsWith":"この数値は「{0}」で終わる必要があります!",
"numberContains":"この数値には「{0}」が含まれている必要があります!",
"numberChoices":"この数値は次のいずれかの値でなければなりません: {0}!",
"numberFloat":"この数値は小数にできません!",
"numberNegative":"この数値は負の値にできません!",
"numberPositive":"この数値は正の値にできません!",
"numberZero":"この数値はゼロにできません!",
"numberNan":"この数値は NaN(Not A Number)であってはなりません!",
"numberInvertedContains":"この数値には {0} を含めることはできません!",
"booleanTrue":"このブール値はtrueにできません!",
"booleanFalse":"このブール値はfalseにできません!",
"arrayEmptyDisabled":"この配列を空にすることは許可されていません!",
"arrayEmptyRequired":"この配列は空でなければなりません!",
"arrayTooShort":"この配列の長さは少なくとも{0}でなければなりません!",
"arrayTooLong":"この配列の長さは最大{0}でなければなりません!",
"arrayLengthInvalid":"この配列の長さは{0}でなければなりません!",
"arrayInvalidTypes":"この配列に含めることができる型は次のみです: {0}!",
"arrayDouble":"この配列では同じ値を2回使用できません!",
"discordInvalidId":"これは無効なDiscordの{0}IDです!",
"discordInvalidIdOptions":"これは無効なDiscordの{0}IDです! 代わりに次のいずれかを使用できます: {1}!",
"discordInvalidToken":"これは無効なDiscordトークンです(構文的に)!",
"colorInvalid":"これは無効なHEXカラーコードです!",
"emojiTooShort":"この文字列には少なくとも{0}個の絵文字が必要です!",
"emojiTooLong":"この文字列には最大{0}個の絵文字しか含められません!",
"emojiCustom":"この絵文字はDiscordのカスタム絵文字にできません!",
"emojiInvalid":"これは無効な絵文字です!",
"urlInvalid":"このURLは無効です!",
"urlInvalidHttp":"This url can only use the https:// protocol!",
"urlInvalidProtocol":"This url can only use the http:// & https:// protocols!",
"urlInvalidHostname":"このURLのホスト名は許可されていません!",
"urlInvalidExtension":"このURLの拡張子が無効です! 次のいずれかを選択してください: {0}!",
"urlInvalidPath":"このURLのパスが無効です!",
"idNotUnique":"このIDは一意ではありません。別のIDを使用してください!",
"idNonExistent":"ID「{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」タイプのオプションのみ含めることができます!",
"customInvalidVersion":"設定ファイルに指定されたバージョンが一致しません! 設定を最新バージョンに更新してください!"
}
},
"actions":{
@@ -126,6 +143,7 @@
"blacklistAddDm":"ブラックリストに追加されました",
"blacklistRemoveDm":"ブラックリストから解除されました",
"clear":"チケットが一括削除されました",
"clearTickets":"チケットをクリア",
"roles":"ロールが更新されました",
"autoclose":"チケットが自動閉じされました",
@@ -133,7 +151,12 @@
"autocloseDisabled":"自動閉じが無効化されました",
"autodelete":"チケットが自動削除されました",
"autodeleteEnabled":"自動削除が有効化されました",
"autodeleteDisabled":"自動削除が無効化されました"
"autodeleteDisabled":"自動削除が無効化されました",
"topicSet":"トピックが変更されました",
"prioritySet":"優先度が変更されました",
"priorityGet":"チケットの優先度",
"transfer":"チケットが転送されました"
},
"descriptions":{
"create":"チケットが作成されました。下のボタンをクリックしてアクセスしてください!",
@@ -148,7 +171,7 @@
"move":"チケットが「{0}」に正常に移動されました!",
"add":"{0}がチケットに正常に追加されました!",
"remove":"{0}がチケットから正常に削除されました!",
"helpExplanation":"`<名前>` => 必須パラメータ\n`[名前]` => オプションパラメータ",
"statsReset":"ボットの統計が正常にリセットされました!",
"statsError":"チケット統計を表示できません!\n{0}はチケットではありません!",
@@ -161,7 +184,7 @@
"clearVerify":"複数のチケットを削除してもよろしいですか?\nこの操作は元に戻せません!",
"clearReady":"{0}件のチケットが正常に削除されました!",
"rolesEmpty":"更新されたロールはありません!",
"autocloseLeave":"作成者がサーバーを退出したため、このチケットは自動閉じされました!",
"autocloseTimeout":"このチケットは{0}時間以上非アクティブだったため自動閉じされました!",
"autodeleteLeave":"作成者がサーバーを退出したため、このチケットは自動削除されました!",
@@ -170,11 +193,16 @@
"autocloseDisabled":"このチケットで自動閉じが無効化されました!\n今後は自動的に閉じられません!",
"autodeleteEnabled":"このチケットで自動削除が有効化されました!\n{0}日間以上非アクティブの場合に自動的に削除されます!",
"autodeleteDisabled":"このチケットで自動削除が無効化されました!\n今後は自動的に削除されません!",
"ticketMessageLimit":"同時に作成できるチケットは{0}件までです!",
"ticketMessageAutoclose":"このチケットは{0}時間非アクティブの場合に自動閉じされます!",
"ticketMessageAutodelete":"このチケットは{0}日間非アクティブの場合に自動削除されます!",
"panelReady":"下にパネルが表示されます!\nこのメッセージは削除可能です!"
"panelReady":"パネルは次のメッセージで利用できます!\nこのメッセージは削除しても構いません!",
"topicSet":"チャンネルのトピックは {0} によって正常に変更されました!",
"prioritySet":"チケットの優先度は {1} により {0} に正常に変更されました!",
"priorityGet":"このチケットの現在の優先度は {0} です。",
"transfer":"チケットの所有権は {2} によって {0} から {1} に正常に転送されました!"
},
"modal":{
"closePlaceholder":"このチケットを閉じた理由は?",
@@ -209,12 +237,19 @@
"addDm":"サーバーであなたのチケットに{0}が追加されました!",
"removeLog":"{1}によって{0}がこのチケットから削除されました!",
"removeDm":"サーバーであなたのチケットから{0}が削除されました!",
"blacklistAddLog":"{1}によって{0}がブラックリストに追加されました!",
"blacklistRemoveLog":"{1}によって{0}がブラックリストから解除されました!",
"blacklistAddDm":"あなたはサーバーのブラックリストに追加されました!\n今後チケットを作成できなくなります!",
"blacklistRemoveDm":"あなたはサーバーのブラックリストから解除されました!\n再びチケットを作成できるようになりました!",
"clearLog":"{1}によって{0}件のチケットが削除されました!"
"clearLog":"{1}によって{0}件のチケットが削除されました!",
"transferLog":"このチケットの所有権は {2} によって {0} から {1} に転送されました!",
"transferDm":"あなたのチケットの所有権はサーバー内で {0} から {1} に転送されました!",
"prioritySetLog":"このチケットの優先度は {1} により {0} に変更されました!",
"prioritySetDm":"あなたのチケットの優先度はサーバー内で {0} に変更されました!",
"roleUpdateLog":"{0} がロールを更新しました!",
"roleUpdateDm":"サーバー内のあなたのロールが更新されました!"
}
},
"transcripts":{
@@ -223,7 +258,7 @@
"ready":"トランスクリプトが作成されました",
"textFileDescription":"これは削除されたチケットのテキストトランスクリプトです!",
"htmlProgress":"HTMLトランスクリプトを処理中です。お待ちください...",
"createdChannel":"サーバーに新しい{0}トランスクリプトが作成されました!",
"createdCreator":"あなたのチケットの{0}トランスクリプトが作成されました!",
"createdParticipant":"参加したチケットの{0}トランスクリプトが作成されました!",
@@ -235,7 +270,19 @@
"retry":"再試行",
"continue":"トランスクリプトなしで削除",
"backup":"バックアップトランスクリプトを作成",
"error":"トランスクリプトの作成中にエラーが発生しました。\nどうしますか?\n\nいずれかのボタンをクリックするまでチケットは削除されません。"
"error":"トランスクリプトの作成中にエラーが発生しました。\nどうしますか?\n\nいずれかのボタンをクリックするまでチケットは削除されません。",
"title":"トランスクリプトエラー"
},
"text":{
"messagesTitle":"メッセージ",
"embedTitle":"EMBED",
"fileTitle":"ファイル",
"fieldsTitle":"フィールド",
"reactionsTitle":"リアクション",
"statsTitle":"統計",
"emptyContent":"<内容は空です>",
"noTitle":"<タイトルなし>",
"noDesc":"<説明なし>"
}
},
"errors":{
@@ -251,10 +298,11 @@
"unknownPanel":"不明なパネル",
"notInGuild":"サーバー内にいません",
"channelRename":"チャンネル名を変更できません",
"busy":"チケットは使用中です"
"busy":"チケットは使用中です",
"permissionError":"権限エラー"
},
"descriptions":{
"askForInfo":"詳細はボットの所有者に問い合わせてください!",
"askForInfo":"詳細はボットの所有者に問い合わせてください!",
"askForInfoResolve":"数回試しても解決しない場合は、ボットの所有者に連絡してください。",
"internalError":"内部エラーのため、この{0}に応答できませんでした!",
"optionMissing":"このコマンドに必要なパラメータが不足しています!",
@@ -274,7 +322,10 @@
"notInGuild":"この{0}はDMでは動作しません!サーバー内で再試行してください!",
"channelRename":"Discordのレートリミットにより、現在チャンネル名を変更できません。10分以内に自動的に変更されます。",
"channelRenameSource":"エラーの原因:{0}",
"busy":"この{0}は使用できません!\nチケットは現在処理中です。\n\n数秒後にもう一度お試しください!"
"busy":"この{0}は使用できません!\nチケットは現在処理中です。\n\n数秒後にもう一度お試しください!",
"closeBeforeMessage":"ユーザーがメッセージを送信する前に、このチケットを閉じたり削除したりすることはできません。",
"closeBeforeAdminMessage":"チケット管理者またはサポートメンバーがメッセージを送信する前に、このチケットを閉じたり削除したりすることはできません。",
"unableToCreateTicket":"チケットを作成することはできません。"
},
"optionInvalidReasons":{
"stringRegex":"値がパターンに一致しません!",
@@ -325,7 +376,6 @@
"added":"追加済み",
"removed":"削除済み",
"filter":"フィルター",
"claimedBy":"{0}が引き受け",
"method":"方法",
"type":"タイプ",
"blacklisted":"ブラックリスト",
@@ -349,7 +399,27 @@
"status":"ステータス",
"claimed":"引き受け済み",
"pinned":"ピン留め済み",
"creationDate":"作成日時"
"creationDate":"作成日時",
"noone":"該当なし",
"open":"オープン",
"closed":"クローズ",
"priority":"優先度",
"participants":"参加者",
"yes":"はい",
"no":"いいえ",
"option":"オプション",
"topic":"トピック",
"uptime":"システム稼働時間",
"messages":"メッセージ",
"embeds":"埋め込み",
"files":"ファイル",
"components":"コンポーネント",
"cooldown":"クールダウン",
"maxTickets":"最大チケット数",
"admins":"管理者",
"roles":"ロール",
"size":"サイズ"
},
"lowercase":{
"text":"テキスト",
@@ -378,6 +448,7 @@
"unclaim":"チケットの引き受けを解除します。",
"pin":"チケットをピン留めします。",
"unpin":"チケットのピン留めを解除します。",
"move":"チケットを移動します。",
"moveId":"移動先のオプション識別子。",
"rename":"チケット名を変更します。",
@@ -386,6 +457,7 @@
"addUser":"追加するユーザー。",
"remove":"ユーザーをチケットから削除します。",
"removeUser":"削除するユーザー。",
"blacklist":"チケットブラックリストを管理します。",
"blacklistView":"現在のブラックリストを表示します。",
"blacklistAdd":"ユーザーをブラックリストに追加します。",
@@ -399,6 +471,7 @@
"statsUserUser":"表示するユーザー。",
"statsTicket":"サーバー内のチケット統計を表示します。",
"statsTicketTicket":"表示するチケット。",
"clear":"複数のチケットを同時に削除します。",
"clearFilter":"チケットを一括削除するフィルター。",
"clearFilters":{
@@ -411,6 +484,7 @@
"unpin":"ピン留め解除済み",
"autoclose":"自動閉じ済み"
},
"autoclose":"チケットの自動閉じを管理します。",
"autocloseDisable":"このチケットの自動閉じを無効にします。",
"autocloseEnable":"このチケットの自動閉じを有効にします。",
@@ -418,7 +492,19 @@
"autodelete":"チケットの自動削除を管理します。",
"autodeleteDisable":"このチケットの自動削除を無効にします。",
"autodeleteEnable":"このチケットの自動削除を有効にします。",
"autodeleteEnableTime":"チケットを自動削除する非アクティブ時間(日単位)。"
"autodeleteEnableTime":"チケットを自動削除する非アクティブ時間(日単位)。",
"topic":"チケットチャネルのトピックを管理します。",
"topicSet":"チケットチャネルのトピックを設定します。",
"topicValue":"チャンネルの新しいトピック。",
"topicList":"すべてのチケットをトピックと統計付きで一覧表示します。",
"priority":"チケットの優先度を管理します。",
"prioritySet":"チケットの優先度を設定します。",
"priorityValue":"チャンネルの優先度。",
"priorityGet":"チケットの優先度を取得します。",
"priorityList":"すべてのチケットを優先度ステータス付きで一覧表示します。",
"transfer":"チケットの所有権を別のユーザーに転送します。",
"transferUser":"転送先のユーザー。"
},
"helpMenu":{
"help":"利用可能なすべてのコマンドのリストを表示します。",
@@ -446,7 +532,16 @@
"autocloseDisable":"このチケットの自動閉じを無効にします。",
"autocloseEnable":"このチケットの自動閉じを有効にします。",
"autodeleteDisable":"このチケットの自動削除を無効にします。",
"autodeleteEnable":"このチケットの自動削除を有効にします。"
"autodeleteEnable":"このチケットの自動削除を有効にします。",
"categories":{
"general":"一般コマンド",
"basicTicket":"基本チケットコマンド",
"advancedTicket":"高度なチケットコマンド",
"userTicket":"ユーザーチケットコマンド",
"admin":"管理者コマンド",
"advanced":"高度なコマンド",
"extra":"追加コマンド"
}
},
"stats":{
"scopes":{
@@ -454,7 +549,8 @@
"system":"システム統計",
"user":"ユーザー統計",
"ticket":"チケット統計",
"participants":"参加者"
"participants":"参加者",
"messages":"メッセージ"
},
"properties":{
"ticketsCreated":"作成済みチケット",
@@ -466,7 +562,47 @@
"ticketsPinned":"ピン留め済みチケット",
"ticketsMoved":"移動済みチケット",
"usersBlacklisted":"ブラックリストユーザー",
"transcriptsCreated":"作成済みトランスクリプト"
"transcriptsCreated":"作成済みトランスクリプト",
"ticketsAutodeleted":"自動削除されたチケット",
"ticketsTransferred":"転送されたチケット",
"ticketVolume":"チケット量",
"averageTickets":"平均チケット数/ユーザー",
"currentTickets":"現在のチケット",
"age":"チケットの経過時間",
"responseTime":"応答時間",
"resolutionTime":"解決時間",
"createdOn":"作成日",
"createdBy":"作成者",
"closedOn":"クローズ日",
"closedBy":"クローズ者",
"claimedOn":"引き受け日",
"claimedBy":"引き受け者",
"pinnedOn":"ピン留め日",
"pinnedBy":"ピン留め者",
"deletedOn":"削除日",
"deletedBy":"削除者"
},
"roles":{
"developer":"開発者",
"serverOwner":"サーバーオーナー",
"serverAdmin":"サーバー管理者",
"moderator":"モデレーターチーム",
"support":"サポートチーム",
"member":"メンバー"
}
},
"panel":{
"selectTicket":"チケットを選択してください",
"selectRole":"ロールを選択してください",
"selectOption":"オプションを選択してください"
},
"priorities":{
"urgent":"緊急",
"veryHigh":"非常に高い",
"high":"高い",
"normal":"普通",
"low":"低い",
"veryLow":"非常に低い",
"none":"なし"
}
}
+549 -419
View File
File diff suppressed because it is too large Load Diff
+559 -416
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.7",
"otversion": "v4.1.2",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Latvian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["TsgIndrius"],
"lastedited":"26/01/2025",
"language":"Lithuanian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.7",
"otversion": "v4.1.2",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Norwegian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["dysashop","zhavis"],
"lastedited":"28/05/2025",
"language":"Persian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["DanoGlez"],
"lastedited":"28/01/2025",
"language":"Polish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["quiradon"],
"lastedited":"20/08/2024",
"language":"Portuguese",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["SankeDev"],
"lastedited":"27/08/2024",
"language":"Romanian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.7",
"otversion": "v4.1.2",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Russian",
File diff suppressed because it is too large Load Diff
+547 -417
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["Redactado","Josuens"],
"lastedited":"22/08/2024",
"language":"Spanish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.7",
"otversion": "v4.1.2",
"translators": ["NoOneNook"],
"lastedited": "25/03/2025",
"language": "Svenska",
+563 -433
View File
File diff suppressed because it is too large Load Diff
+544 -414
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION": {
"otversion": "v4.0.7",
"otversion": "v4.1.2",
"translators": ["palestinian"],
"lastedited": "26/11/2024",
"language": "Turkish",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["Anderskiy"],
"lastedited":"31/08/2024",
"language":"Ukrainian",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"_TRANSLATION":{
"otversion":"v4.0.7",
"otversion":"v4.1.2",
"translators":["ngocdiep2006"],
"lastedited":"07/04/2025",
"language":"Vietnamese",
+14 -9
View File
@@ -1,7 +1,7 @@
{
"name": "open-ticket",
"author": "DJdj Development",
"version": "4.0.7",
"version": "4.1.2",
"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",
@@ -14,20 +14,25 @@
"scripts": {
"build": "node index.js --compile-only",
"start": "node index.js",
"setup": "node index.js --cli",
"startnc": "node index.js --no-compile",
"test": "node index.js --dev-config --dev-database",
"testnc": "node index.js --no-compile --dev-config --dev-database",
"docs": "npx typedoc --options .docs/typedoc-config.json && node .docs/createDocs.js"
"test": "node index.js --dev-config --dev-database --soft-plugins",
"testsetup": "node index.js --cli --dev-config --dev-database --soft-plugins",
"testnc": "node index.js --no-compile --dev-config --dev-database --soft-plugins",
"docs": "npx typedoc --options .docs/typedoc-config.json && node .docs/createDocs.js",
"mergelang": "node .docs/mergeTranslations.js"
},
"type": "commonjs",
"license": "GPL-3.0-only",
"dependencies": {
"@discordjs/rest": "^2.4.2",
"@discordjs/rest": "^2.6.0",
"@types/node": "^22.5.0",
"ansis": "^2.3.0",
"discord.js": "^14.19.3",
"formatted-json-stringify": "^1.1.0",
"typescript": "^5.5.4"
"@types/terminal-kit": "^2.5.7",
"ansis": "^4.2.0",
"discord.js": "^14.24.2",
"formatted-json-stringify": "^1.2.1",
"terminal-kit": "^3.1.2",
"typescript": "^5.9.3"
},
"repository": {
"type": "git",
+3
View File
@@ -54,6 +54,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:add-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketUserAdded").emit([ticket,user,data,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
+3
View File
@@ -65,6 +65,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:claim-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketClaimed").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
+69 -72
View File
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:close-ticket"))
@@ -17,10 +18,15 @@ export const registerActions = async () => {
//update ticket
ticket.get("opendiscord:closed").value = true
if (source == "autoclose") ticket.get("opendiscord:autoclosed").value = true
ticket.get("opendiscord:open").value = false
ticket.get("opendiscord:closed-by").value = user.id
ticket.get("opendiscord:closed-on").value = new Date().getTime()
ticket.get("opendiscord:reopened").value = false
ticket.get("opendiscord:reopened-by").value = null
ticket.get("opendiscord:reopened-on").value = null
if (source == "autoclose") ticket.get("opendiscord:autoclosed").value = true
ticket.get("opendiscord:open").value = false
ticket.get("opendiscord:busy").value = true
//update stats
@@ -123,6 +129,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketClosed").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
@@ -160,61 +169,55 @@ export const registerVerifyBars = async () => {
//CLOSE TICKET TICKET MESSAGE
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:close-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("opendiscord:close-ticket-ticket-message").success.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.close
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:close-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.close,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already closed
if (ticket.get("opendiscord:closed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:lang.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start closing ticket
if (params.data == "reason"){
//close with reason
@@ -247,61 +250,55 @@ export const registerVerifyBars = async () => {
//CLOSE TICKET REOPEN MESSAGE
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:close-ticket-reopen-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("opendiscord:close-ticket-reopen-message").success.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.close
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:close-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.close,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already closed
if (ticket.get("opendiscord:closed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:lang.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start closing ticket
if (params.data == "reason"){
//close with reason
+49 -21
View File
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:create-ticket"))
@@ -19,8 +20,8 @@ export const registerActions = async () => {
const channelPrefix = option.get("opendiscord:channel-prefix").value
const channelCategory = option.get("opendiscord:channel-category").value
const channelBackupCategory = option.get("opendiscord:channel-category-backup").value
const channelDescription = option.get("opendiscord:channel-description").value
const channelSuffix = await opendiscord.options.suffix.getSuffixFromOption(option,user)
const channelTopicText = option.get("opendiscord:channel-topic").value
const channelSuffix = await opendiscord.options.suffix.getSuffixFromOption(option,user,guild)
const channelName = channelPrefix+channelSuffix
//handle category
@@ -73,7 +74,7 @@ export const registerActions = async () => {
permissions.push({
type:discord.OverwriteType.Role,
id:admin,
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages","PinMessages","EmbedLinks"],
deny:[]
})
})
@@ -82,7 +83,7 @@ export const registerActions = async () => {
permissions.push({
type:discord.OverwriteType.Role,
id:admin,
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages","PinMessages","EmbedLinks"],
deny:[]
})
})
@@ -93,28 +94,15 @@ export const registerActions = async () => {
type:discord.OverwriteType.Role,
id:admin,
allow:["ViewChannel","ReadMessageHistory"],
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
deny:["SendMessages","AddReactions","AttachFiles","SendPolls","PinMessages"]
})
})
permissions.push({
type:discord.OverwriteType.Member,
id:user.id,
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory"],
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","EmbedLinks","PinMessages"],
deny:[]
})
//create channel
const channel = await guild.channels.create({
type:discord.ChannelType.GuildText,
name:channelName,
nsfw:false,
topic:channelDescription,
parent:category,
reason:"Ticket Created By "+user.displayName,
permissionOverwrites:permissions
})
await opendiscord.events.get("afterTicketChannelCreated").emit([option,channel,user])
//create participants
const participants: {type:"role"|"user",id:string}[] = []
@@ -125,12 +113,42 @@ export const registerActions = async () => {
participants.push({type,id})
})
//manage slowmode
const slowMode = option.get("opendiscord:slowmode-enabled").value ? option.get("opendiscord:slowmode-seconds").value : undefined
//handle channel topic
const channelTopics: string[] = []
if (generalConfig.data.system.channelTopic.showOptionName) channelTopics.push(option.get("opendiscord:name").value)
if (generalConfig.data.system.channelTopic.showOptionDescription) channelTopics.push(option.get("opendiscord:description").value)
if (generalConfig.data.system.channelTopic.showOptionTopic) channelTopics.push(channelTopicText)
if (generalConfig.data.system.channelTopic.showPriority) channelTopics.push("**"+lang.getTranslation("params.uppercase.priority")+":** "+opendiscord.priorities.get("opendiscord:none").renderDisplayName())
if (generalConfig.data.system.channelTopic.showClosed) channelTopics.push("**"+lang.getTranslation("params.uppercase.status")+":** "+lang.getTranslation("params.uppercase.open"))
if (generalConfig.data.system.channelTopic.showClaimed) channelTopics.push("**"+lang.getTranslation("stats.properties.claimedBy")+":** "+lang.getTranslation("params.uppercase.noone"))
if (generalConfig.data.system.channelTopic.showPinned) channelTopics.push("**"+lang.getTranslation("params.uppercase.pinned")+":** "+lang.getTranslation("params.uppercase.no"))
if (generalConfig.data.system.channelTopic.showCreator) channelTopics.push("**"+lang.getTranslation("params.uppercase.creator")+":** "+discord.userMention(user.id))
if (generalConfig.data.system.channelTopic.showParticipants) channelTopics.push("**"+lang.getTranslation("params.uppercase.participants")+":** "+participants.map((p) => (p.type == "user") ? discord.userMention(p.id) : discord.roleMention(p.id)).join(", "))
//create channel
const channel = await guild.channels.create({
type:discord.ChannelType.GuildText,
name:channelName,
nsfw:false,
topic:(channelTopics.length > 0) ? channelTopics.join(" • ") : undefined,
parent:category,
reason:"Ticket Created By "+user.displayName,
permissionOverwrites:permissions,
rateLimitPerUser:slowMode
})
await opendiscord.events.get("afterTicketChannelCreated").emit([option,channel,user])
//create ticket
const ticket = new api.ODTicket(channel.id,option,[
new api.ODTicketData("opendiscord:busy",false),
new api.ODTicketData("opendiscord:ticket-message",null),
new api.ODTicketData("opendiscord:participants",participants),
new api.ODTicketData("opendiscord:channel-suffix",channelSuffix),
new api.ODTicketData("opendiscord:previous-creators",[]),
new api.ODTicketData("opendiscord:open",true),
new api.ODTicketData("opendiscord:opened-by",user.id),
@@ -138,6 +156,9 @@ export const registerActions = async () => {
new api.ODTicketData("opendiscord:closed",false),
new api.ODTicketData("opendiscord:closed-by",null),
new api.ODTicketData("opendiscord:closed-on",null),
new api.ODTicketData("opendiscord:reopened",false),
new api.ODTicketData("opendiscord:reopened-by",null),
new api.ODTicketData("opendiscord:reopened-on",null),
new api.ODTicketData("opendiscord:claimed",false),
new api.ODTicketData("opendiscord:claimed-by",null),
new api.ODTicketData("opendiscord:claimed-on",null),
@@ -155,7 +176,11 @@ export const registerActions = async () => {
new api.ODTicketData("opendiscord:autodelete-enabled",option.get("opendiscord:autodelete-enable-days").value),
new api.ODTicketData("opendiscord:autodelete-days",(option.get("opendiscord:autodelete-enable-days").value ? option.get("opendiscord:autodelete-days").value : 0)),
new api.ODTicketData("opendiscord:answers",answers)
new api.ODTicketData("opendiscord:answers",answers),
new api.ODTicketData("opendiscord:priority",-1),
new api.ODTicketData("opendiscord:topic",option.get("opendiscord:channel-topic").value),
new api.ODTicketData("opendiscord:message-sent",false),
new api.ODTicketData("opendiscord:admin-message-sent",false),
])
//manage stats
@@ -185,6 +210,9 @@ export const registerActions = async () => {
const msg = await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build(source,{guild,channel,user,ticket})).message)
ticket.get("opendiscord:ticket-message").value = msg.id
//pin ticket message (if required)
if (generalConfig.data.system.pinFirstTicketMessage && msg.pinnable) await msg.pin("Ticket Message")
//manage stats
await opendiscord.stats.get("opendiscord:ticket").setStat("opendiscord:messages-sent",ticket.id.value,1,"increase")
@@ -226,4 +254,4 @@ export const registerActions = async () => {
])
})
])
}
}
+123 -120
View File
@@ -5,6 +5,7 @@ import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:delete-ticket"))
@@ -118,56 +119,57 @@ export const registerVerifyBars = async () => {
//DELETE TICKET TICKET MESSAGE
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-ticket-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-ticket-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("opendiscord:delete-ticket-ticket-message").success.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
}
//don't allow deleteWithoutTranscript to non-global-admins when enabled
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start deleting ticket
if (params.data == "reason"){
//delete with reason
@@ -203,56 +205,57 @@ export const registerVerifyBars = async () => {
//DELETE TICKET CLOSE MESSAGE
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-close-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-close-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("opendiscord:delete-ticket-close-message").success.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
}
//don't allow deleteWithoutTranscript to non-global-admins when enabled
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start deleting ticket
if (params.data == "reason"){
//delete with reason
@@ -292,55 +295,55 @@ export const registerVerifyBars = async () => {
//DELETE TICKET REOPEN MESSAGE
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-reopen-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-reopen-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("opendiscord:delete-ticket-reopen-message").success.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
}
//don't allow deleteWithoutTranscript to non-global-admins when enabled
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start deleting ticket
if (params.data == "reason"){
@@ -381,55 +384,55 @@ export const registerVerifyBars = async () => {
//DELETE TICKET AUTOCLOSE MESSAGE
opendiscord.verifybars.add(new api.ODVerifyBar("opendiscord:delete-ticket-autoclose-message",opendiscord.builders.messages.getSafe("opendiscord:verifybar-autoclose-message"),!generalConfig.data.system.disableVerifyBars))
opendiscord.verifybars.get("opendiscord:delete-ticket-autoclose-message").success.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild,channel,user,permissions:["support"]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
}
//don't allow deleteWithoutTranscript to non-global-admins when enabled
if (params.data == "no-transcript" && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:delete-ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start deleting ticket
if (params.data == "reason"){
+11 -8
View File
@@ -28,8 +28,7 @@ export const registerActions = async () => {
const rawClaimCategory = ticket.option.get("opendiscord:channel-categories-claimed").value.find((c) => c.user == user.id)
const claimCategory = (rawClaimCategory) ? rawClaimCategory.category : null
const closeCategory = ticket.option.get("opendiscord:channel-category-closed").value
const channelDescription = ticket.option.get("opendiscord:channel-description").value
const channelName = channelPrefix+channelSuffix
const channelTopic = ticket.option.get("opendiscord:channel-topic").value
//handle category
let category: string|null = null
@@ -155,17 +154,18 @@ export const registerActions = async () => {
ticket.get("opendiscord:participants").refreshDatabase()
//rename channel (and give error when crashed)
const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : ""
const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? ""
const originalName = channel.name
const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channelPrefix+channelSuffix)
try{
await utilities.timedAwait(channel.setName(channelName),2500,(err) => {
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket move","error")
})
}catch(err){
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:channelName})).message)
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-move",{guild,channel,user,originalName,newName:newName})).message)
}
try{
if (channel.type == discord.ChannelType.GuildText) channel.setTopic(channelDescription)
}catch{}
//update ticket message
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
@@ -173,7 +173,7 @@ export const registerActions = async () => {
try{
ticketMessage.edit((await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
opendiscord.log("Unable to edit ticket message on ticket renaming!","error",[
opendiscord.log("Unable to edit ticket message on ticket moving!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
@@ -187,6 +187,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:move-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketMoved").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
+7 -1
View File
@@ -31,8 +31,11 @@ export const registerActions = async () => {
}
//rename channel (and give error when crashed)
const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : ""
const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? ""
const originalName = channel.name
const newName = "📌"+channel.name
const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channel.name)
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket pin","error")
@@ -61,6 +64,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:pin-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketPinned").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
+15
View File
@@ -4,6 +4,8 @@
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:reaction-role"))
opendiscord.actions.get("opendiscord:reaction-role").workers.add([
@@ -81,6 +83,19 @@ export const registerActions = async () => {
instance.result = result
await opendiscord.events.get("afterRolesUpdated").emit([user,role])
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,user,option,overwriteMode} = params
if (!instance.role || !instance.result) return
//to logs
if (generalConfig.data.system.logs.enabled && (generalConfig.data.system.messages.reactionRole.logs)){
const logChannel = opendiscord.posts.get("opendiscord:logs")
if (logChannel) logChannel.send(await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-logs").build(source,{guild,user,role:instance.role,result:instance.result}))
}
//to dm
if (generalConfig.data.system.messages.reactionRole.dm) await opendiscord.client.sendUserDm(user,await opendiscord.builders.messages.getSafe("opendiscord:reaction-role-dm").build(source,{guild,user,role:instance.role,result:instance.result}))
}),
new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => {
const {guild,user,option} = params
opendiscord.log(user.displayName+" updated his roles!","info",[
+3
View File
@@ -48,6 +48,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:remove-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketUserRemoved").emit([ticket,user,data,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
+8 -1
View File
@@ -16,9 +16,13 @@ export const registerActions = async () => {
await opendiscord.events.get("onTicketRename").emit([ticket,user,channel,reason])
//rename channel (and give error when crashed)
const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : ""
const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? ""
const originalName = channel.name
const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(data)
try{
await utilities.timedAwait(channel.setName(data),2500,(err) => {
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket rename","error")
})
}catch(err){
@@ -45,6 +49,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:rename-message").build(source,{guild,channel,user,ticket,reason,data})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketRenamed").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,data} = params
+16 -2
View File
@@ -16,13 +16,24 @@ export const registerActions = async () => {
await opendiscord.events.get("onTicketReopen").emit([ticket,user,channel,reason])
//update ticket
ticket.get("opendiscord:reopened").value = true
ticket.get("opendiscord:reopened-by").value = user.id
ticket.get("opendiscord:reopened-on").value = new Date().getTime()
ticket.get("opendiscord:closed").value = false
ticket.get("opendiscord:open").value = true
ticket.get("opendiscord:autoclosed").value = false
ticket.get("opendiscord:closed-by").value = null
ticket.get("opendiscord:closed-on").value = null
ticket.get("opendiscord:autoclosed").value = false
ticket.get("opendiscord:open").value = true
ticket.get("opendiscord:busy").value = true
if (generalConfig.data.system.disableAutocloseAfterReopen){
//disable autoclose after reopen
ticket.get("opendiscord:autoclose-enabled").value = false
ticket.get("opendiscord:autoclose-hours").value = 0
}
//update stats
await opendiscord.stats.get("opendiscord:global").setStat("opendiscord:tickets-reopened",1,"increase")
await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-reopened",user.id,1,"increase")
@@ -149,6 +160,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:reopen-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketReopened").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
+154
View File
@@ -0,0 +1,154 @@
///////////////////////////////////////
//TICKET TRANSFER SYSTEM
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:transfer-ticket"))
opendiscord.actions.get("opendiscord:transfer-ticket").workers.add([
new api.ODWorker("opendiscord:transfer-ticket",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason,newCreator} = params
if (channel.isThread()) throw new api.ODSystemError("Unable to transfer ticket! Open Ticket doesn't support threads!")
const oldCreator = await opendiscord.tickets.getTicketUser(ticket,"creator") ?? opendiscord.client.client.user
await opendiscord.events.get("onTicketTransfer").emit([ticket,user,channel,oldCreator,newCreator,reason])
//update ticket
const oldCreatorId = ticket.get("opendiscord:opened-by").value
if (oldCreatorId){
ticket.get("opendiscord:previous-creators").value.push(oldCreatorId)
ticket.get("opendiscord:previous-creators").refreshDatabase()
}
if (!ticket.get("opendiscord:participants").value.find((p) => p.type == "user" && p.id == newCreator.id)){
ticket.get("opendiscord:participants").value.push({type:"user",id:newCreator.id})
ticket.get("opendiscord:participants").refreshDatabase()
}
ticket.get("opendiscord:opened-by").value = newCreator.id
if (["user-name","user-nickname","user-id"].includes(ticket.option.get("opendiscord:channel-suffix").value)){
const newSuffix = await opendiscord.options.suffix.getSuffixFromOption(ticket.option,newCreator,guild)
if (newSuffix) ticket.get("opendiscord:channel-suffix").value = newSuffix
}
//update stats
await opendiscord.stats.get("opendiscord:global").setStat("opendiscord:tickets-transferred",1,"increase")
await opendiscord.stats.get("opendiscord:user").setStat("opendiscord:tickets-transferred",user.id,1,"increase")
//get new channel properties
const channelPrefix = ticket.option.get("opendiscord:channel-prefix").value
const channelSuffix = ticket.get("opendiscord:channel-suffix").value
//handle permissions
const permissions: discord.OverwriteResolvable[] = [{
type:discord.OverwriteType.Role,
id:guild.roles.everyone.id,
allow:[],
deny:["ViewChannel","SendMessages","ReadMessageHistory"]
}]
const globalAdmins = opendiscord.configs.get("opendiscord:general").data.globalAdmins
const optionAdmins = ticket.option.get("opendiscord:admins").value
const readonlyAdmins = ticket.option.get("opendiscord:admins-readonly").value
globalAdmins.forEach((admin) => {
permissions.push({
type:discord.OverwriteType.Role,
id:admin,
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
deny:[]
})
})
optionAdmins.forEach((admin) => {
if (globalAdmins.includes(admin)) return
permissions.push({
type:discord.OverwriteType.Role,
id:admin,
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory","ManageMessages"],
deny:[]
})
})
readonlyAdmins.forEach((admin) => {
if (globalAdmins.includes(admin)) return
if (optionAdmins.includes(admin)) return
permissions.push({
type:discord.OverwriteType.Role,
id:admin,
allow:["ViewChannel","ReadMessageHistory"],
deny:["SendMessages","AddReactions","AttachFiles","SendPolls"]
})
})
//transfer all old user-participants over to the new ticket (creator & participants)
ticket.get("opendiscord:participants").value.forEach((p) => {
if (p.type == "user") permissions.push({
type:discord.OverwriteType.Member,
id:p.id,
allow:["ViewChannel","SendMessages","AddReactions","AttachFiles","SendPolls","ReadMessageHistory"],
deny:[]
})
})
try{
await channel.permissionOverwrites.set(permissions)
}catch{
opendiscord.log("Failed to reset channel permissions on ticket transfer!","error")
}
//rename channel (and give error when crashed)
const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : ""
const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? ""
const originalName = channel.name
const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channelPrefix+channelSuffix)
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket transfer","error")
})
}catch(err){
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-transfer",{guild,channel,user,originalName,newName:newName})).message)
}
//update ticket message
const ticketMessage = await opendiscord.tickets.getTicketMessage(ticket)
if (ticketMessage){
try{
ticketMessage.edit((await opendiscord.builders.messages.getSafe("opendiscord:ticket-message").build("other",{guild,channel,user,ticket})).message)
}catch(e){
opendiscord.log("Unable to edit ticket message on ticket transferring!","error",[
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"messageid",value:ticketMessage.id},
{key:"option",value:ticket.option.id.value}
])
opendiscord.debugfile.writeErrorMessage(new api.ODError(e,"uncaughtException"))
}
}
//reply with new message
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:transfer-message").build(source,{guild,channel,user,ticket,oldCreator,newCreator,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketTransferred").emit([ticket,user,channel,oldCreator,newCreator,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,newCreator,reason} = params
}),
new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket,newCreator} = params
opendiscord.log(user.displayName+" transferred a ticket to '"+newCreator.displayName+"'!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"reason",value:params.reason ?? "/"},
{key:"method",value:source}
])
})
])
opendiscord.actions.get("opendiscord:transfer-ticket").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("opendiscord:busy").value = false
})
}
+3
View File
@@ -94,6 +94,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:unclaim-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketUnclaimed").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
+13 -9
View File
@@ -22,16 +22,17 @@ export const registerActions = async () => {
ticket.get("opendiscord:busy").value = true
//rename channel (and give error when crashed)
const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : ""
const priorityEmoji = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).channelEmoji ?? ""
const originalName = channel.name
if (originalName.startsWith("📌")){
const newName = originalName.replace("📌","");
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket unpin","error")
})
}catch(err){
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message)
}
const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channel.name)
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket unpin","error")
})
}catch(err){
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-unpin",{guild,channel,user,originalName,newName})).message)
}
//update ticket message
@@ -54,6 +55,9 @@ export const registerActions = async () => {
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:unpin-message").build(source,{guild,channel,user,ticket,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketUnpinned").emit([ticket,user,channel,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,reason} = params
+65
View File
@@ -0,0 +1,65 @@
///////////////////////////////////////
//TICKET TOPIC SYSTEM
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:update-ticket-priority"))
opendiscord.actions.get("opendiscord:update-ticket-priority").workers.add([
new api.ODWorker("opendiscord:update-ticket-priority",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,newPriority,reason} = params
if (channel.isThread() || !(channel instanceof discord.TextChannel)) throw new api.ODSystemError("Unable to set priority of ticket! Open Ticket doesn't support threads!")
const oldPriority = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value)
await opendiscord.events.get("onTicketPriorityChange").emit([ticket,user,channel,oldPriority,newPriority,reason])
//update ticket
ticket.get("opendiscord:busy").value = true
if (newPriority) ticket.get("opendiscord:priority").value = newPriority.priority
//rename channel (and give error when crashed)
const pinEmoji = ticket.get("opendiscord:pinned").value ? generalConfig.data.system.pinEmoji : ""
const priorityEmoji = newPriority.channelEmoji ?? ""
const originalName = channel.name
const newName = pinEmoji+priorityEmoji+utilities.trimEmojis(channel.name)
try{
await utilities.timedAwait(channel.setName(newName),2500,(err) => {
opendiscord.log("Failed to rename channel on ticket priority update","error")
})
}catch(err){
await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:error-channel-rename").build("ticket-priority",{guild,channel,user,originalName,newName})).message)
}
//reply with new message
if (params.sendMessage) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:priority-set").build(source,{guild,channel,user,ticket,priority:newPriority,reason})).message)
ticket.get("opendiscord:busy").value = false
await opendiscord.events.get("afterTicketPriorityChanged").emit([ticket,user,channel,oldPriority,newPriority,reason])
//update channel topic
await opendiscord.actions.get("opendiscord:update-ticket-topic").run("ticket-action",{guild,channel,user,ticket,sendMessage:false,newTopic:null})
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
}),
new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket,newPriority} = params
opendiscord.log(user.displayName+" changed the priority of a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"priority",value:newPriority.id.value},
{key:"method",value:source}
])
})
])
opendiscord.actions.get("opendiscord:update-ticket-priority").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("opendiscord:busy").value = false
})
}
+70
View File
@@ -0,0 +1,70 @@
///////////////////////////////////////
//TICKET TOPIC SYSTEM
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
export const registerActions = async () => {
opendiscord.actions.add(new api.ODAction("opendiscord:update-ticket-topic"))
opendiscord.actions.get("opendiscord:update-ticket-topic").workers.add([
new api.ODWorker("opendiscord:update-ticket-topic",2,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket,newTopic} = params
if (channel.isThread() || !(channel instanceof discord.TextChannel)) throw new api.ODSystemError("Unable to set topic of ticket! Open Ticket doesn't support threads!")
const oldTopic = ticket.get("opendiscord:topic").value
if (newTopic) await opendiscord.events.get("onTicketTopicChange").emit([ticket,user,channel,oldTopic,newTopic])
//update ticket
ticket.get("opendiscord:busy").value = true
if (newTopic) ticket.get("opendiscord:topic").value = newTopic
//get ticket data
const closed = ticket.get("opendiscord:closed").value
const claimedBy = ticket.get("opendiscord:claimed-by").value
const pinned = ticket.get("opendiscord:pinned").value
const creator = ticket.get("opendiscord:opened-by").value ?? opendiscord.client.client.user.id
//handle channel topic
const channelTopics: string[] = []
if (generalConfig.data.system.channelTopic.showOptionName) channelTopics.push(ticket.option.get("opendiscord:name").value)
if (generalConfig.data.system.channelTopic.showOptionDescription) channelTopics.push(ticket.option.get("opendiscord:description").value)
if (generalConfig.data.system.channelTopic.showOptionTopic) channelTopics.push(ticket.get("opendiscord:topic").value)
if (generalConfig.data.system.channelTopic.showPriority) channelTopics.push("**"+lang.getTranslation("params.uppercase.priority")+":** "+opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value).renderDisplayName())
if (generalConfig.data.system.channelTopic.showClosed) channelTopics.push("**"+lang.getTranslation("params.uppercase.status")+":** "+(closed ? lang.getTranslation("params.uppercase.closed") : lang.getTranslation("params.uppercase.open")))
if (generalConfig.data.system.channelTopic.showClaimed) channelTopics.push("**"+lang.getTranslation("stats.properties.claimedBy")+":** "+(claimedBy ? discord.userMention(claimedBy) : lang.getTranslation("params.uppercase.noone")))
if (generalConfig.data.system.channelTopic.showPinned) channelTopics.push("**"+lang.getTranslation("params.uppercase.pinned")+":** "+(pinned ? lang.getTranslation("params.uppercase.yes") : lang.getTranslation("params.uppercase.no")))
if (generalConfig.data.system.channelTopic.showCreator) channelTopics.push("**"+lang.getTranslation("params.uppercase.creator")+":** "+discord.userMention(creator))
if (generalConfig.data.system.channelTopic.showParticipants) channelTopics.push("**"+lang.getTranslation("params.uppercase.participants")+":** "+ticket.get("opendiscord:participants").value.map((p) => (p.type == "user") ? discord.userMention(p.id) : discord.roleMention(p.id)).join(", "))
//update channel
channel.setTopic(channelTopics.join(" • "),"Topic Changed")
//reply with new message
if (params.sendMessage && newTopic) await channel.send((await opendiscord.builders.messages.getSafe("opendiscord:topic-set").build(source,{guild,channel,user,ticket,topic:newTopic})).message)
ticket.get("opendiscord:busy").value = false
if (newTopic) await opendiscord.events.get("afterTicketTopicChanged").emit([ticket,user,channel,oldTopic,newTopic])
}),
new api.ODWorker("opendiscord:discord-logs",1,async (instance,params,source,cancel) => {
const {guild,channel,user,ticket} = params
}),
new api.ODWorker("opendiscord:logs",0,(instance,params,source,cancel) => {
const {guild,channel,user,ticket,newTopic} = params
if (newTopic) opendiscord.log(user.displayName+" changed the topic of a ticket!","info",[
{key:"user",value:user.username},
{key:"userid",value:user.id,hidden:true},
{key:"channel",value:"#"+channel.name},
{key:"channelid",value:channel.id,hidden:true},
{key:"topic",value:newTopic},
{key:"method",value:source}
])
})
])
opendiscord.actions.get("opendiscord:update-ticket-topic").workers.backupWorker = new api.ODWorker("opendiscord:cancel-busy",0,(instance,params) => {
//set busy to false in case of crash or cancel
params.ticket.get("opendiscord:busy").value = false
})
}
+2 -2
View File
@@ -277,7 +277,7 @@ const ticketButtons = () => {
instance.setMode("button")
instance.setCustomId("od:pin-ticket_"+source)
instance.setColor("gray")
instance.setEmoji("📌")
instance.setEmoji(generalConfig.data.system.pinEmoji)
instance.setLabel(lang.getTranslation("actions.buttons.pin"))
})
)
@@ -291,7 +291,7 @@ const ticketButtons = () => {
instance.setMode("button")
instance.setCustomId("od:unpin-ticket_"+source)
instance.setColor("gray")
instance.setEmoji("📌")
instance.setEmoji(generalConfig.data.system.pinEmoji)
instance.setLabel(lang.getTranslation("actions.buttons.unpin"))
})
)
+154 -39
View File
@@ -20,6 +20,7 @@ export const registerAllEmbeds = async () => {
roleEmbeds()
clearEmbeds()
autoEmbeds()
extraEmbeds()
}
/**Utility function to get the translated "method" from the source. Mostly used in error embeds. */
@@ -37,12 +38,12 @@ const errorEmbeds = () => {
embeds.add(new api.ODEmbed("opendiscord:error"))
embeds.get("opendiscord:error").workers.add(
new api.ODWorker("opendiscord:error",0,async (instance,params,source) => {
const {user,error,layout} = params
const {user,error,layout,customTitle} = params
const method = getMethodFromSource(source)
instance.setColor(generalConfig.data.system.useRedErrorEmbeds ? "Red" : generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("❌",lang.getTranslation("errors.titles.internalError")))
instance.setTitle(utilities.emojiTitle("❌",customTitle ?? lang.getTranslation("errors.titles.internalError")))
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setDescription(lang.getTranslationWithParams("errors.descriptions.internalError",[method]) + (layout == "simple") ? "\n"+error : "")
if (layout == "advanced" && error) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+error+"```"})
@@ -329,7 +330,7 @@ const errorEmbeds = () => {
new api.ODWorker("opendiscord:error-channel-rename",0,async (instance,params,source) => {
const {channel,user,originalName,newName} = params
const method = (source == "ticket-move" || source == "ticket-pin" || source == "ticket-rename" || source == "ticket-unpin") ? source : getMethodFromSource(source)
const method = (source == "ticket-move" || source == "ticket-pin" || source == "ticket-rename" || source == "ticket-unpin" || source == "ticket-priority" || source == "ticket-transfer") ? source : getMethodFromSource(source)
instance.setColor(generalConfig.data.system.useRedErrorEmbeds ? "Red" : generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("❌",lang.getTranslation("errors.titles.channelRename")))
@@ -412,14 +413,17 @@ const statsEmbeds = () => {
const scope = opendiscord.stats.get("opendiscord:ticket")
const participantsScope = opendiscord.stats.get("opendiscord:participants")
if (!scope || !participantsScope) return
const messagesScope = opendiscord.stats.get("opendiscord:messages")
if (!scope || !participantsScope || !messagesScope) return
const data = await scope.render(scopeData.id.value,guild,channel,user)
const participantsData = await participantsScope.render(scopeData.id.value,guild,channel,user)
const messagesData = await messagesScope.render(scopeData.id.value,guild,channel,user)
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(scope.name)
instance.setDescription(data)
instance.addFields({name:participantsScope.name,value:participantsData,inline:false})
instance.addFields({name:participantsScope.name,value:participantsData,inline:true})
instance.addFields({name:messagesScope.name,value:messagesData,inline:true})
})
)
@@ -592,8 +596,11 @@ const ticketEmbeds = () => {
if (embedOptions.image) instance.setImage(embedOptions.image)
if (embedOptions.timestamp) instance.setTimestamp(new Date())
if (embedOptions.description) instance.setDescription(embedOptions.description)
if (ticket.option.get("opendiscord:questions").value.length > 0){
//show config fields if mixing is allowed
if (generalConfig.data.system.displayFieldsWithQuestions) instance.addFields(...embedOptions.fields)
const answers = ticket.get("opendiscord:answers").value
answers.forEach((answer) => {
if (!answer.value || answer.value.length == 0) return
@@ -610,7 +617,7 @@ const ticketEmbeds = () => {
if (ticket.get("opendiscord:claimed").value){
const claimUser = await opendiscord.tickets.getTicketUser(ticket,"claimer")
if (!claimUser) return
instance.setAuthor(lang.getTranslationWithParams("params.uppercase.claimedBy",[claimUser.displayName]),claimUser.displayAvatarURL())
instance.setAuthor(lang.getTranslation("stats.properties.claimedBy")+" "+claimUser.displayName,claimUser.displayAvatarURL())
}
})
)
@@ -625,7 +632,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🔒",lang.getTranslation("actions.titles.close")))
instance.setDescription(lang.getTranslation("actions.descriptions.close"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -639,7 +646,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🔓",lang.getTranslation("actions.titles.reopen")))
instance.setDescription(lang.getTranslation("actions.descriptions.reopen"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -653,7 +660,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🗑️",lang.getTranslation("actions.titles.delete")))
instance.setDescription(lang.getTranslation("actions.descriptions.delete"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -667,7 +674,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("👋",lang.getTranslation("actions.titles.claim")))
instance.setDescription(lang.getTranslation("actions.descriptions.claim"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -681,7 +688,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("↩️",lang.getTranslation("actions.titles.unclaim")))
instance.setDescription(lang.getTranslation("actions.descriptions.unclaim"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -693,9 +700,9 @@ const ticketEmbeds = () => {
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("📌",lang.getTranslation("actions.titles.pin")))
instance.setTitle(utilities.emojiTitle(generalConfig.data.system.pinEmoji,lang.getTranslation("actions.titles.pin")))
instance.setDescription(lang.getTranslation("actions.descriptions.pin"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -707,9 +714,9 @@ const ticketEmbeds = () => {
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("📌",lang.getTranslation("actions.titles.unpin")))
instance.setTitle(utilities.emojiTitle(generalConfig.data.system.pinEmoji,lang.getTranslation("actions.titles.unpin")))
instance.setDescription(lang.getTranslation("actions.descriptions.unpin"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -723,7 +730,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🔄",lang.getTranslation("actions.titles.rename")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.rename",["`#"+data+"`"]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -737,7 +744,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🔀",lang.getTranslation("actions.titles.move")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.move",["`"+data.get("opendiscord:name").value+"`"]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -751,7 +758,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("👤",lang.getTranslation("actions.titles.add")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.add",[discord.userMention(data.id)]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -765,7 +772,7 @@ const ticketEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("👤",lang.getTranslation("actions.titles.remove")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.remove",[discord.userMention(data.id)]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -797,10 +804,10 @@ const ticketEmbeds = () => {
instance.setTitle(utilities.emojiTitle("↩️",lang.getTranslation("actions.titles.unclaim")))
instance.setDescription(lang.getTranslation("actions.logs.unclaimDm"))
}else if (mode == "pin"){
instance.setTitle(utilities.emojiTitle("📌",lang.getTranslation("actions.titles.pin")))
instance.setTitle(utilities.emojiTitle(generalConfig.data.system.pinEmoji,lang.getTranslation("actions.titles.pin")))
instance.setDescription(lang.getTranslation("actions.logs.pinDm"))
}else if (mode == "unpin"){
instance.setTitle(utilities.emojiTitle("📌",lang.getTranslation("actions.titles.unpin")))
instance.setTitle(utilities.emojiTitle(generalConfig.data.system.pinEmoji,lang.getTranslation("actions.titles.unpin")))
instance.setDescription(lang.getTranslation("actions.logs.unpinDm"))
}else if (mode == "rename"){
instance.setTitle(utilities.emojiTitle("🔄",lang.getTranslation("actions.titles.rename")))
@@ -831,10 +838,9 @@ const ticketEmbeds = () => {
instance.setTimestamp(new Date())
instance.addFields(
{name:lang.getTranslation("params.uppercase.ticket")+":",value:"```#"+(channel ? channel.name : "<unknown>")+"```",inline:false},
//TODO TRANSLATION!!!
{name:"Option"+":",value:"```"+(ticket.option.get("opendiscord:name").value)+"```",inline:false},
{name:lang.getTranslation("params.uppercase.option")+":",value:"```"+(ticket.option.get("opendiscord:name").value)+"```",inline:false},
)
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```",inline:false})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```",inline:false})
if (mode == "close"){
instance.setTitle(utilities.emojiTitle("🔒",lang.getTranslation("actions.titles.close")))
@@ -852,10 +858,10 @@ const ticketEmbeds = () => {
instance.setTitle(utilities.emojiTitle("↩️",lang.getTranslation("actions.titles.unclaim")))
instance.setDescription(lang.getTranslationWithParams("actions.logs.unclaimLog",[discord.userMention(user.id)]))
}else if (mode == "pin"){
instance.setTitle(utilities.emojiTitle("📌",lang.getTranslation("actions.titles.pin")))
instance.setTitle(utilities.emojiTitle(generalConfig.data.system.pinEmoji,lang.getTranslation("actions.titles.pin")))
instance.setDescription(lang.getTranslationWithParams("actions.logs.pinLog",[discord.userMention(user.id)]))
}else if (mode == "unpin"){
instance.setTitle(utilities.emojiTitle("📌",lang.getTranslation("actions.titles.unpin")))
instance.setTitle(utilities.emojiTitle(generalConfig.data.system.pinEmoji,lang.getTranslation("actions.titles.unpin")))
instance.setDescription(lang.getTranslationWithParams("actions.logs.unpinLog",[discord.userMention(user.id)]))
}else if (mode == "rename"){
instance.setTitle(utilities.emojiTitle("🔄",lang.getTranslation("actions.titles.rename")))
@@ -908,7 +914,7 @@ const blacklistEmbeds = () => {
if (blacklist){
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.blacklistGetSuccess",[discord.userMention(data.id)]))
if (blacklist.reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+blacklist.reason+"```"})
if (blacklist.reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(blacklist.reason ?? "/")+"```"})
}else instance.setDescription("*"+lang.getTranslationWithParams("actions.descriptions.blacklistGetEmpty",[discord.userMention(data.id)])+"*")
})
@@ -924,7 +930,7 @@ const blacklistEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🚫",lang.getTranslation("actions.titles.blacklistAdd")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.blacklistAdd",[discord.userMention(data.id)]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -938,7 +944,7 @@ const blacklistEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🆓",lang.getTranslation("actions.titles.blacklistRemove")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.blacklistRemove",[discord.userMention(data.id)]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -955,7 +961,7 @@ const blacklistEmbeds = () => {
instance.setTitle(utilities.emojiTitle((mode == "add") ? "🚫" : "🆓",title))
instance.setTimestamp(new Date())
instance.setDescription(text)
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```",inline:false})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -974,7 +980,7 @@ const blacklistEmbeds = () => {
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setTimestamp(new Date())
instance.setDescription(text)
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```",inline:false})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
}
@@ -1074,11 +1080,11 @@ const transcriptEmbeds = () => {
const {guild,channel,user,ticket,compiler,reason} = params
instance.setColor(generalConfig.data.system.useRedErrorEmbeds ? "Red" : generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("❌","Transcript Error")) //TODO TRANSLATION!!!
instance.setTitle(utilities.emojiTitle("❌",lang.getTranslation("transcripts.errors.title")))
instance.setTimestamp(new Date())
instance.setDescription(lang.getTranslation("transcripts.errors.error"))
instance.setFooter(lang.getTranslation("errors.descriptions.askForInfo"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```",inline:false})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
}
@@ -1107,6 +1113,58 @@ const roleEmbeds = () => {
else instance.setDescription(lang.getTranslation("actions.descriptions.rolesEmpty"))
})
)
//REACTION ROLE DM
embeds.add(new api.ODEmbed("opendiscord:reaction-role-dm"))
embeds.get("opendiscord:reaction-role-dm").workers.add(
new api.ODWorker("opendiscord:reaction-role-dm",0,async (instance,params,source) => {
const {guild,user,role,result} = params
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🎨",lang.getTranslation("actions.titles.roles")))
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setTimestamp(new Date())
const newResult = result.filter((r) => r.action != null).sort((a,b) => {
if (a.action == "added" && b.action == "removed") return -1
else if (a.action == "removed" && b.action == "added") return 1
else return 0
}).map((r) => {
return (r.action == "added") ? "🟢 "+lang.getTranslation("params.uppercase.added")+" @"+r.role.name : "🔴 "+lang.getTranslation("params.uppercase.removed")+" @"+r.role.name
})
const baseDescription = lang.getTranslation("actions.logs.roleUpdateDm")
if (newResult.length > 0) instance.setDescription(baseDescription+"\n\n"+newResult.join("\n"))
else instance.setDescription(baseDescription+"\n"+lang.getTranslation("actions.descriptions.rolesEmpty"))
})
)
//REACTION ROLE LOGS
embeds.add(new api.ODEmbed("opendiscord:reaction-role-logs"))
embeds.get("opendiscord:reaction-role-logs").workers.add(
new api.ODWorker("opendiscord:reaction-role-logs",0,async (instance,params,source) => {
const {guild,user,role,result} = params
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🎨",lang.getTranslation("actions.titles.roles")))
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setTimestamp(new Date())
const newResult = result.filter((r) => r.action != null).sort((a,b) => {
if (a.action == "added" && b.action == "removed") return -1
else if (a.action == "removed" && b.action == "added") return 1
else return 0
}).map((r) => {
return (r.action == "added") ? "🟢 "+lang.getTranslation("params.uppercase.added")+" "+discord.roleMention(r.role.id) : "🔴 "+lang.getTranslation("params.uppercase.removed")+" "+discord.roleMention(r.role.id)
})
const baseDescription = lang.getTranslationWithParams("actions.logs.roleUpdateLog",[discord.userMention(user.id)])
if (newResult.length > 0) instance.setDescription(baseDescription+"\n\n"+newResult.join("\n"))
else instance.setDescription(baseDescription+"\n"+lang.getTranslation("actions.descriptions.rolesEmpty"))
})
)
}
const clearEmbeds = () => {
@@ -1117,7 +1175,7 @@ const clearEmbeds = () => {
const {guild,channel,user,filter,list} = params
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("⚠️","Clear Tickets")) //TODO TRANSLATION!!!
instance.setTitle(utilities.emojiTitle("⚠️",lang.getTranslation("actions.titles.clearTickets")))
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setTimestamp(new Date())
instance.setDescription(lang.getTranslation("actions.descriptions.clearVerify"))
@@ -1207,7 +1265,7 @@ const autoEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("⏱️",lang.getTranslation("actions.titles.autocloseEnabled")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.autocloseEnabled",[time.toString()]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -1221,7 +1279,7 @@ const autoEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("⏱️",lang.getTranslation("actions.titles.autodeleteEnabled")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.autodeleteEnabled",[time.toString()]))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -1235,7 +1293,7 @@ const autoEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("⏱️",lang.getTranslation("actions.titles.autocloseDisabled")))
instance.setDescription(lang.getTranslation("actions.descriptions.autocloseDisabled"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
@@ -1249,7 +1307,64 @@ const autoEmbeds = () => {
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("⏱️",lang.getTranslation("actions.titles.autodeleteDisabled")))
instance.setDescription(lang.getTranslation("actions.descriptions.autodeleteDisabled"))
if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```"})
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
}
const extraEmbeds = () => {
//TOPIC SET
embeds.add(new api.ODEmbed("opendiscord:topic-set"))
embeds.get("opendiscord:topic-set").workers.add(
new api.ODWorker("opendiscord:topic-set",0,async (instance,params,source) => {
const {user,topic} = params
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("ℹ️",lang.getTranslation("actions.titles.topicSet")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.topicSet",[discord.userMention(user.id)]))
if (topic) instance.addFields({name:lang.getTranslation("params.uppercase.topic")+":",value:"```"+topic+"```"})
})
)
//PRIORITY SET
embeds.add(new api.ODEmbed("opendiscord:priority-set"))
embeds.get("opendiscord:priority-set").workers.add(
new api.ODWorker("opendiscord:priority-set",0,async (instance,params,source) => {
const {user,priority,reason} = params
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🚨",lang.getTranslation("actions.titles.prioritySet")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.prioritySet",["**"+priority.renderDisplayName()+"**",discord.userMention(user.id)]))
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
//PRIORITY GET
embeds.add(new api.ODEmbed("opendiscord:priority-get"))
embeds.get("opendiscord:priority-get").workers.add(
new api.ODWorker("opendiscord:priority-get",0,async (instance,params,source) => {
const {user,priority} = params
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🚨",lang.getTranslation("actions.titles.priorityGet")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.priorityGet",["**"+priority.renderDisplayName()+"**"]))
})
)
//TRANSFER MESSAGE
embeds.add(new api.ODEmbed("opendiscord:transfer-message"))
embeds.get("opendiscord:transfer-message").workers.add(
new api.ODWorker("opendiscord:transfer-message",0,async (instance,params,source) => {
const {user,oldCreator,newCreator,reason} = params
instance.setAuthor(user.displayName,user.displayAvatarURL())
instance.setColor(generalConfig.data.mainColor)
instance.setTitle(utilities.emojiTitle("🔀",lang.getTranslation("actions.titles.transfer")))
instance.setDescription(lang.getTranslationWithParams("actions.descriptions.transfer",[discord.userMention(oldCreator.id),discord.userMention(newCreator.id),discord.userMention(user.id)]))
if (reason || generalConfig.data.system.alwaysShowReason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+(reason ?? "/")+"```"})
})
)
}
+59 -2
View File
@@ -24,6 +24,7 @@ export const registerAllMessages = async () => {
roleMessages()
clearMessages()
autoMessages()
extraMessages()
}
const verifyBarMessages = () => {
@@ -332,8 +333,8 @@ const errorMessages = () => {
messages.add(new api.ODMessage("opendiscord:error"))
messages.get("opendiscord:error").workers.add(
new api.ODWorker("opendiscord:error",0,async (instance,params,source) => {
const {guild,channel,user,error,layout} = params
instance.addEmbed(await embeds.getSafe("opendiscord:error").build(source,{guild,channel,user,error,layout}))
const {guild,channel,user,error,layout,customTitle} = params
instance.addEmbed(await embeds.getSafe("opendiscord:error").build(source,{guild,channel,user,error,layout,customTitle}))
instance.setEphemeral(true)
})
)
@@ -964,6 +965,24 @@ const roleMessages = () => {
instance.setEphemeral(true)
})
)
//REACTION ROLE DM
messages.add(new api.ODMessage("opendiscord:reaction-role-dm"))
messages.get("opendiscord:reaction-role-dm").workers.add(
new api.ODWorker("opendiscord:reaction-role-dm",0,async (instance,params,source) => {
const {guild,user,role,result} = params
instance.addEmbed(await embeds.getSafe("opendiscord:reaction-role-dm").build(source,{guild,user,role,result}))
})
)
//REACTION ROLE LOGS
messages.add(new api.ODMessage("opendiscord:reaction-role-logs"))
messages.get("opendiscord:reaction-role-logs").workers.add(
new api.ODWorker("opendiscord:reaction-role-logs",0,async (instance,params,source) => {
const {guild,user,role,result} = params
instance.addEmbed(await embeds.getSafe("opendiscord:reaction-role-logs").build(source,{guild,user,role,result}))
})
)
}
const clearMessages = () => {
@@ -1054,4 +1073,42 @@ const autoMessages = () => {
instance.addEmbed(await embeds.getSafe("opendiscord:autodelete-disable").build(source,{guild,channel,user,ticket,reason}))
})
)
}
const extraMessages = () => {
//TOPIC SET
messages.add(new api.ODMessage("opendiscord:topic-set"))
messages.get("opendiscord:topic-set").workers.add(
new api.ODWorker("opendiscord:topic-set",0,async (instance,params,source) => {
const {guild,channel,user,ticket,topic} = params
instance.addEmbed(await embeds.getSafe("opendiscord:topic-set").build(source,{guild,channel,user,ticket,topic}))
})
)
//PRIORITY SET
messages.add(new api.ODMessage("opendiscord:priority-set"))
messages.get("opendiscord:priority-set").workers.add(
new api.ODWorker("opendiscord:priority-set",0,async (instance,params,source) => {
const {guild,channel,user,ticket,priority,reason} = params
instance.addEmbed(await embeds.getSafe("opendiscord:priority-set").build(source,{guild,channel,user,ticket,priority,reason}))
})
)
//PRIORITY GET
messages.add(new api.ODMessage("opendiscord:priority-get"))
messages.get("opendiscord:priority-get").workers.add(
new api.ODWorker("opendiscord:priority-get",0,async (instance,params,source) => {
const {guild,channel,user,ticket,priority} = params
instance.addEmbed(await embeds.getSafe("opendiscord:priority-get").build(source,{guild,channel,user,ticket,priority}))
})
)
//TRANSFER MESSAGE
messages.add(new api.ODMessage("opendiscord:transfer-message"))
messages.get("opendiscord:transfer-message").workers.add(
new api.ODWorker("opendiscord:transfer-message",0,async (instance,params,source) => {
const {guild,channel,user,ticket,oldCreator,newCreator,reason} = params
instance.addEmbed(await embeds.getSafe("opendiscord:transfer-message").build(source,{guild,channel,user,ticket,oldCreator,newCreator,reason}))
})
)
}
+14 -34
View File
@@ -10,50 +10,30 @@ export const registerCommandResponders = async () => {
//ADD COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:add",generalConfig.data.prefix,"add"))
opendiscord.responders.commands.get("opendiscord:add").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.add
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:add",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.add,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check if in guild/Server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+16 -35
View File
@@ -10,62 +10,43 @@ export const registerCommandResponders = async () => {
//AUTOCLOSE COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:autoclose",generalConfig.data.prefix,/^autoclose/))
opendiscord.responders.commands.get("opendiscord:autoclose").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.autoclose
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:autoclose",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.autoclose,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
//return when already closed
if (ticket.get("opendiscord:closed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//subcommands
const scope = instance.options.getSubCommand()
if (!scope || (scope != "disable" && scope != "enable")) return
+32
View File
@@ -0,0 +1,32 @@
///////////////////////////////////////
//AUTOCOMPLETE COMMAND UTILS
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
export const registerAutocompleteResponders = async () => {
//PANEL ID AUTOCOMPLETE
opendiscord.responders.autocomplete.add(new api.ODAutocompleteResponder("opendiscord:panel-id","panel","id"))
opendiscord.responders.autocomplete.get("opendiscord:panel-id").workers.add(new api.ODWorker("opendiscord:panel-id",0,async (instance,params,source,cancel) => {
//create panel choices
const panelChoices : {name:string, value:string}[] = []
opendiscord.configs.get("opendiscord:panels").data.forEach((panel) => {
panelChoices.push({name:panel.name, value:panel.id})
})
await instance.filteredAutocomplete(panelChoices)
}))
//OPTION ID AUTOCOMPLETE
opendiscord.responders.autocomplete.add(new api.ODAutocompleteResponder("opendiscord:option-id",/ticket|move/,"id"))
opendiscord.responders.autocomplete.get("opendiscord:option-id").workers.add(new api.ODWorker("opendiscord:option-id",0,async (instance,params,source,cancel) => {
//create ticket choices
const ticketChoices : {name:string, value:string}[] = []
opendiscord.configs.get("opendiscord:options").data.forEach((option) => {
if (option.type != "ticket") return
ticketChoices.push({name:option.name, value:option.id})
})
instance.filteredAutocomplete(ticketChoices)
}))
}
+15 -34
View File
@@ -10,57 +10,38 @@ export const registerCommandResponders = async () => {
//AUTODELETE COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:autodelete",generalConfig.data.prefix,/^autodelete/))
opendiscord.responders.commands.get("opendiscord:autodelete").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.autodelete
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:autodelete",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.autodelete,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//subcommands
const scope = instance.options.getSubCommand()
if (!scope || (scope != "disable" && scope != "enable")) return
+13 -36
View File
@@ -10,49 +10,26 @@ export const registerCommandResponders = async () => {
//BLACKLIST COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:blacklist",generalConfig.data.prefix,/^blacklist/))
opendiscord.responders.commands.get("opendiscord:blacklist").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.blacklist
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:blacklist",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.blacklist,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//subcommands
const scope = instance.options.getSubCommand()
if (!scope || (scope != "add" && scope != "get" && scope != "remove" && scope != "view")) return
if (scope == "view"){
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:blacklist-view").build(source,{guild,channel,user}))
+15 -34
View File
@@ -10,55 +10,36 @@ export const registerCommandResponders = async () => {
//CLAIM COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:claim",generalConfig.data.prefix,"claim"))
opendiscord.responders.commands.get("opendiscord:claim").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.claim
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:claim",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.claim,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already claimed
if (ticket.get("opendiscord:claimed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+11 -35
View File
@@ -10,42 +10,18 @@ export const registerCommandResponders = async () => {
//CLEAR COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:clear",generalConfig.data.prefix,"clear"))
opendiscord.responders.commands.get("opendiscord:clear").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.clear
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
//only allow global admins (ticket admins aren't allowed to clear tickets)
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelUserScope:false,allowChannelRoleScope:false}))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:clear",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions (only allow global admins: ticket admins aren't allowed to clear tickets)
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.clear,"support",user,member,channel,guild,{allowChannelUserScope:false,allowChannelRoleScope:false})
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
+30 -36
View File
@@ -5,70 +5,64 @@ import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
export const registerCommandResponders = async () => {
//CLOSE COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:close",generalConfig.data.prefix,"close"))
opendiscord.responders.commands.get("opendiscord:close").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.close
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:close",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.close,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already closed
if (ticket.get("opendiscord:closed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
const reason = instance.options.getString("reason",false)
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
//start closing ticket
await instance.defer(false)
const reason = instance.options.getString("reason",false)
await opendiscord.actions.get("opendiscord:close-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:close-message").build(source,{guild,channel,user,ticket,reason}))
}),
+36 -34
View File
@@ -5,64 +5,66 @@ import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
export const registerCommandResponders = async () => {
//DELETE COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:delete",generalConfig.data.prefix,"delete"))
opendiscord.responders.commands.get("opendiscord:delete").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.delete
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:delete",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.delete,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//return when not allowed because of missing messages
if (!permsResult.isAdmin && (!generalConfig.data.system.allowCloseBeforeMessage || !generalConfig.data.system.allowCloseBeforeAdminMessage)){
const analysis = await opendiscord.transcripts.collector.ticketUserMessagesAnalysis(ticket,guild,channel)
if (analysis && !generalConfig.data.system.allowCloseBeforeMessage && analysis.totalMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
if (analysis && !generalConfig.data.system.allowCloseBeforeAdminMessage && analysis.adminMessages < 1){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:lang.getTranslation("errors.descriptions.closeBeforeAdminMessage"),customTitle:lang.getTranslation("errors.titles.noPermissions")}))
return cancel()
}
}
const reason = instance.options.getString("reason",false)
const withoutTranscript = instance.options.getBoolean("notranscript",false) ?? false
//don't allow deleteWithoutTranscript to non-global-admins when enabled
if (withoutTranscript && generalConfig.data.system.adminOnlyDeleteWithoutTranscript){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild,{allowChannelRoleScope:false,allowChannelUserScope:false,allowGlobalRoleScope:true,allowGlobalUserScope:true}))){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}
}
//start deleting ticket
await instance.defer(false)
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:delete-message").build(source,{guild,channel,user,ticket,reason}))
+12 -38
View File
@@ -10,47 +10,21 @@ export const registerCommandResponders = async () => {
//HELP COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:help",generalConfig.data.prefix,"help"))
opendiscord.responders.commands.get("opendiscord:help").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.help
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:help",0,async (instance,params,source,cancel) => {
const preferSlashOverText = generalConfig.data.system.preferSlashOverText
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.help,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//calculate slash/text mode for help menu
let mode: "slash"|"text"
if (generalConfig.data.slashCommands && generalConfig.data.textCommands){
mode = (preferSlashOverText) ? "slash" : "text"
}else if (!generalConfig.data.slashCommands) mode = "text"
if (generalConfig.data.slashCommands && generalConfig.data.textCommands) mode = (generalConfig.data.system.preferSlashOverText) ? "slash" : "text"
else if (!generalConfig.data.slashCommands) mode = "text"
else mode = "slash"
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:help-menu").build(source,{mode,page:0}))
+13 -34
View File
@@ -10,45 +10,24 @@ export const registerCommandResponders = async () => {
//MOVE COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:move",generalConfig.data.prefix,"move"))
opendiscord.responders.commands.get("opendiscord:move").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.move
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:move",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.move,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check if in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
+13 -39
View File
@@ -10,56 +10,30 @@ export const registerCommandResponders = async () => {
//PANEL COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:panel",generalConfig.data.prefix,/^panel/))
opendiscord.responders.commands.get("opendiscord:panel").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.panel
//command is disabled
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:panel",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.panel,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild || instance.channel.type == discord.ChannelType.GroupDM){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get panel data
const id = instance.options.getString("id",true)
const panel = opendiscord.panels.get(id)
if (!panel){
//invalid panel
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-panel-unknown").build(source,{guild,channel,user}))
return cancel()
}
}
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)
+15 -1
View File
@@ -44,21 +44,35 @@ export const registerCommandResponders = async () => {
}
}),
new api.ODWorker("opendiscord:pin",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.pin,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when already pinned
if (ticket.get("opendiscord:pinned").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+77
View File
@@ -0,0 +1,77 @@
///////////////////////////////////////
//PRIORITY COMMAND
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
export const registerCommandResponders = async () => {
//PRIORITY COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:priority",generalConfig.data.prefix,"priority"))
opendiscord.responders.commands.get("opendiscord:priority").workers.add([
new api.ODWorker("opendiscord:priority",0,async (instance,params,source,cancel) => {
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.priority,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//subcommands
const scope = instance.options.getSubCommand()
if (!scope || (scope != "set" && scope != "get")) return
if (scope == "set"){
const priorityName = instance.options.getString("priority",true)
const reason = instance.options.getString("reason",false)
const priority = opendiscord.priorities.getAll().find((lvl) => lvl.rawName === priorityName) ?? null
if (!priority){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,layout:"simple",error:"Please provide a valid priority level.",customTitle:"Unknown Priority Level"}))
return cancel()
}
//start changing ticket priority
await instance.defer(false)
await opendiscord.actions.get("opendiscord:update-ticket-priority").run(source,{guild,channel,user,ticket,newPriority:priority,sendMessage:false,reason})
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:priority-set").build(source,{guild,channel,user,ticket,priority,reason}))
}else if (scope == "get"){
const priority = opendiscord.priorities.getFromPriorityLevel(ticket.get("opendiscord:priority").value)
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:priority-get").build(source,{guild,channel,user,ticket,priority}))
}
}),
new api.ODWorker("opendiscord:logs",-1,(instance,params,source,cancel) => {
const scope = instance.options.getSubCommand()
opendiscord.log(instance.user.displayName+" used the 'priority "+scope+"' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
{key:"method",value:source}
])
})
])
}
+14 -34
View File
@@ -10,50 +10,30 @@ export const registerCommandResponders = async () => {
//REMOVE COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:remove",generalConfig.data.prefix,"remove"))
opendiscord.responders.commands.get("opendiscord:remove").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.remove
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:remove",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.remove,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+14 -34
View File
@@ -10,50 +10,30 @@ export const registerCommandResponders = async () => {
//RENAME COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:rename",generalConfig.data.prefix,"rename"))
opendiscord.responders.commands.get("opendiscord:rename").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.rename
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:rename",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.rename,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+15 -34
View File
@@ -10,55 +10,36 @@ export const registerCommandResponders = async () => {
//REOPEN COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:reopen",generalConfig.data.prefix,"reopen"))
opendiscord.responders.commands.get("opendiscord:reopen").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.reopen
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:reopen",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {guild,channel,user,member} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.reopen,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not closed
if (!ticket.get("opendiscord:closed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+3 -2
View File
@@ -12,13 +12,14 @@ export const registerButtonResponders = async () => {
opendiscord.responders.buttons.get("opendiscord:role-option").workers.add(
new api.ODWorker("opendiscord:role-option",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
//check is in guild/server
if (!guild){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get option
//get option data
const optionId = instance.interaction.customId.split("_")[2]
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODRoleOption)){
+26 -2
View File
@@ -57,12 +57,36 @@ export const registerCommandResponders = async () => {
}
}),
new api.ODWorker("opendiscord:stats",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
if (generalConfig.data.system.permissions.stats === "none"){
//command is disabled
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (instance.options.getSubCommand() === "reset" && !opendiscord.permissions.hasPermissions("owner",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//reset --> owner/developer role is required
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["owner","developer"]}))
return cancel()
}else{
//default permissions check
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.stats,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
}
//check is in guild/server
if (!guild){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//subcommands
const scope = instance.options.getSubCommand()
if (!scope || (scope != "global" && scope != "ticket" && scope != "user" && scope != "reset")) return
+35 -74
View File
@@ -5,53 +5,48 @@ import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
const lang = opendiscord.languages
async function checkTicketCreationPerms(instance:api.ODButtonResponderInstance|api.ODDropdownResponderInstance|api.ODModalResponderInstance|api.ODCommandResponderInstance,source:api.ODActionManagerIds_Default["opendiscord:create-ticket-permissions"]["source"],guild:discord.Guild,user:discord.User,option:api.ODTicketOption){
//check ticket permissions
const permsRes = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run(source,{guild,user,option})
if (!permsRes.valid && instance.channel){
//error
const newSource = (source === "slash" || source === "text") ? source : "other"
if (permsRes.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (permsRes.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,until:permsRes.cooldownUntil}))
else if (permsRes.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (permsRes.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (permsRes.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (permsRes.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else if (permsRes.reason == "custom") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,layout:"simple",error:permsRes.customReason ?? lang.getTranslation("errors.descriptions.unableToCreateTicket")+" `Unknown invalid_permission_reason => no reason specified by plugin`",customTitle:lang.getTranslation("errors.titles.permissionError")}))
else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(newSource,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return false
}else return true
}
export const registerCommandResponders = async () => {
//TICKET COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:ticket",generalConfig.data.prefix,/^ticket/))
opendiscord.responders.commands.get("opendiscord:ticket").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.ticket
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:ticket",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.ticket,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/server
if (!guild){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build(source,{channel:instance.channel,user:instance.user}))
return cancel()
}
//get option
//get option data
const optionId = instance.options.getString("id",true)
const option = opendiscord.options.get(optionId)
if (!option || !(option instanceof api.ODTicketOption)){
@@ -61,18 +56,7 @@ export const registerCommandResponders = async () => {
}
//check ticket permissions
const res = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run(source,{guild,user,option})
if (!res.valid){
//error
if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return cancel()
}
if (!(await checkTicketCreationPerms(instance,source,guild,user,option))) return cancel()
//start ticket creation
if (option.exists("opendiscord:questions") && option.get("opendiscord:questions").value.length > 0){
@@ -123,18 +107,7 @@ export const registerButtonResponders = async () => {
}
//check ticket permissions
const res = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run("panel-button",{guild,user,option})
if (!res.valid){
//error
if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return cancel()
}
if (!(await checkTicketCreationPerms(instance,"panel-button",guild,user,option))) return cancel()
//start ticket creation
if (option.exists("opendiscord:questions") && option.get("opendiscord:questions").value.length > 0){
@@ -178,18 +151,7 @@ export const registerDropdownResponders = async () => {
}
//check ticket permissions
const res = await opendiscord.actions.get("opendiscord:create-ticket-permissions").run("panel-dropdown",{guild,user,option})
if (!res.valid){
//error
if (res.reason == "blacklist") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-blacklisted").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user}))
else if (res.reason == "cooldown") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-cooldown").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,until:res.cooldownUntil}))
else if (res.reason == "global-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global"}))
else if (res.reason == "global-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"global-user"}))
else if (res.reason == "option-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option"}))
else if (res.reason == "option-user-limit") instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions-limits").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,limit:"option-user"}))
else instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Unknown invalid_permission reason => calculation failed #1",layout:"advanced"}))
return cancel()
}
if (!(await checkTicketCreationPerms(instance,"panel-dropdown",guild,user,option))) return cancel()
//start ticket creation
if (option.exists("opendiscord:questions") && option.get("opendiscord:questions").value.length > 0){
@@ -225,6 +187,7 @@ export const registerModalResponders = async () => {
opendiscord.responders.modals.get("opendiscord:ticket-questions").workers.add([
new api.ODWorker("opendiscord:ticket-questions",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true)
if (!channel) throw new api.ODSystemError("The 'Ticket Questions' modal requires a channel for responding!")
if (!guild){
//error
@@ -266,8 +229,6 @@ export const registerModalResponders = async () => {
})
//create ticket
await instance.defer((generalConfig.data.system.replyOnTicketCreation) ? "reply" : "update",true)
const res = await opendiscord.actions.get("opendiscord:create-ticket").run(originalSource,{guild,user,answers,option})
if (!res.channel || !res.ticket){
//error
+64
View File
@@ -0,0 +1,64 @@
///////////////////////////////////////
//TOPIC COMMAND
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
export const registerCommandResponders = async () => {
//TOPIC COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:topic",generalConfig.data.prefix,"topic"))
opendiscord.responders.commands.get("opendiscord:topic").workers.add([
new api.ODWorker("opendiscord:topic",0,async (instance,params,source,cancel) => {
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.topic,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/Server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
//subcommands
const scope = instance.options.getSubCommand()
if (!scope || (scope != "set")) return
if (scope == "set"){
const topic = instance.options.getString("topic",true)
//start changing ticket topic
await instance.defer(false)
await opendiscord.actions.get("opendiscord:update-ticket-topic").run(source,{guild,channel,user,ticket,newTopic:topic,sendMessage:false})
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:topic-set").build(source,{guild,channel,user,ticket,topic}))
}
}),
new api.ODWorker("opendiscord:logs",-1,(instance,params,source,cancel) => {
opendiscord.log(instance.user.displayName+" used the 'topic set' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
{key:"method",value:source}
])
})
])
}
+61
View File
@@ -0,0 +1,61 @@
///////////////////////////////////////
//TRANSFER COMMAND
///////////////////////////////////////
import {opendiscord, api, utilities} from "../index"
import * as discord from "discord.js"
const generalConfig = opendiscord.configs.get("opendiscord:general")
export const registerCommandResponders = async () => {
//TRANSFER COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:transfer",generalConfig.data.prefix,"transfer"))
opendiscord.responders.commands.get("opendiscord:transfer").workers.add([
new api.ODWorker("opendiscord:transfer",0,async (instance,params,source,cancel) => {
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.transfer,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/Server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
return cancel()
}
const oldCreator = await opendiscord.tickets.getTicketUser(ticket,"creator") ?? opendiscord.client.client.user
const newCreator = instance.options.getUser("user",true)
const reason = instance.options.getString("reason",false)
//start transferring ticket ownership
await instance.defer(false)
await opendiscord.actions.get("opendiscord:transfer-ticket").run(source,{guild,channel,user,ticket,reason,sendMessage:false,newCreator})
await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:transfer-message").build(source,{guild,channel,user,ticket,oldCreator,newCreator,reason}))
}),
new api.ODWorker("opendiscord:logs",-1,(instance,params,source,cancel) => {
opendiscord.log(instance.user.displayName+" used the 'transfer' command!","info",[
{key:"user",value:instance.user.username},
{key:"userid",value:instance.user.id,hidden:true},
{key:"channelid",value:instance.channel.id,hidden:true},
{key:"method",value:source}
])
})
])
}
+15 -34
View File
@@ -10,55 +10,36 @@ export const registerCommandResponders = async () => {
//UNCLAIM COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:unclaim",generalConfig.data.prefix,"unclaim"))
opendiscord.responders.commands.get("opendiscord:unclaim").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unclaim
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:unclaim",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.unclaim,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/Server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not claimed
if (!ticket.get("opendiscord:claimed").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+15 -34
View File
@@ -10,55 +10,36 @@ export const registerCommandResponders = async () => {
//UNPIN COMMAND RESPONDER
opendiscord.responders.commands.add(new api.ODCommandResponder("opendiscord:unpin",generalConfig.data.prefix,"unpin"))
opendiscord.responders.commands.get("opendiscord:unpin").workers.add([
new api.ODWorker("opendiscord:permissions",1,async (instance,params,source,cancel) => {
const permissionMode = generalConfig.data.system.permissions.unpin
if (permissionMode == "none"){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build("button",{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else if (permissionMode == "everyone") return
else if (permissionMode == "admin"){
if (!opendiscord.permissions.hasPermissions("support",await opendiscord.permissions.getPermissions(instance.user,instance.channel,instance.guild))){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:["support"]}))
return cancel()
}else return
}else{
if (!instance.guild || !instance.member){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #1",layout:"advanced"}))
return cancel()
}
const role = await opendiscord.client.fetchGuildRole(instance.guild,permissionMode)
if (!role){
//error
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,error:"Permission Error: Not in Server #2",layout:"advanced"}))
return cancel()
}
if (!role.members.has(instance.member.id)){
//no permissions
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild:instance.guild,channel:instance.channel,user:instance.user,permissions:[]}))
return cancel()
}else return
}
}),
new api.ODWorker("opendiscord:unpin",0,async (instance,params,source,cancel) => {
const {guild,channel,user} = instance
const {user,member,channel,guild} = instance
//check permissions
const permsResult = await opendiscord.permissions.checkCommandPerms(generalConfig.data.system.permissions.unpin,"support",user,member,channel,guild)
if (!permsResult.hasPerms){
if (permsResult.reason == "not-in-server") await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
else await instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-no-permissions").build(source,{guild,channel,user,permissions:["support"]}))
return cancel()
}
//check is in guild/Server
if (!guild){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-not-in-guild").build("button",{channel,user}))
return cancel()
}
//check if ticket exists
const ticket = opendiscord.tickets.get(channel.id)
if (!ticket || channel.isDMBased()){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-unknown").build("button",{guild,channel,user}))
return cancel()
}
//return when not pinned yet
if (!ticket.get("opendiscord:pinned").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error").build("button",{guild,channel,user,error:opendiscord.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"}))
return cancel()
}
//return when busy
if (ticket.get("opendiscord:busy").value){
instance.reply(await opendiscord.builders.messages.getSafe("opendiscord:error-ticket-busy").build("button",{guild,channel,user}))
+2 -1
View File
@@ -60,4 +60,5 @@ export * from "./openticket/panel"
export * from "./openticket/ticket"
export * from "./openticket/blacklist"
export * from "./openticket/transcript"
export * from "./openticket/role"
export * from "./openticket/role"
export * from "./openticket/priority"

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